五步轻松实现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 判断代码全收集
Apr 28 Javascript
jQuery 使用手册(五)
Sep 23 Javascript
用jquery与css打造个性化的单选框和复选框
Oct 20 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
Aug 07 Javascript
封装的jquery翻页滚动(示例代码)
Nov 18 Javascript
判断及设置浏览器全屏模式
Apr 20 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
Jan 19 Javascript
jQuery实现form表单序列化转换为json对象功能示例
May 23 jQuery
jquery.onoff实现简单的开关按钮功能(推荐)
May 24 jQuery
微信小程序wx.uploadfile 本地文件转base64的实现代码
Jun 28 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
Oct 29 Javascript
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
Mar 17 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基础学习笔记
2007/03/18 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
使用php显示搜索引擎来的关键词
2014/02/13 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
javascrip关于继承的小例子
2013/05/10 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
2015/05/14 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
javascript中的 object 和 function小结
2016/08/14 Javascript
Bootstarp 基础教程之表单部分实例代码
2017/02/03 Javascript
node.js express中app.param的用法详解
2017/07/16 Javascript
实例分析javascript中的异步
2020/06/02 Javascript
Vue生命周期activated之返回上一页不重新请求数据操作
2020/07/26 Javascript
python ip正则式
2009/05/07 Python
为Python程序添加图形化界面的教程
2015/04/29 Python
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
PyQT实现多窗口切换
2018/04/20 Python
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
css3+伪元素实现鼠标移入时下划线向两边展开的效果
2017/04/25 HTML / CSS
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
经济系大学生求职信
2013/10/01 职场文书
创业计划书中要认真思考的问题
2013/12/28 职场文书
班级道德讲堂实施方案
2014/02/24 职场文书
超市中秋节促销方案
2014/03/21 职场文书
施工安全责任书
2014/04/14 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
食品安全汇报材料
2014/08/18 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
年终工作总结范文2014
2014/11/27 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS