分别用canvas和css3的transform做出钟表的效果
两种方式实际上在js上的原理都是一样的。都是获取时间对象,再获取时间对象的时分秒,时分秒乘以其旋转一刻度(一秒、一分、一小时)对应的角度。css3中要赋值于transform:rotate(角度),canvas中要注意的是 arc旋转的不是角度而是弧度,所以要进行转换。最后开一个一秒变化一次的定时器,让函数每秒走一次,就实现了钟表的效果。
1、canvas下的钟表设计
首先就是html布局,canvas的布局很简单
<canvas style="background-color:#ccc;" width="500px" height="500px" id="canvas1"></canvas>
背景色设为#ccc是为了区别浏览器底色与画布底色
下来就是js,先把基本的canvas套路写出来
var oC=document.getElementById('canvas1');
var oCG=oC.getContext('2d');
当然要在window.onload下执行。
在画钟表之前先获取
var oDate=new Date();
var oSecs=oDate.getSeconds();
var oMins=oDate.getMinutes()+oSecs/60;
var oHours=oDate.getHours()+oMins/60;
var oSecsValue=(oSecs*6-90)*Math.PI/180;
var oMinsValue=(oMins*6-90)*Math.PI/180;
var oHoursValue=(oHours*30-90)*Math.PI/180;
}
为什么后三句都要减90,附一张图大家就懂了,因为arc画圆,起始点时从右边0处开始,而时钟是从上边-90开始,所以要-90,+oSecs/60和+oMins/60是为了让秒钟走的时候时钟也跟着走秒钟走到30秒,分钟多走半个格子。分钟走了30分,时钟多走半个格子。 弧度=角度*Math.PI/180
下来就是画时钟了
function time(){
//构建时钟的最小间隔60个
oCG.beginPath();
for(var i=0;i<60;i++){
oCG.moveTo(250,250);//移画布中心到250,250
oCG.arc(250,250,200,6*i*Math.PI/180,6*(i+1)*Math.PI/180,false);
};
oCG.closePath();
oCG.stroke();
//建一个覆盖于最小间隔的遮罩层,半径比它小
oCG.beginPath();
oCG.arc(250,250,180,0,360*Math.PI/180,false);
oCG.fillStyle='#ccc';
oCG.closePath();
oCG.fill(); //构建小时间隔12个
oCG.beginPath();
for(var i=0;i<12;i++){
oCG.moveTo(250,250);//移画布中心到250,250
oCG.arc(250,250,200,30*i*Math.PI/180,30*(i+1)*Math.PI/180,false);
oCG.lineWidth='5';
};
oCG.closePath();
oCG.stroke();
//再做一个遮罩层,目的是让小时的线长一点
oCG.beginPath();
oCG.arc(250,250,160,0,360*Math.PI/180,false);
oCG.fillStyle='#ccc';
oCG.closePath();
oCG.fill(); //时针的做法
oCG.beginPath();
oCG.moveTo(250,250);//移画布中心到250,250
oCG.arc(250,250,100,oHoursValue,oHoursValue,false);
oCG.lineWidth=8;
oCG.closePath();
oCG.stroke();
//分针的做法
oCG.beginPath();
oCG.moveTo(250,250);//移画布中心到250,250
oCG.arc(250,250,180,oMinsValue,oMinsValue,false);
oCG.lineWidth=5;
oCG.closePath();
oCG.stroke();
//秒针的做法
oCG.beginPath();
oCG.moveTo(250,250);//移画布中心到250,250
oCG.arc(250,250,180,oSecsValue,oSecsValue,false);
oCG.lineWidth=3;
oCG.closePath();
oCG.stroke();
}
window.onload=function(){
setInterval(function(){
oCG.clearRect(0,0,oC.offsetWidth,oC.offsetHeight);
time();
},1000)
}
clearRect(0,0,oC.offsetWidth,oC.offsetHeight),这句话的意思就是每走1秒,清除上一秒画布里面的所有东西。必须要有这句话。
canvas做的时钟
<div id="box">
<ul id="list">
<!--<li></li>-->
<!--<li></li>-->
<!--<li></li>-->
<!--<li></li>-->
<!--<li></li>-->
<!--<li></li>-->
<!--<li></li>-->
</ul>
<div id="hour"></div>
<div id="min"></div>
<div id="sec"></div>
<div id="point"></div>
</div>
css,注意的是li标签元素变换的起点 横坐标是中心,纵坐标是距离其父标签99px,表的指针旋转起来,元素变换的起点是,横坐div底部,纵坐标div中心
<style id="css">
#box{width:200px;height:200px; border:1px solid black;-webkit-border-radius: 50%;margin:200px auto;position: relative;}
*{margin:;padding:}
#box ul{margin:;padding:;height: 200px;position: relative;list-style: none;}
#box ul li{width: 2px;height: 7px;position: absolute;background-color: #000; left:99px; top:;-webkit-transform-origin:center 99px;}
/*#box ul li:nth-of-type(1){-webkit-transform:rotate(6deg)}*/
/*#box ul li:nth-of-type(2){-webkit-transform:rotate(12deg)}*/
/*#box ul li:nth-of-type(3){-webkit-transform:rotate(18deg)}*/
/*#box ul li:nth-of-type(4){-webkit-transform:rotate(24deg)}*/
/*#box ul li:nth-of-type(5){-webkit-transform:rotate(30deg)}*/
/*#box ul li:nth-of-type(6){-webkit-transform:rotate(36deg)}*/
/*#box ul li:nth-of-type(7){-webkit-transform:rotate(42deg)}*/
#box ul li:nth-of-type(5n+1){height: 15px} //保证第一个刻度的长度要长一点
#hour{width:6px;height: 45px; background-color:#000;position: absolute;left: 97px;top:55px;-webkit-transform-origin:bottom }
#min {width:4px;height: 65px; background-color:gray;position: absolute;left: 97px;top:35px;-webkit-transform-origin:bottom }
#sec {width:3px;height: 80px; background-color:red;position: absolute;left: 95px;top:20px;-webkit-transform-origin:bottom}
#point{width: 15px ;height:15px;background-color: black;border-radius: 50%;position: absolute;left: 95px;top: 95px}
</style>
css写好js其实还是很好写的
var oList=document.getElementById('list');
var aLi='';
var aCss='';
var oCss=document.getElementById('css');
var oHour=document.getElementById('hour');
var oMin=document.getElementById('min');
var oSec=document.getElementById('sec');
for(var i=0;i<60;i++){
aLi+='<li></li>';
aCss+='#box ul li:nth-of-type('+(i+1)+'){-webkit-transform:rotate('+6*i+'deg)}'
}
oList.innerHTML=aLi;
oCss.innerHTML+=aCss;
构建新的60li标签,让其插入到ul里面。新的60个li标签的css的样式插入到style中。
把时钟指针旋转的角度附给transform:rotate
function toTime(){
var iDate=new Date();
var iSec=iDate.getSeconds();
var iMin=iDate.getMinutes()+iSec/60;
var iHour=iDate.getHours()+iMin/60;
oSec.style.webkitTransform='rotate('+iSec*6+'deg)';
oMin.style.webkitTransform='rotate('+iMin*6+'deg)';
oHour.style.webkitTransform='rotate('+iHour*30+'deg)';
}
定时器走起来
toTime();
setInterval(toTime,1000);
css3做的时钟
总结:
canvas是我年前做的,css这个是我今天做的。刚好看见了,就准备发个博客对比一下两者的区别。最终发现,两者并没有太大区别,核心原理上的还是一样的。小伙伴们快看看吧。
分别用canvas和css3的transform做出钟表的效果的更多相关文章
- 实用CSS3的transform实现多种动画效果
查看效果:http://keleyi.com/a/bjad/b6x9q8gs.htm 以下是代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4. ...
- HTML5之CSS3 3D transform 剖析式学习之一
最近坐地铁发现“亚洲动物基金”在地铁上做了很多公益广告,比较吸引人的是一个月熊的广告.做的很可爱.回去就搜了一下,发现这个网站是HTML5做的,非常炫. 所以想学习一下,方法就是传统的学习办法,模仿. ...
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate) 在CSS3中,可以利用transform功能来实现文字或图像的旋转.缩放.倾 ...
- 用CSS3的transform来做一个立方体
有一次上数据结构课老师布置了一个用队列的思想通过js和Html来做一个“跳舞配对”的网页,当时那个跳舞的部分用了css3里面transform的相关属性做了个个让图片无限翻转的效果,可能正是由于这个效 ...
- 好吧,CSS3 3D transform变换,不过如此!
一.写在前面的秋裤 早在去年的去年,我就大肆介绍了2D transform相关内容.看过海贼王的都知道,带D的家伙都不是好惹的,2D我辈尚可以应付,3D的话,呵呵,估计我等早就在千里之外被其霸气震晕了 ...
- css3 变形(transform)、转换(transition)和动画(animation)
http://www.w3cplus.com/content/css3-transform/ 在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动tr ...
- CSS3 2D Transform
在 一个二维或三维空间,元素可以被扭曲.移位或旋转.只不过2D变形工作在X轴和Y轴,也就是大家常说的水平轴和垂直轴:而3D变形工作在X轴和Y轴之外, 还有一个Z轴.这些3D变换不仅可以定义元素的长度和 ...
- CSS3 3D Transform
CSS3 3D Transform 原文:http://www.w3cplus.com/css3/css3-3d-transform.html 三维变换使用基于二维变换的相同属性,如果您熟悉二维变换, ...
- css3之transform的应用
一.利用transform实现图片额外显示 效果图如下 初始状态:
随机推荐
- sizeof的用法 2007-12-19 11:06
sizeof的作用是什么?sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数.其返回值类型为size_t,在头文件stddef.h中定义 ...
- 使用css设置边框背景图片
使用css的特有属性,给不同的盒子添加边框图片. 为什么会有这一场景呢.因为,UI给我们前端的边框图片可能未必适合我们当前的内容. 这里我们主要使用到的属性有: border-image-source ...
- Windows中使用PowerShell查看和卸载补丁
查看:get-hotfix -id KB4470788 卸载:wusa /uninstall /kb:3045999 get-hotfix -id KB4470788 wusa /uninstall ...
- 玩转Spring——Spring事务
事务的概念:多个sql 操作 要么都成功 要么都失败 ACID特性:原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生.一致性(Consisten ...
- Dockerfile文件万字全面解析
阅读目录 目录 阅读目录 用法 格式 Parser directives escape 环境替换 .dockerignore file FROM RUN CMD LABEL MAINTAINER EX ...
- 图解 K8s 核心概念和术语
我第一次接触容器编排调度工具是 Docker 自家的 Docker Swarm,主要解决当时公司内部业务项目部署繁琐的问题,我记得当时项目实现容器化之后,花在项目部署运维的时间大大减少了,当时觉得这玩 ...
- 解Bug之路-dubbo应用无法重连zookeeper
前言 dubbo是一个成熟且被广泛运用的框架.饶是如此,在某些极端条件下基于dubbo的应用还会出现无法重连zookeeper的问题.由于此问题容易导致比较大的故障,所以笔者费了一番功夫去定位,现将排 ...
- py_正则表达式练习
正则表达式: #正则表达式 #键盘数字6上的符号,^表示行的开始,$ 表示行的结束 #test = "tm queal Tomorrow Moon" ''' ^tm #匹配tm开头 ...
- 性能提升40%: 腾讯 TKE 用 eBPF 绕过 conntrack 优化 K8s Service
Kubernetes Service 用于实现集群中业务之间的互相调用和负载均衡,目前社区的实现主要有userspace,iptables和IPVS三种模式.IPVS模式的性能最好,但依然有优化的空间 ...
- .Net 单元测试框架xUnit使用
使用前需要导入下面的NuGet包:(不然可能会导致测试代码无法运行) .net版本 .net core3.1 Moq这个包只有需要Mock的时候才需要导入(不清楚Mock的话可以留言或自行百度) 开始 ...