五步轻松实现JavaScript HTML时钟效果


Posted in Javascript onMarch 25, 2020

学了一段时间的HTML、CSS和JS后,给大家做一款漂亮的不像实力派的HTML时钟,先看图:

五步轻松实现JavaScript HTML时钟效果

涉及到的知识点有: CSS3动画、DOM操作、定时器、圆点坐标的计算(好多人是不是已经还给自己的老师了~)
 接下来,我们用5步来制作它

step1、准备HTML

首先,我们需要准备HTML结构,背景、表盘、指针(时针、分针、秒针)、数字。

<div id="clock">
 <div class="bg">
 <div class="point">
 <div id="hour"></div>
 <div id="minute"></div>
 <div id="second"></div>
 <div class="circle"></div>
 </div>
 </div>
< /div>

step2、准备CSS

定义好指针的颜色和大小,需要说明的是transform: rotate(-90deg); 用来旋转指针,transform-origin:0 6px; 用来设置旋转中心点。

<style>
 *{
 margin: 0;
 padding: 0;
 }
 #clock{
 margin: 5% auto;
 width: 400px;
 height: 400px;
 border-radius: 10px;
 background: #aaa;
 position: relative;
 transform: rotate(-90deg);
 }
 #clock .bg{
 width: 360px;
 height: 360px;
 border-radius: 50%;
 background: #fff;
 position: absolute;
 left: 50%;
 top: 50%;
 margin-left: -180px;
 margin-top: -180px;
 }
 #clock .point{
 position: absolute;
 left: 50%;
 top: 50%;
 margin-left: -14px;
 margin-top: -14px;
 }
 #clock #hour{
 width: 80px;
 height: 16px;
 background: #000;
 margin: 6px 0 0 14px;
 /*transform: rotate(30deg);*/
 transform-origin:0 8px;
 /*animation: hour 3s linear 100!* alternate*!;*/
 border-radius: 16px;
 }

 #clock #minute{
 width: 120px;
 height: 12px;
 background: #000;
 margin: -14px 0 0 14px;
 transform-origin:0 6px;
 border-radius: 12px;
 }
 #clock #second{
 width: 160px;
 height: 6px;
 background: #f00;
 margin: -9px 0 0 14px;
 transform-origin:0 3px;
 border-radius: 6px;
 }
 #clock .point .circle{
 width: 28px;
 height: 28px;
 border-radius: 50%;
 background: #000;
 position: absolute;
 left: 0;
 top: 0;
 }
 @keyframes hour {
 from {transform: rotate(0deg);}
 to {transform: rotate(360deg);}
 }

 #clock .number{
 position: absolute;
 font-size: 34px;
 width: 50px;
 height: 50px;
 line-height: 50px;
 text-align: center;
 transform: rotate(90deg);
 }
< /style>

step3、计算时针位置

JS通过Date对象获取当前时间,getHours获取小时、getMinutes获取分钟、getSeconds获取秒。时针转动一周是12格,每格角度就是360°/12,分钟和秒都是60格,每格角度360°/60。

function clock(){
 var date = new Date();//获取当前时间
 //时(0-23) 分(0-59)秒(0-59)
 //计算转动角度
 var hourDeg = date.getHours()*360/12;
 var minuteDeg = date.getMinutes()*360/60;
 var secondDeg = date.getSeconds()*360/60;
 //console.log(hourDeg, minuteDeg, secondDeg);
 //设置指针
 hour.style.transform = 'rotate('+hourDeg+'deg)';
 minute.style.transform = 'rotate('+minuteDeg+'deg)';
 second.style.transform = 'rotate('+secondDeg+'deg)';
}

step4、时钟转动

通过setInterval设置定时器,每秒刷新一次。注意,需要初始化执行一次,否则会在1s后才能看到效果。

//初始化执行一次
clock();
setInterval(clock,1000);

step5、绘制数字时间

数字时间也是在一个圆周上,我们只用确定好半径,然后得到半径上的坐标。通过左边来定位每个数字就好了。看一下圆坐标系的计算规则:

五步轻松实现JavaScript HTML时钟效果

* 圆半径坐标计算:
* x = pointX + r*cos(angle);
* y = pointY + r*sin(angle);
但是注意,我们计算的坐标是圆弧上点的坐标,当定位每个数字时,都是以元素的左上角点进行定位,这样我们的数字就会存在偏移。也就是说数字的中心点不在圆弧上,解决办法就是把坐标点(x,y)平移自身的一半(x-w/2, y-h/2)
,这样数字的中心点就在圆弧上了。

var pointX = 200;
var pointY = 200;
var r = 150;
function drawNumber(){
 var deg = Math.PI*2/12;//360°
 for (var i = 1; i <= 12; i++) {
 //计算每格的角度
 var angle = deg*i;
 //计算圆上的坐标
 var x = pointX + r*Math.cos(angle);
 var y = pointY + r*Math.sin(angle);
 //创建div,写入数字
 var number = document.createElement('div');
 number.className = 'number';
 number.innerHTML = i;
 //减去自身的一半, 让div的中心点在圆弧上
 number.style.left = x - 25 + 'px';
 number.style.top = y - 25 + 'px';
 //添加到页面
 myClock.appendChild(number);
 }
}

完整JS代码:

<script>
 /***
 * 时钟:
 * 1> 旋转: rotate(90deg)
 * 2> 旋转中心点: transform-origin
 * */
 //TODO step1: 获取时钟的指针
 var hour = document.getElementById('hour');//时针
 var minute = document.getElementById('minute');//分针
 var second = document.getElementById('second');//秒针
 var myClock = document.getElementById('clock');//时钟

 //TODO step2: 获取当前时间,把指针放在正确的位置
 function clock(){
 var date = new Date();//获取当前时间
 //时(0-23) 分(0-59)秒(0-59)
 //计算转动角度
 var hourDeg = date.getHours()*360/12;
 var minuteDeg = date.getMinutes()*360/60;
 var secondDeg = date.getSeconds()*360/60;
 //console.log(hourDeg, minuteDeg, secondDeg);
 //设置指针
 hour.style.transform = 'rotate('+hourDeg+'deg)';
 minute.style.transform = 'rotate('+minuteDeg+'deg)';
 second.style.transform = 'rotate('+secondDeg+'deg)';
 }
 //初始化执行一次
 clock();
 //TODO step3: 设置定时器
 setInterval(clock,1000);

 /***
 * 圆半径坐标计算:
 * x = pointX + r*cos(angle);
 * y = pointY + r*sin(angle);
 * */
 var pointX = 200;
 var pointY = 200;
 var r = 150;
 //TODO step4: 画时钟数字
 function drawNumber(){
 var deg = Math.PI*2/12;//360°
 for (var i = 1; i <= 12; i++) {
 //计算每格的角度
 var angle = deg*i;
 //计算圆上的坐标
 var x = pointX + r*Math.cos(angle);
 var y = pointY + r*Math.sin(angle);
 //创建div,写入数字
 var number = document.createElement('div');
 number.className = 'number';
 number.innerHTML = i;
 //减去自身的一半, 让div的中心点在圆弧上
 number.style.left = x - 25 + 'px';
 number.style.top = y - 25 + 'px';
 //添加到页面
 myClock.appendChild(number);
 }
 }
 drawNumber();
< /script>

怎么样,会了吗?

更多JavaScript时钟特效点击查看:JavaScript时钟特效专题

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

Javascript 相关文章推荐
js实现快速分享功能(你的文章分享工具)
Jun 25 Javascript
javascript的解析执行顺序在各个浏览器中的不同
Mar 17 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
Mar 13 Javascript
jQuery实现宽屏图片轮播实例教程
Nov 24 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
Jun 02 Javascript
Javascript Event(事件)的传播与冒泡
Jan 23 Javascript
AngularJS实现路由实例
Feb 12 Javascript
Vue.js之slot深度复制详解
Mar 10 Javascript
layui实现文件或图片上传记录
Aug 28 Javascript
浅析Vue中拆分视图层代码的5点建议
Aug 15 Javascript
js实现盒子滚动动画效果
Aug 09 Javascript
JS highcharts实现动态曲线代码示例
Oct 16 Javascript
深入研究React中setState源码
Nov 17 #Javascript
Vue.js在数组中插入重复数据的实现代码
Nov 17 #Javascript
jQuery实现滚动效果
Nov 17 #jQuery
不使用 JS 匿名函数理由
Nov 17 #Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
Nov 17 #Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
Nov 17 #Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
Nov 17 #Javascript
You might like
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
基于PHP array数组的教程详解
2013/06/05 PHP
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
php文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
总结对比php中的多种序列化
2016/08/28 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
PHP 实现缩略图
2021/03/09 PHP
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
判断对象是否Window的实现代码
2012/01/10 Javascript
javascript列表框操作函数集合汇总
2013/11/28 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
2018/04/18 jQuery
vue中的适配px2rem示例代码
2018/11/19 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
jQuery实现增删改查
2020/12/22 jQuery
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
用Python实现服务器中只重载被修改的进程的方法
2015/04/30 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
Python实现带参数的用户验证功能装饰器示例
2018/12/14 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
俄罗斯购买剧院和演唱会门票网站:Parter.ru
2019/11/09 全球购物
学校联谊活动方案
2014/02/15 职场文书
聚美优品励志广告词
2014/03/14 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
离婚协议书包括哪些内容
2014/10/16 职场文书
医院领导班子四风问题对照检查材料
2014/10/26 职场文书
村党建工作汇报材料
2014/11/02 职场文书
2015年度个人教学工作总结
2015/05/20 职场文书
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis
Python if else条件语句形式详解
2022/03/24 Python