基于D3.js实现时钟效果


Posted in Javascript onJuly 17, 2018

今天做了一个小时钟动画,因为学习canvas也做过一个时钟,所以想着可不可以使用d3来做个时钟动画。

主要利用的还是饼图这个布局,添加了一个圆形颜色渐变的效果。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>时钟</title>
</head>
<body>
 
 <script type="text/javascript" src='../../../js/d3.js'></script>
 <script type="text/javascript">
 
 var width = 500,
 height = 500;
 var svg = d3.select('body').append("svg").attr("width", width).attr("height", height);
 var innerRadius = 190, //圆的内半径、外半径
 outerRadius = 200; 
 var arc = d3.svg.arc() //弧生成器
 .innerRadius(innerRadius) //设置内半径、0则为实心圆
 .outerRadius(outerRadius); //设置外半径
 
 //下面的数组的作用是这样的:
 //首先我的圆的颜色渐变的,而我的渐变方法是将圆切割成很多份,每份是渐变过程中的一个颜色。
 //当切割的份数多的时候就是看起来像渐变的一样。 
 //下面的时针、分针、秒针也会在指着不同的角度的时候同时改变自身的颜色。
 //当然也看到了其他的圆渐变的方法,你可以自己搜索。
 var sum = 1000; //sum代表圆被分成了多少份。 
 var num = new Array(); 
 for (var i = 0; i < sum; i++) {
 num.push(1);
 }
 var linear = d3.scale.linear() //通过线性比例尺来计算插值。
 .domain([0, sum])
 .range([0, 1])
 var arcs = svg.selectAll("g")
 .data(d3.layout.pie()(num)) //绑定转换后的数据piedata
 .enter()
 .append("g")
 .attr("transform", "translate(" + (width / 2) + "," + (height / 2) + ")");
 
 var color = d3.scale.category10()
 var a = d3.rgb(0, 255, 255); //红色 设置渐变颜色的起始
 var b = d3.rgb(255, 255, 0); //绿色
 var c = d3.rgb(255, 0, 0);
 var compute = d3.interpolate(a, b); //他的值是介于0-1的
 
 
 arcs.append("path")
 .attr('fill', function(d, i) {
 return compute(linear(i)); //通过上面的linear比例函数看i当前是在多少。当然也可以直接(1/sum*i)
 })
 .attr('stroke-width', "0")
 .attr("d", function(d) {
 return arc(d); //使用弧生成器
 });
 
 //下面是给将圆给分成了60等份
 var num2 = new Array();
 for (var i = 0; i < 60; i++) num2.push(i);
 var ticks = svg.append('g').selectAll('g')
 .data(num2)
 .enter()
 .append('g')
 .attr("transform", "translate(" + (width / 2) + "," + (height / 2) + ")")
 ;
 
 ticks.append("line")
   .attr("x1", 1)
   .attr("x1", 0)
   .attr("x2", function(d,i){
    return i%15==0?10:6; //添加圆内的刻度线 根据是不是3、6、9、12来判断是否加长
   })
   .attr("y2", 0)
   .attr('transform',function(d,i){
    
    return "rotate(" + (6*i -90) + ")" 
      + "translate(" + (innerRadius-10) +")";
   })
   .style('stroke',function(d,i){
    return compute(i/60);
   })
   .style('stroke-width',5); 
 
 ticks.append("text")
 .attr('transform', function(d, i) {
 var angle = (Math.PI * 2) / 60 * i - Math.PI;
 return "translate(" + (Math.sin(angle) * (innerRadius - 20) ) + "," + (Math.cos(angle) * (innerRadius - 20) )+ ")";
 })
 .attr("x", 8)
 .attr("dy", ".35em")
 .style('font-size', function(d, i) {
 if (i % 15 == 0)
  return "2em"
 })
 .style("text-anchor", function(d) {
 return i > 29 ? "end" : null;
 })
 .text(function(d, i) {
 return !(i % 5) ? (60 - i) / 5 : null;
 });
 
 var arc2 = d3.svg.arc().innerRadius(0).outerRadius(10);
 
 svg.selectAll('g')
 .data(d3.layout.pie()(num))
 .enter()
 .append('g')
 arcs.append("path")
 .attr('fill', function(d, i) {
 return compute(linear(i))
 })
 .attr("d", function(d, i) {
 return arc2(d);
 });
 
 var SecondsLine = svg.append('g').append('line')
 .attr("x1", width / 2)
 .attr("y1", height / 2)
 .style('stroke-width', 1)
 
 
 var MinutesLine = svg.append('g').append('line')
 .attr('x1', width / 2)
 .attr('y1', height / 2)
 .style('stroke-width', 3)
 
 var HoursLine = svg.append('g').append('line')
 .attr('x1', width / 2)
 .attr('y1', height / 2)
 .style('stroke-width', 5);
 
 var str=[1];
 var updatetimetext=svg.append('g')
 .selectAll('.timetext').data(str)
 .enter()
 .append('text')
 .attr('class', 'timetext')
 .text(function(d, i) {
  return d;
 })
 .attr('transform', function(d, i) {
  return "translate(" + (width / 2) + "," + (height - 20) + ")"
 })
 .style('text-anchor', "middle")
 .style('font-size', "2em");
 function chuli() {
 var d = new Date();
 var dm = d.getTime() % 1000;
 var h = (d.getHours() >= 12 ? d.getHours() - 12 : d.getHours());
 var m = d.getMinutes();
 var s = d.getSeconds();
 var angle = (Math.PI * 2) / 60 * (60 - s) + Math.PI;
 var angle2 = (Math.PI * 2) / (60 * 60) * ((60 * 60 - m * 60-s)) + Math.PI;
 var angle3 = (Math.PI * 2) / (12 * 60 * 60) * (12 * 60 * 60 - h * 60 * 60 - m * 60 - s) + Math.PI;
 SecondsLine.attr('x2', function(d, i) {
  return width / 2 + (innerRadius - 30) * Math.sin(angle);
 })
 .attr('y2', function(d, i) {
  return height / 2 + (innerRadius - 30) * Math.cos(angle);
 })
 .style('stroke', compute((s / 60)));
 
 MinutesLine.attr('x2', function(d, i) {
  return width / 2 + (innerRadius - 50) * Math.sin(angle2);
 })
 .attr('y2', function(d, i) {
  return height / 2 + (innerRadius - 50) * Math.cos(angle2);
 })
 .style('stroke', compute((m / 60)));
 
 HoursLine.attr('x2', function(d, i) {
  return width / 2 + (innerRadius - 80) * Math.sin(angle3);
 })
 .attr('y2', function(d, i) {
  return height / 2 + (innerRadius - 80) * Math.cos(angle3);
 })
 .style('stroke', compute((h / 12)));
 
 str.pop();    //删除上一个文本
 str.push(d.getHours()+":"+(m<10?"0"+m:m)+":"+(s<10?"0"+s:s)); //存入新的时间并且一位数时补0
 updatetimetext.data(str).text(function(d){return d;}) //更新时间
  
 
 
 setTimeout(chuli, 1000 - dm);//获取当前的毫秒,用1000减去,则是到下一秒的毫秒时间。
 }
 chuli();
 
 </script>
</body>
</html>

效果图:

基于D3.js实现时钟效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript判断单选框或复选框是否选中方法集锦
Apr 04 Javascript
查看图片(前进后退)功能实现js代码
Apr 24 Javascript
js获取input标签的输入值实现代码
Aug 05 Javascript
JS中的构造函数详细解析
Mar 10 Javascript
JavaScript中的console.log()函数详细介绍
Dec 29 Javascript
javascript使用smipleChart实现简单图表
Jan 02 Javascript
使用javascript实现监控视频播放并打印日志
Jan 05 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
Jan 19 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
Jan 02 Javascript
js中null与空字符串&quot;&quot;的区别讲解
Jan 17 Javascript
ES6 Set结构的应用实例分析
Jun 26 Javascript
谈谈node.js中的模块系统
Sep 01 Javascript
vue生成token并保存到本地存储中
Jul 17 #Javascript
vue脚手架搭建项目的兼容性配置详解
Jul 17 #Javascript
使用svg实现动态时钟效果
Jul 17 #Javascript
详解.vue文件中style标签的几个标识符
Jul 17 #Javascript
webstrom Debug 调试vue项目的方法步骤
Jul 17 #Javascript
vue实现未登录跳转到登录页面的方法
Jul 17 #Javascript
打通前后端构建一个Vue+Express的开发环境
Jul 17 #Javascript
You might like
php中用数组的方法设置cookies
2011/04/21 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
有效提高JavaScript执行效率的几点知识
2015/01/31 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
对于Python装饰器使用的一些建议
2015/06/03 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
python去重,一个由dict组成的list的去重示例
2019/01/21 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
python函数不定长参数使用方法解析
2019/12/14 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
python定义具名元组实例操作
2021/02/28 Python
纯css3实现的竖形无限级导航
2014/12/10 HTML / CSS
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
简历中求职的个人自我评价
2013/12/03 职场文书
职业培训师职业生涯规划
2014/02/18 职场文书
机工车间主任岗位职责
2014/03/05 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
加入学生会自荐书
2015/03/05 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
教师聘用意向书
2015/05/11 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技