缘由:

在某一个游戏公司的笔试中,最后一道大题是,“用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代码:

 
  1. <div class="circle">
  2. <div class="track"></div>
  3. <div class="left transition-rotate"></div>
  4. <div class="right transition-rotate"></div>
  5. <div class="mask"></div>
  6. <span id="hour">0</span><span class="percent">%</span>
  7. </div>
  8. <input id="range" type="range" min="0" max="100" step="1" value="0">

CSS代码:

 
  1. /* 进度条样式 */
  2. .circle {
  3. position: relative;
  4. width: 130px;
  5. height: 130px;
  6. text-align: center;
  7. }
  8. .circle .track, .circle .mask, .circle .left, .circle .right {
  9. width: 130px;
  10. height: 130px;
  11. position: absolute;
  12. top: 0;
  13. left: 0;
  14. border-radius: 50%;
  15. border: 20px #e7e7e7 solid;
  16. -webkit-box-sizing: border-box;
  17. -moz-box-sizing: border-box;
  18. box-sizing: border-box;
  19. }
  20. .circle .mask, .circle .left, .circle .right {
  21. clip: rect(0 65px 130px 0);
  22. }
  23. .circle .left, .circle .right {
  24. border-color: #6FEC6F;
  25. }
  26. .circle .right {
  27. opacity: 0;
  28. -webkit-transform: rotate(180deg);
  29. -moz-transform: rotate(180deg);
  30. -ms-transform: rotate(180deg);
  31. -o-transform: rotate(180deg);
  32. transform: rotate(180deg);
  33. }
  34. /* 进度显示文字样式 */
  35. .circle #hour {
  36. color: #666;
  37. font-size: 48px;
  38. line-height: 130px;
  39. }
  40. .circle .percent {
  41. font-size: 20px;
  42. color: #999;
  43. margin-left: 5px;
  44. }
  45. .transition-rotate {
  46. -webkit-transition: transform .1s ease-in-out;
  47. -moz-transition: transform .1s ease-in-out;
  48. -ms-transition: transform .1s ease-in-out;
  49. -o-transition: transform .1s ease-in-out;
  50. transition: transform .1s ease-in-out;
  51. }

JavaScript代码:

 
  1. var circle = document.querySelectorAll(".circle")[0];
  2. var mask = document.querySelectorAll(".mask")[0];
  3. var left = document.querySelectorAll(".left")[0];
  4. var right = document.querySelectorAll(".right")[0];
  5. var range = document.getElementById("range");
  6. var hour = document.querySelectorAll("#hour")[0];
  7. var n;
  8. changeHour();
  9. range.oninput = changeHour;
  10. function changeHour() {
  11. hour.innerHTML = range.value;
  12. n = range.value;
  13. if(n <= 50) {
  14. left.style.webkitTransform="rotate(" + 3.6 * n + "deg)";
  15. right.style.opacity = 0;
  16. mask.style.opacity = 1;
  17. }else {
  18. right.style.opacity = 1;
  19. mask.style.opacity = 0;
  20. left.style.webkitTransform="rotate(" + 180 + "deg)";
  21. right.style.webkitTransform="rotate(" + 3.6 * n + "deg)";
  22. }
  23. }

效果如下:

在线演示请点击这里~

 

二. SVG实现

SVG中路径的动态描边一般使用stroke-dasharray和stroke-dashoffset这两个属性来创建虚线,通过虚线的实线与间隔来达到视觉上的动态描边效果。

实现思路:

通过使用使stroke-dasharray的长度恰好等于圆环的周长,再通过动态设置stroke-dashoffset的大小来填充透明圆环,使视觉上成进度条样式。

代码如下: 
HTML代码:

 
  1. <svg id="circleProcess" xmlns="http://www.w3.org/2000/svg">
  2. <circle id="circle" cx="50%" cy="50%" r="40%" stroke-width="10%"></circle>
  3. </svg>
  4. <input id="range" type="range" min="0" max="255" step="1" value="0">

CSS代码:

 
  1. #circleProcess {
  2. position: relative;
  3. top: 0;
  4. left: 0;
  5. width: 200px;
  6. height: 200px;
  7. stroke-dasharray: 255%;
  8. stroke-dashoffset: 255%;
  9. stroke: #6FEC6F;
  10. fill: none;
  11. -webkit-transform: rotate(-90deg);
  12. -moz-transform: rotate(-90deg);
  13. -ms-transform: rotate(-90deg);
  14. -o-transform: rotate(-90deg);
  15. transform: rotate(-90deg);
  16. }

JavaScript代码:

 
  1. var circleProcess = document.getElementById("circleProcess");
  2. var circle = document.getElementById("circle");
  3. var range = document.getElementById("range");
  4. // 滑动条的值
  5. var rangeValue;
  6. range.oninput = function() {
  7. rangeValue = Number(range.value);
  8. circle.setAttribute("stroke-dashoffset", (255 - rangeValue) + "%");
  9. }

效果如下:

在线演示请戳这里~

 

三. HTML5的Canvas实现

HTML5的Canvas最擅长的技能之一就是画图表。在Canvas中,可以通过arc(x1, y1, r, beginAngle, endAngle, boolean)函数来通过定义起始角度和终点角度来画出一段弧形。

HTML代码:

 
  1. <canvas id="circle" width="130" height="130"></canvas>
  2. <input id="range" type="range" min="0" max="360" step="1" value="0">

JavaScript代码:

 
  1. var range = document.getElementById("range");
  2. var rangeValue; // 滑动条获得的是度数值
  3. var circle = document.getElementById("circle");
  4. var circleWidth = circle.width;
  5. var circleHeight = circle.height;
  6. var circleContext = circle.getContext("2d");
  7. var circleValue = {
  8. x: 65,
  9. y: 65,
  10. r: 45,
  11. beginAngle: - Math.PI / 2,
  12. endAngle: 0
  13. };
  14. // 样式
  15. circleContext.lineWidth = 20;
  16. circleContext.strokeStyle = "#6FEC6F";
  17. // 描绘进度圆环
  18. function drawCircle() {
  19. circleContext.restore();
  20. // 清空当前路径
  21. circleContext.clearRect(0,0, circleWidth, circleHeight);
  22. // 把range的度数值换成Math.PI值
  23. rangeValue = Number(range.value); // 滑动条获得的是度数值
  24. circleValue.endAngle = circleValue.beginAngle + (rangeValue / 360) * 2 * Math.PI;
  25. circleContext.beginPath();
  26. // 绘制圆弧
  27. circleContext.arc(circleValue.x, circleValue.y, circleValue.r, circleValue.beginAngle, circleValue.endAngle, false);
  28. circleContext.stroke();
  29. circleContext.save();
  30. }
  31. // 滚动条滑动动画
  32. range.oninput = drawCircle;
  33. 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)的更多相关文章

  1. iOS带动画的环形进度条(进度条和数字同步)

    本篇写的是实现环形进度条,并带动画效果,要实现这些,仅能通过自己画一个 方法直接看代码 为了方便多次调用,用继承UIView的方式 .m文件 #import <UIKit/UIKit.h> ...

  2. iOS 开发技巧-制作环形进度条

    有几篇博客写到了怎么实现环形进度条,大多是使用Core Graph来实现,实现比较麻烦且效率略低,只是一个小小的进度条而已,我们当然是用最简单而且效率高的方式来实现. 先看一下这篇博客,博客地址:ht ...

  3. iOS一分钟学会环形进度条

    有几篇博客写到了怎么实现环形进度条,大多是使用Core Graph来实现,实现比较麻烦且效率略低,只是一个小小的进度条而已,我们当然是用最简单而且效率高的方式来实现.先看一下这篇博客,博客地址:htt ...

  4. html5 canvas绘制环形进度条,环形渐变色仪表图

    html5 canvas绘制环形进度条,环形渐变色仪表图                                             在绘制圆环前,我们需要知道canvas arc() 方 ...

  5. [Xcode 实际操作]四、常用控件-(12)环形进度条控件的使用

    目录:[Swift]Xcode实际操作 本文将演示环形进度条控件的使用. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class Vi ...

  6. 仿MIUI音量变化环形进度条实现

    Android中使用环形进度条的业务场景事实上蛮多的,比方下载文件的时候使用环形进度条.会给用户眼前一亮的感觉:再比方我大爱的MIUI系统,它的音量进度条就是使用环形进度条,尽显小米"为发烧 ...

  7. [Swift通天遁地]一、超级工具-(2)制作美观大方的环形进度条

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. Canvas实现环形进度条

    Canvas实现环形进度条 直接上代码: <canvas width="200" height="200" >60%</canvas> ...

  9. 用初中数学知识撸一个canvas环形进度条

    周末好,今天给大家带来一款接地气的环形进度条组件vue-awesome-progress.近日被设计小姐姐要求实现这么一个环形进度条效果,大体由四部分组成,分别是底色圆环,进度弧,环内文字,进度圆点. ...

随机推荐

  1. QTP日期格式化

    '以下函数将日期参数进行格式转化,例如:2017-01-02 Function ShortDateToLongDate(strChangeDate)    b=split(strChangeDate, ...

  2. CCF-201604-3-路径解析

    问题描述 试题编号: 201604-3 试题名称: 路径解析 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 在操作系统中,数据通常以文件的形式存储在文件系统中.文件系统一般采 ...

  3. OGNL简介

    OGNL 一:OGNL简介 OGNL的全称是Object  Graph  Navigation  Language即对象导航语音.它是一个开源项目,工作在视图层,用来取代页面中的java脚本.简化数据 ...

  4. 洛谷 P3927 Factorial

    题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SOL菌表示不服,立刻就要算这个数在k进制表示下末尾0的个数. 但是SOL菌太菜了于是请 ...

  5. extjs 关于dom操作的几个库

    经过几天的学习研究,发现ext与jquery的设计思路完全是来自两个方向. jquery是内聚,把所有东西都放在$的下面,而ext是采用分模块的设计思路,每个功能封装一个库.这样就形成了各自的实用风格 ...

  6. itextpdf添加非自带字体(例如微软雅黑)

    找到需要的字体,例如 在windows系统中找到需要字体,本例使用微软雅黑,使用C:\\Windows\\Fonts\\msyh.ttf. 代码如下: /** * 创建pdf,使用微软雅黑字体 * * ...

  7. check the manual that corresponds to your MySQL server version for the right syntax处理方案

    check the manual that corresponds to your MySQL server version for the right syntax:代码出现这样的bug,就要注意你 ...

  8. dubbo2.5.6从下载到编译成功并且部署成功过程

    本文基于dubbo2.5.6版本 原文链接:http://www.cnblogs.com/zhuwenjoyce/       1,下载dubbo 首先从 github 下载源代码并阅读 readme ...

  9. 《ActiveMQ in Action》【PDF】下载

    内容介绍TheApache ActiveMQ message broker is an open source implementation ofthe Java Message Service sp ...

  10. JS中数组的迭代方法和归并方法

    昨天总结的JavaScript中的数组Array方法 数组的迭代方法 ES5中为数组定义了5个迭代方法.每个方法都要接收两个参数:要在每一项上面运行的函数和(可选的)运行该函数的作用域对象---影响t ...