环形效果

简介: 环形效果是不是相当的诱人,首先看几个例子:1、colorful-clock  --- 漂亮2、CSS3+js实现多彩炫酷旋转圆环时钟效果  --- very good3、Percentage Loader  --- 帅colorful-clock效果图如下:有没有更刺激的,接下来见证奇迹的时刻,如下图(精致):在此之前,在回顾下前两个例子:1、时钟效果_raphael.

环形效果是不是相当的诱人,首先看几个例子:
1、colorful-clock  --- 漂亮
2、CSS3+js实现多彩炫酷旋转圆环时钟效果  --- very good
3、Percentage Loader  --- 帅

colorful-clock效果图如下:



有没有更刺激的,接下来见证奇迹的时刻,如下图(精致):



在此之前,在回顾下前两个例子:
1、时钟效果_raphael.js
2、幸运大抽奖



实现原理:
第一步:构造圆环

r.customAttributes.arc = function(value, total, R) {
    var alpha = 360 / total * value,
        a = (90 - alpha) * Math.PI / 180,
        x = 150 + R * Math.cos(a),
        y = 150 - R * Math.sin(a),
        path;
    if (total == value) {
        path = [
            ["M", 150, 150 - R],
            ["A", R, R, 0, 1, 1, 149.99, 150 - R]
        ];
    } else {
        path = [
            ["M", 150, 150 - R],
            ["A", R, R, 0, +(alpha > 180), 1, x, y]
        ];
    }
    bpath = path;
    return {
        path: path
    };
};
r.path().attr({
    arc: [100, 100, rad],
    'stroke-width': 20,
    'stroke': "#cecece"
});


第二步:环形动起来和事件绑定

function updateVal(value, total, R, hand, id) { 
    if (init) {
        hand.animate({
            arc: [value, total, R]
        }, 900, ">");
    } else {
        if (!value || value == total) {
            value = total;
            hand.animate({
                arc: [value, total, R]
            }, 750, "bounce", function() {
                hand.attr({
                    arc: [0, total, R]
                });
            });
        } else {
            hand.animate({
                arc: [value, total, R]
            }, 750, "elastic");
        }
    }
};
z.mouseover(function() {
    this.animate({
        'stroke-width': 36,
        opacity: 0.75
    }, 600, 'elastic');
}).mouseout(function() {
    this.stop().animate({
        'stroke-width': 26,
        opacity: 1
    }, speed * 4, 'elastic');
});


第三步:倒计时

function dinit() {
    if (tmptime > 0) {
        ds = parseInt(tmptime % 60);
        dm = parseInt(tmptime / 60) % 60;
        dh = parseInt(tmptime / 3600) % 24;

        txt.remove();
        txt = r.text(150, 150, dh + ":" + dm + ":" + ds).attr({
            font: "100 36px Arial",
            fill: opts.color
        });
    }
};

function playing() {
    dstop = setInterval(function() {
        tmptime--;
        if (tmptime <= 1) { !! opts.endSucc && opts.endSucc();
            clearInterval(dstop);
        } else {
            dinit();
        }
    }, 1000);
};


搞定,大功告成。感兴趣的可以动手试试,写更fashion的效果,期待你的见证。



参考:
polar-clock
CSS3+JS动态圆形图例jquery代码



DEMO:

<!doctype html> <html lang="cn"> <head> <meta charset="UTF-8"> <title>环形</title> <style> *{margin:0px;padding: 0px;} body{padding: 0px 0px 300px;} .main{width: 960px; margin: 0px auto;overflow: hidden;} .mainTit{color: #f00; font-size: 50px;font-weight:bold;text-align: center; text-shadow: 3px 1px 6px #f60; padding: 10px 0px;} .mainBlock{overflow: hidden;} .main .block{float: left; width: 300px; height: 300px; margin: 0px 10px; overflow: hidden;} .main .block div{width: 100%; height: 100%; } .main .remark{color: #333;font-size: 12px; text-align: center; margin-top: 10px;} </style> </head> <body> <div class="main"> <div class="mainTit">环形</div> <div class="mainBlock"> <div class="block"><div id="test1"></div></div> <div class="block"><div id="test2"></div></div> <div class="block"><div id="test3"></div></div> <div class="block"><div id="test4"></div></div> <div class="block"><div id="test5"></div></div> <div class="block"><div id="test6"></div></div> </div> </div> <script src="http://files.cnblogs.com/kuikui/jquery-1.10.2.min.js"></script> <script src="http://files.cnblogs.com/kuikui/raphael.js"></script> <script type="text/javascript"> (function($) { $.drawCircle = function(options) { var defaults = { elem: null, size: 0, start: null, end: null, endSucc: null }; var opts = $.extend({}, defaults, options); if (!opts.elem) { return; } var r = Raphael(opts.elem, 300, 300), rad = 80, init = true, speed = 200, z = null, txt = null; var tmptime = opts.end - opts.start, ds = null, dm = null, dh = null, dstop = null; if (opts.size === 0) { opts.color = "#cecece"; } else { opts.color = getColor(opts.size) || "#000000"; } function minit() { r.customAttributes.arc = function(value, total, R) { var alpha = 360 / total * value, a = (90 - alpha) * Math.PI / 180, x = 150 + R * Math.cos(a), y = 150 - R * Math.sin(a), path; if (total == value) { path = [ ["M", 150, 150 - R], ["A", R, R, 0, 1, 1, 149.99, 150 - R] ]; } else { path = [ ["M", 150, 150 - R], ["A", R, R, 0, +(alpha > 180), 1, x, y] ]; } bpath = path; return { path: path }; }; r.path().attr({ arc: [100, 100, rad], 'stroke-width': 20, 'stroke': "#cecece" }); r.path().attr({ arc: [100, 100, 110], 'stroke-width': 2, 'stroke': "#cecece" }); if(!!opts.size){ z = r.path().attr({ arc: [0.01, 100, rad], 'stroke-width': 20, 'stroke': opts.color, 'cursor': "pointer" }); updateVal(opts.size, 100, 80, z, 2); } var circle = r.circle(150, 150, 70); circle.attr("fill", "#fff"); circle.attr("stroke", "none"); circle.glow({ width: 8, opacity: 0.3, offsety: 4 }); txt = r.text(150, 150, opts.size + "%").attr({ font: "100 36px Arial", fill: opts.color }); }; function dinit() { if (tmptime > 0) { ds = parseInt(tmptime % 60); dm = parseInt(tmptime / 60) % 60; dh = parseInt(tmptime / 3600) % 24; txt.remove(); txt = r.text(150, 150, dh + ":" + dm + ":" + ds).attr({ font: "100 36px Arial", fill: opts.color }); // txt.toFront(); } }; function playing() { dstop = setInterval(function() { tmptime--; if (tmptime <= 1) { !! opts.endSucc && opts.endSucc(); clearInterval(dstop); } else { dinit(); } }, 1000); }; function getColor(size) { var arr = []; for (var i = 0; i <= 255; i++) { arr.push("rgb(" + i + "," + (255 - i) + ","+0+")"); } return arr[parseInt(size * 2.55)]; }; function updateVal(value, total, R, hand, id) { if (init) { hand.animate({ arc: [value, total, R] }, 900, ">"); } else { if (!value || value == total) { value = total; hand.animate({ arc: [value, total, R] }, 750, "bounce", function() { hand.attr({ arc: [0, total, R] }); }); } else { hand.animate({ arc: [value, total, R] }, 750, "elastic"); } } }; function mevents() { if(!!opts.size){ z.mouseover(function() { this.animate({ 'stroke-width': 36, opacity: 0.75 }, 600, 'elastic'); //txt.toFront(); }).mouseout(function() { this.stop().animate({ 'stroke-width': 26, opacity: 1 }, speed * 4, 'elastic'); }); } }; minit(); dinit(); playing(); mevents(); }; })(jQuery); $(function() { $.drawCircle({ elem: "test1", size: 0, start: 0, end: 6600 }); $.drawCircle({ elem: "test2", size: 0 }); $.drawCircle({ elem: "test3", size: 25 }); $.drawCircle({ elem: "test4", size: 55 }); $.drawCircle({ elem: "test5", size: 85 }); $.drawCircle({ elem: "test6", size: 100 }); }); </script> </body> </html>

目录
相关文章
|
消息中间件 关系型数据库 Kafka
OBCP第七章 OB迁移、备份与恢复-迁移服务
OBCP第七章 OB迁移、备份与恢复-迁移服务
372 0
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
297 11
|
分布式计算 运维 大数据
使用EMR Serverless Spark后的心得
EMR Serverless Spark产品待改进点包括:增强自动化运维的定制性,加强数据安全措施,集成高级分析(如ML/DL),优化性能建议,深化生态集成,及提高成本透明度,以提升用户体验和市场竞争力。
|
存储 安全 编译器
C++11(列表初始化,声明,范围for)
C++11(列表初始化,声明,范围for)
120 0
|
2天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
256 116
|
17天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
11天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
651 221