基于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 相关文章推荐
xtree.js 代码
Mar 13 Javascript
教你使用javascript简单写一个页面模板引擎
May 05 Javascript
javascript实现方法调用与方法触发小结
Mar 26 Javascript
bootstrap paginator分页前后台用法示例
Jun 17 Javascript
详解Vue.js项目API、Router配置拆分实践
Mar 16 Javascript
微信小程序url传参写变量的方法
Aug 09 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
Dec 09 Javascript
微信小程序分享海报生成的实现方法
Dec 10 Javascript
简单了解JavaScript异步
May 23 Javascript
详解JWT token心得与使用实例
Aug 02 Javascript
vue element-ui读取pdf文件的方法
Nov 26 Javascript
移动端JS实现拖拽两种方法解析
Oct 12 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 循环删除无限分类子节点的实现代码
2013/06/21 PHP
PHP实现图片裁剪、添加水印效果代码
2014/10/01 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
thinkPHP商城公告功能开发问题分析
2016/12/01 PHP
js 判断 enter 事件
2009/02/12 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
vue-cli之router基本使用方法详解
2017/10/17 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
2020/11/04 Javascript
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
python简单线程和协程学习心得(分享)
2017/06/14 Python
python difflib模块示例讲解
2017/09/13 Python
python中join()方法介绍
2018/10/11 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
Python3.9又更新了:dict内置新功能
2020/02/28 Python
Python使用Matlab命令过程解析
2020/06/04 Python
Python学习笔记之装饰器
2020/08/06 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
天巡全球:Skyscanner Global
2017/06/20 全球购物
SQL Server提供的3种恢复模型都是什么? 有什么区别?
2012/05/13 面试题
请解释virtual关键字的含义
2015/06/17 面试题
什么是SCM(软件配置管理)
2014/08/16 面试题
摄影实习自我鉴定
2013/09/20 职场文书
技校生自我鉴定范文
2013/09/26 职场文书
致跳远运动员广播稿
2014/02/11 职场文书
Mysql基础知识点汇总
2021/05/26 MySQL