环形进度条的实现方法总结和动态时钟绘制(CSS3、SVG、Canvas)
缘由:
在某一个游戏公司的笔试中,最后一道大题是,“用CSS3实现根据动态显示时间和环形进度【效果如下图所示】,且每个圆环的颜色不一样,不需要考虑IE6~8的兼容性”。当时第一想法是用SVG,因为SVG在画弧线方面是行家呀,另外Canvas也是极好的选择。但是规定了不能用SVG和Canvas,我想还可以使用CSS3的clip和rotate属性,但当时脑抽的我竟记不起clip的语法袅(囧~)。笔试结束后,便去查clip属性的使用,总结了实现环形进度条的方法,于是便有了下文。

图1:动态时钟样式
一. CSS3实现 + JS判断
看到圆环,而且不允许使用Canvas和SVG的话,大概都会想到用图片或者border-radius。但是可惜border属性并不能实现百分比边框。比较常见的做法是把标示进度的圆环切分成两半,并通过旋转半圆环和遮罩效果实现百分比进度效果。
我实现的思路:
1 . 把标示进度的圆环分成视觉上的左右两半(用CSS3的clip属性或者border-color:transparent);并用非标示进度色的半圆环遮罩住标示进度色的左半圆环。
2 . 在0~50%阶段,先把标示进度的右半圆环隐藏掉(display:none或opacity:0);左半圆环先被用非标示进度色的半圆环遮罩,当左半圆环顺时针旋转时即可视觉上显示进度色的逐数改变;
3 . 在50%~100%阶段,左半圆环停止旋转,右半圆环开始旋转,这样就能实现连贯的圆环旋转效果。另外,原本在左半圆环上方的遮罩层应隐藏,否则会遮盖住右半圆环的旋转效果;
首先实现圆环效果,代码如下:
HTML代码:
<div class="circle"><div class="track"></div><div class="left transition-rotate"></div><div class="right transition-rotate"></div><div class="mask"></div><span id="hour">0</span><span class="percent">%</span></div><input id="range" type="range" min="0" max="100" step="1" value="0">
CSS代码:
/* 进度条样式 */.circle {position: relative;width: 130px;height: 130px;text-align: center;}.circle .track, .circle .mask, .circle .left, .circle .right {width: 130px;height: 130px;position: absolute;top: 0;left: 0;border-radius: 50%;border: 20px #e7e7e7 solid;-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;}.circle .mask, .circle .left, .circle .right {clip: rect(0 65px 130px 0);}.circle .left, .circle .right {border-color: #6FEC6F;}.circle .right {opacity: 0;-webkit-transform: rotate(180deg);-moz-transform: rotate(180deg);-ms-transform: rotate(180deg);-o-transform: rotate(180deg);transform: rotate(180deg);}/* 进度显示文字样式 */.circle #hour {color: #666;font-size: 48px;line-height: 130px;}.circle .percent {font-size: 20px;color: #999;margin-left: 5px;}.transition-rotate {-webkit-transition: transform .1s ease-in-out;-moz-transition: transform .1s ease-in-out;-ms-transition: transform .1s ease-in-out;-o-transition: transform .1s ease-in-out;transition: transform .1s ease-in-out;}
JavaScript代码:
var circle = document.querySelectorAll(".circle")[0];var mask = document.querySelectorAll(".mask")[0];var left = document.querySelectorAll(".left")[0];var right = document.querySelectorAll(".right")[0];var range = document.getElementById("range");var hour = document.querySelectorAll("#hour")[0];var n;changeHour();range.oninput = changeHour;function changeHour() {hour.innerHTML = range.value;n = range.value;if(n <= 50) {left.style.webkitTransform="rotate(" + 3.6 * n + "deg)";right.style.opacity = 0;mask.style.opacity = 1;}else {right.style.opacity = 1;mask.style.opacity = 0;left.style.webkitTransform="rotate(" + 180 + "deg)";right.style.webkitTransform="rotate(" + 3.6 * n + "deg)";}}
效果如下:
二. SVG实现
SVG中路径的动态描边一般使用stroke-dasharray和stroke-dashoffset这两个属性来创建虚线,通过虚线的实线与间隔来达到视觉上的动态描边效果。
实现思路:
通过使用使stroke-dasharray的长度恰好等于圆环的周长,再通过动态设置stroke-dashoffset的大小来填充透明圆环,使视觉上成进度条样式。
代码如下:
HTML代码:
<svg id="circleProcess" xmlns="http://www.w3.org/2000/svg"><circle id="circle" cx="50%" cy="50%" r="40%" stroke-width="10%"></circle></svg><input id="range" type="range" min="0" max="255" step="1" value="0">
CSS代码:
#circleProcess {position: relative;top: 0;left: 0;width: 200px;height: 200px;stroke-dasharray: 255%;stroke-dashoffset: 255%;stroke: #6FEC6F;fill: none;-webkit-transform: rotate(-90deg);-moz-transform: rotate(-90deg);-ms-transform: rotate(-90deg);-o-transform: rotate(-90deg);transform: rotate(-90deg);}
JavaScript代码:
var circleProcess = document.getElementById("circleProcess");var circle = document.getElementById("circle");var range = document.getElementById("range");// 滑动条的值var rangeValue;range.oninput = function() {rangeValue = Number(range.value);circle.setAttribute("stroke-dashoffset", (255 - rangeValue) + "%");}
效果如下:
三. HTML5的Canvas实现
HTML5的Canvas最擅长的技能之一就是画图表。在Canvas中,可以通过arc(x1, y1, r, beginAngle, endAngle, boolean)函数来通过定义起始角度和终点角度来画出一段弧形。
HTML代码:
<canvas id="circle" width="130" height="130"></canvas><input id="range" type="range" min="0" max="360" step="1" value="0">
JavaScript代码:
var range = document.getElementById("range");var rangeValue; // 滑动条获得的是度数值var circle = document.getElementById("circle");var circleWidth = circle.width;var circleHeight = circle.height;var circleContext = circle.getContext("2d");var circleValue = {x: 65,y: 65,r: 45,beginAngle: - Math.PI / 2,endAngle: 0};// 样式circleContext.lineWidth = 20;circleContext.strokeStyle = "#6FEC6F";// 描绘进度圆环function drawCircle() {circleContext.restore();// 清空当前路径circleContext.clearRect(0,0, circleWidth, circleHeight);// 把range的度数值换成Math.PI值rangeValue = Number(range.value); // 滑动条获得的是度数值circleValue.endAngle = circleValue.beginAngle + (rangeValue / 360) * 2 * Math.PI;circleContext.beginPath();// 绘制圆弧circleContext.arc(circleValue.x, circleValue.y, circleValue.r, circleValue.beginAngle, circleValue.endAngle, false);circleContext.stroke();circleContext.save();}// 滚动条滑动动画range.oninput = drawCircle;drawCircle();
效果如下:
四. sprite图实现
sprite图实现的原理就是画好每一个关键帧的状态图片,然后通过动态改变每一帧中background的position值。这种方法比较原始,兼容性很好,而且可以花样设计,但是由于引入多个状态图,可能会导致下载量很大,而且比较臃肿。
在这里就不详细讲解啦,这么简单的你们都懂~(真相是我真不想画那么多个状态图~( ╯□╰ )~)
动态时钟绘制(CSS3、SVG、Canvas)
来为这次缘由画上顿号。
这篇教程源于笔试题中的最后一题,感觉智商被碾压了,所以归来开始思考其实现方案。题目如下:
“用CSS3实现根据动态显示时间和环形进度,且每个圆环的颜色不一样。不需要考虑IE6~8的兼容性。”效果图如上图1所示。
如下是我分别用CSS3、SVG、Canvas实现的动态时钟和环形进度实例。
1. CSS3实现的动态时钟和环形进度
2. SVG实现的动态时钟和环形进度
3. HTML5的canvas实现的动态时钟和环形进度
源码下载
1 . 环形进度条的实现(CSS3、SVG、canvas)+JS 源码包下载~
2 . 环形动态时钟绘制(CSS3、SVG、canvas)+JS 源码包下载~
环形进度条的实现方法总结和动态时钟绘制(CSS3、SVG、Canvas)的更多相关文章
- iOS带动画的环形进度条(进度条和数字同步)
本篇写的是实现环形进度条,并带动画效果,要实现这些,仅能通过自己画一个 方法直接看代码 为了方便多次调用,用继承UIView的方式 .m文件 #import <UIKit/UIKit.h> ...
- iOS 开发技巧-制作环形进度条
有几篇博客写到了怎么实现环形进度条,大多是使用Core Graph来实现,实现比较麻烦且效率略低,只是一个小小的进度条而已,我们当然是用最简单而且效率高的方式来实现. 先看一下这篇博客,博客地址:ht ...
- iOS一分钟学会环形进度条
有几篇博客写到了怎么实现环形进度条,大多是使用Core Graph来实现,实现比较麻烦且效率略低,只是一个小小的进度条而已,我们当然是用最简单而且效率高的方式来实现.先看一下这篇博客,博客地址:htt ...
- html5 canvas绘制环形进度条,环形渐变色仪表图
html5 canvas绘制环形进度条,环形渐变色仪表图 在绘制圆环前,我们需要知道canvas arc() 方 ...
- [Xcode 实际操作]四、常用控件-(12)环形进度条控件的使用
目录:[Swift]Xcode实际操作 本文将演示环形进度条控件的使用. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class Vi ...
- 仿MIUI音量变化环形进度条实现
Android中使用环形进度条的业务场景事实上蛮多的,比方下载文件的时候使用环形进度条.会给用户眼前一亮的感觉:再比方我大爱的MIUI系统,它的音量进度条就是使用环形进度条,尽显小米"为发烧 ...
- [Swift通天遁地]一、超级工具-(2)制作美观大方的环形进度条
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Canvas实现环形进度条
Canvas实现环形进度条 直接上代码: <canvas width="200" height="200" >60%</canvas> ...
- 用初中数学知识撸一个canvas环形进度条
周末好,今天给大家带来一款接地气的环形进度条组件vue-awesome-progress.近日被设计小姐姐要求实现这么一个环形进度条效果,大体由四部分组成,分别是底色圆环,进度弧,环内文字,进度圆点. ...
随机推荐
- Spring之bean一基础
在前面得博客依赖注入与控制反转中演示了应用spring实现ioc,在ApplicationContext.xml中有bean的配置,里面只是bean简单的应用.这篇主要是进一步学习使用bean. 一. ...
- poj 3431 Expedition 优先队列
poj 3431 Expedition 优先队列 题目链接: http://poj.org/problem?id=2431 思路: 优先队列.对于一段能够达到的距离,优先选择其中能够加油最多的站点,这 ...
- 关于网页授权的两种scope的区别说明
关于网页授权的两种scope的区别说明 1.以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的.用户感知的就是直接进入了回 ...
- css的padding和border问题
第一步:先跟据需求定义一个div,要求width为300px,height为300px: 第二步:给该div添加一个边框,要求实线,宽度10px,粉色: 第三步:给该div再设置20px的内边距: 我 ...
- 异常处理第三讲,SEH(结构化异常处理),异常展开问题
异常处理第三讲,SEH(结构化异常处理),异常展开问题 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 不知道昨天有木有 ...
- 团队合作-如何避免JS冲突
解决JS冲突的演化过程 1.用匿名函数将脚本包裹起来,可以有效控制全局变量,避免冲突隐患 (function(){})(): 2.定义一个全局作用域的变量str,可以帮助我们在不同匿名函数间通信 严格 ...
- Golang中的信号处理
信号类型 个平台的信号定义或许有些不同.下面列出了POSIX中定义的信号. Linux 使用34-64信号用作实时系统中. 命令 man 7 signal 提供了官方的信号介绍. 在POSIX.1-1 ...
- 分享一波eclipse常用快捷键
Eclipse快捷键 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升. 1. ctrl+shift ...
- J2EE十三个规范小结
J2ee是我们步入java学习的一个開始.它将开启这趟奇幻之旅,Java是一种简单的,跨平台的,面向对象的,分布式的.解释的.健壮的安全的.结构的中立的,可移植的.性能非常优异的多线程的,动态的语言. ...
- .NET作品集:linux下的.net mvc cms
cms程序架构 本程序是主要是用于企业网站开发的,也可以做博客程序,程序是从之前上一篇的.net 博客程序改进过来的,主要技术由webform转成.net mvc了,由于是很早之前的项目,12年还是m ...