五步轻松实现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 相关文章推荐
向大师们学习Javascript(视频与PPT)
Dec 27 Javascript
ECMAScript 创建自己的js类库
Nov 22 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
Mar 02 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
May 19 Javascript
如何提高数据访问速度
Dec 26 Javascript
ztree实现左边动态生成树右边为内容详情功能
Nov 03 Javascript
js实现类似iphone的网页滑屏解锁功能示例【附源码下载】
Jun 10 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
Aug 07 Javascript
详细分析Node.js 模块系统
Jun 28 Javascript
vue或react项目生产环境去掉console.log的操作
Sep 02 Javascript
JSONObject与JSONArray使用方法解析
Sep 28 Javascript
JavaScript动态生成表格的示例
Nov 02 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
PHP在字符断点处截断文字的实现代码
2011/04/21 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
2011/11/10 PHP
php实现将base64格式图片保存在指定目录的方法
2016/10/13 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
2017/09/29 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
javascript写的一个链表实现代码
2009/10/25 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
python调用c++传递数组的实例
2019/02/13 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
python3.7 sys模块的具体使用
2019/07/22 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
python新手学习使用库
2020/06/11 Python
CSS3中box-shadow的用法介绍
2015/07/15 HTML / CSS
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
企业精神口号
2014/06/11 职场文书
驾驶员安全责任书
2014/07/22 职场文书
售后服务承诺函格式
2015/01/21 职场文书
幼儿园新生开学寄语
2015/05/27 职场文书
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript
Android自定义双向滑动控件
2022/04/19 Java/Android