五步轻松实现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 onkeydown,onkeyup,onkeypress,onclick,ondblclick
Feb 04 Javascript
不使用XMLHttpRequest实现异步加载 Iframe和script
Oct 29 Javascript
jquery在IE、FF浏览器的差别详细探讨
Apr 28 Javascript
jquery滚动条插件jScrollPane的使用介绍
Nov 08 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
May 13 Javascript
JavaScript中常用的验证reg
Oct 13 Javascript
JS中如何实现点击a标签返回页面顶部的问题
Jan 19 Javascript
Vue计算属性的学习笔记
Mar 22 Javascript
基于vue.js的分页插件详解
Nov 27 Javascript
详解Vue中localstorage和sessionstorage的使用
Dec 22 Javascript
JavaScript代码实现txt文件的上传预览功能
Mar 27 Javascript
layui前端时间戳转化实例
Nov 15 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
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
PHP实现八皇后算法
2019/05/06 PHP
JavaScript QueryString解析类代码
2010/01/17 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
jQuery.position()方法获取不到值的安全替换方法
2015/03/13 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
js实现的万能flv网页播放器代码
2016/04/30 Javascript
js轮播图代码分享
2016/07/14 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
Angular自定义组件实现数据双向数据绑定的实例
2017/12/11 Javascript
详解vue静态资源打包中的坑与解决方案
2018/02/05 Javascript
一步快速解决微信小程序中textarea层级太高遮挡其他组件
2019/03/04 Javascript
微信小程序实现的图片保存功能示例
2019/04/24 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
Python实现模拟时钟代码推荐
2015/11/08 Python
利用Python进行异常值分析实例代码
2017/12/07 Python
Sanic框架应用部署方法详解
2018/07/18 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
2018/10/26 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
HTML5 canvas基本绘图之图形变换
2016/06/27 HTML / CSS
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
自考毕业自我鉴定范文
2013/10/27 职场文书
房地产融资计划书
2014/01/10 职场文书
办公室人员先进事迹
2014/01/27 职场文书
争先创优演讲稿
2014/09/15 职场文书
2015年依法治校工作总结
2015/07/27 职场文书
初中团委工作总结
2015/08/13 职场文书
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python