<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>标题</title>
<meta name="keywords" content="">
<meta name="description" content="">
<style>
*{margin:0; padding:0; list-style:none;}
.box{
width: 420px;
height: 420px;
margin: 50px auto 0;
}
#cvs{
background: #B1A6BE;
}
</style>
</head>
<body> <div class="box">
<canvas id="cvs" width="420" height="420"></canvas>
</div> <script>
var cvs=document.getElementById('cvs');
var ctx=cvs.getContext('2d');
clock();
setInterval(clock,1000);
function clock(){
var img=document.createElement('img');
img.src='01.jpg';
//时钟背景图
// img.onload=function (){
ctx.beginPath();
ctx.drawImage(img,0,0,420,420);
ctx.closePath();
// }
//时钟外圆
ctx.beginPath();
ctx.arc(210,210,200,0,2*Math.PI,true);
ctx.strokeStyle='#60D9F8';
ctx.lineWidth=10;
ctx.stroke();
ctx.clip();
ctx.closePath(); //分刻度 360/60=6
for (var i = 0; i < 60; i++) {
ctx.save();//保存状态
ctx.beginPath();
ctx.translate(210,210);
ctx.rotate(i*6*Math.PI/180);
ctx.strokeStyle='#FEF319';
ctx.lineWidth=5;
ctx.moveTo(0,-185);
ctx.lineTo(0,-195);
ctx.stroke();
ctx.closePath();
ctx.restore();//恢复之前保存的状态
}; //时刻度 360/12=30
for (var i = 0; i < 12; i++) {
ctx.save();//保存状态
ctx.beginPath();
ctx.translate(210,210);
ctx.rotate(i*30*Math.PI/180);
ctx.strokeStyle='#60D9F8';
ctx.lineWidth=8;
ctx.moveTo(0,-175);
ctx.lineTo(0,-195);
ctx.stroke();
ctx.closePath();
ctx.restore();//恢复之前保存的状态
}; //获取当前时间
var dates=new Date();
var h=dates.getHours();
var m=dates.getMinutes();
var s=dates.getSeconds();
h=h+m/60;//12.5小时
m=m+s/60; //画时间
var h2=dates.getHours();
var m2=dates.getMinutes();
var str1=h2>9?h2:'0'+h2;
var str2=m2>9?m2:'0'+m2;
var str=str1+':'+str2;// 09:05
ctx.beginPath();
ctx.font='26px 微软雅黑';
ctx.fillStyle='#5BDA40';
ctx.fillText(str,180,340);
ctx.closePath(); //时针
ctx.save();//保存状态
ctx.beginPath();
ctx.translate(210,210);
ctx.rotate(h*30*Math.PI/180);
ctx.strokeStyle='#60D9F8';
ctx.lineWidth=8;
ctx.moveTo(0,14);
ctx.lineTo(0,-130);
ctx.stroke();
ctx.closePath();
ctx.restore();//恢复之前保存的状态 //分针
ctx.save();//保存状态
ctx.beginPath();
ctx.translate(210,210);
ctx.rotate(m*6*Math.PI/180);
ctx.strokeStyle='#FEF319';
ctx.lineWidth=5;
ctx.moveTo(0,14);
ctx.lineTo(0,-150);
ctx.stroke();
ctx.closePath();
ctx.restore();//恢复之前保存的状态 //秒针
ctx.save();//保存状态
ctx.beginPath();
ctx.translate(210,210);
ctx.rotate(s*6*Math.PI/180);
ctx.strokeStyle='#FB1F11';
ctx.lineWidth=3;
ctx.moveTo(0,14);
ctx.lineTo(0,-170);
ctx.stroke();
ctx.closePath(); //秒针上的圆
ctx.beginPath();
ctx.fillStyle='#FEF319';
ctx.strokeStyle='#FB1F11';
ctx.lineWidth=3;
ctx.arc(0,-155,5,0,2*Math.PI,true);
ctx.fill();
ctx.stroke();
ctx.closePath(); //中心圆
ctx.beginPath();
ctx.fillStyle='#FEF319';
ctx.strokeStyle='#FB1F11';
ctx.lineWidth=3;
ctx.arc(0,0,8,0,2*Math.PI,true);
ctx.fill();
ctx.stroke();
ctx.closePath();
ctx.restore();//恢复之前保存的状态 }
</script>
</body>
</html>

  

Canvas画布实现自定义时钟效果的更多相关文章

  1. 基于canvas的原生JS时钟效果

    概述 运用html5新增画布canvas技术,绘制时钟效果,无需引用任何插件,纯js. 详细 代码下载:http://www.demodashi.com/demo/11935.html 给大家介绍一个 ...

  2. vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)

    前言: 此事例是在vue组件中,使用canvas实现倒计时动画的效果.其实,实现效果的逻辑跟vue没有关系,只要读懂canvas如何实现效果的这部分逻辑就可以了 canvas动画的原理:利用定时器,给 ...

  3. canvas实现的时钟效果

    最近在网上看到了一个css3实现的可爱时钟,觉得很nice,然后就想着用canvas试试实现这个时钟效果. 首先,要实现时钟需要先计算时钟上的数字应该占整个圆的大小. 因为一个圆是360度,所以数字之 ...

  4. Particles.js基于Canvas画布创建粒子原子颗粒效果

    文章目录 使用方法 自定义参数 相关链接 Particles.js是一款基于HTML5 Canvas画布的轻量级粒子动画插件,可以设置粒子的形状.旋转.分布.颜色等属性,还可以动态添加粒子,效果非常炫 ...

  5. 更新——Canvas画布动画效果之实现倒计时

    Hello,大家好! 小W复活啦!继续欢乐的给大家更博,输送新知识~~ 不开玩笑啦!秒进正题~~~ 上次更博,小W给大家介绍了Canvas画布的基础部分,以及实现了一个由7*10点阵图显示的倒计时的基 ...

  6. CANVAS画布与SVG的区别

    CANVAS是html5提供的新元素<canvas>,而svg存在的历史要比canvas久远,svg并不是html5专有的标签,最初svg是用xml技术(超文本扩展语言,可以自定义标签或属 ...

  7. 用html5的canvas画布绘制贝塞尔曲线

    查看效果:http://keleyi.com/keleyi/phtml/html5/7.htm 完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...

  8. transform实现的时钟效果

    又来一个时钟效果了,这个的实现不需要canvas,都是div.ul.li画出的,好玩有真实. 哈哈~ 需要的js才能实现到走动这个效果,但js的内容不多,也不难. 主要是一个css里transform ...

  9. 关于使用Css设置Canvas画布大小的问题

    问题分析 我们在调整画布大小时,希望画布中的图形保持不变,只是改变画布本身的大小.但是如果使用Css设置画布大小,则会出现问题. 问题描述 如果使用Css设置Canvas画布的大小,则导致画布按比例缩 ...

随机推荐

  1. 自己写的书《深入理解Android虚拟机内存管理》,不出版只是写着玩

    百度网盘地址:https://pan.baidu.com/s/1jI4xZgE 我给起的书名叫做<深入理解Android虚拟机内存管理>.本书分为两个部分,前半部分主要是我对Linux0. ...

  2. PHP 类的封装和使用

    类:相似的数据和数据操作的封装  class 成员量:普通的量加上一定的修饰就变成了成员量 public,protected,private 成员方法:普通的函数,加上一定的修饰,放入到类中就变成了成 ...

  3. js算法集合(二) javascript实现斐波那契数列 (兔子数列)

    js算法集合(二)  斐波那契数列 ★ 上一次我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,这次,我们来对斐波那契数列进行研究,来加深对循环的理解.     Javascript实 ...

  4. HttpGet和HttpPost

    package net.blogjava.mobile; import java.net.HttpURLConnection; import java.util.ArrayList; import j ...

  5. Nodejs进阶:核心模块Buffer常用API使用总结

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 模块概览 Buffer是node的核心模块,开发者可以利用它来处 ...

  6. 用R语言做数据清理(详细教程)

    数据的清理 如同列夫托尔斯泰所说的那样:“幸福的家庭都是相似的,不幸的家庭各有各的不幸”,糟糕的恶心的数据各有各的糟糕之处,好的数据集都是相似的.一份好的,干净而整洁的数据至少包括以下几个要素: 1. ...

  7. PHP Laravel 环境与框架结构

    MAMP: 开发环境   php+apach+mysqlLaravel: 框架5.2phpstorm: 工具IDE目录结构:app:运行 核心代码bootstrap : 框架启动,加载config: ...

  8. Redis 小白指南(三)- 事务、过期、消息通知、管道和优化内存空间

    Redis 小白指南(三)- 事务.过期.消息通知.管道和优化内存空间 简介 <Redis 小白指南(一)- 简介.安装.GUI 和 C# 驱动介绍> 讲的是 Redis 的介绍,以及如何 ...

  9. 一步一步实现android studio代码上传到github。

    本文只注重代码上传能成功就好,不解释什么是git什么事github,git有什么优势. 1,先创建一个android应用, 第二步:创建github账户 和 安装git.网上的文章多如牛毛.唯一要说的 ...

  10. sleep()

    sleep() 方法可以使当前线程(即调用该方法的线程)暂停执行一段时间, 让其他线程有机会继续执行, 但它并不释放对象锁: 所以当sleep()方法结束时: 当前线程还是拥有对象锁: 当线程拥有对象 ...