JavaScript实现仿Clock ISO时钟


Posted in Javascript onJune 29, 2018

来模仿一个 ISO 上的时钟:ISO Clock

实现效果:

JavaScript实现仿Clock ISO时钟

ISO Clock

项目分析

1、首先时钟嘛,肯定要获取本地客户端的时间;

2、时钟有 3 个指针,我们可以通过添加动画的方式让它们围绕中心点转动;

3、通过获取到的 hour、minute 和 second 值分别计算 时针、分针和秒针的角度值;

HTML&CSS

布局

<div class="box">
 <article class="clock">
 <div class="hours-container">
  <div class="hours"></div>
 </div>
 <div class="minutes-container">
  <div class="minutes"></div>
 </div>
 <div class="seconds-container">
  <div class="seconds"></div>
 </div>
 </article>
</div>

1、.box 是为了布局的方便;

2、 然后每个指针都需要一个 *-container 容器 。

添加 CSS 样式

把背景加载进来,然后放在页面中合适的位置上。

html{  font-size: 10px;
}html,body{  margin: 0;  padding: 0;
}.box{ width: 35rem; height: 38rem;       background: rgb(205,205,205); border-radius: 1rem; margin: 5% auto; display: flex; justify-content: center; align-items: center;
}.clock{  width: 30rem;  height: 30rem;  background: #fff url(ios_clock.svg) no-repeat center;  background-size: 88%;  border-radius: 50%;  position: relative;
}

JavaScript实现仿Clock ISO时钟

1、 width: 35rem; height: 38rem; 这个比例比较顺眼吧;

2、 .box 使用 Flex 布局方式,并且使其中的 .clock 水中、垂直方向都居中。看过第一天教程应该都明白 Flex 布局的。

3、Clock 的背景使用一张图片。获取地址

添加中心轴

使用 CSS3 中的 伪元素 为时钟添加实心小圆点,指针都围着这个点转。

.clock:after{  content: '';  width: 1.5rem;  height: 1.5rem;  background: #000;  border-radius: 50%;  position: absolute;  top: 50%;  left: 50%;  transform: translate(-50%,-50%);   /* 向左上移动自身的50% */
  z-index: 10;
}

JavaScript实现仿Clock ISO时钟

1、 这句 content: ''; 是必须的,不然这个伪元素不会显示,即使指定了宽度和高度。

2、 由于相对定位是从元素的左上角开始计算的,所以 top: 50%; left: 50%; 不能使这个小圆点在 Clock 的中心,使用 transform: translate(-50%,-50%); 向左上方移动自身宽度或高度的 50%

3、 z-index: 10; 是为了使这个小圆点在视图的最上层,遮挡住指针交叉的地方

指针容器

.hours-container,.minutes-container,.seconds-container{  position: absolute;  top: 0;  right: 0;  bottom: 0;  left: 0;
}

1、容器被放置在 Clock 的上方,但是并没有样式,接下来就可以创建指针了!

添加指针

.hours {  width: 3%;  height: 20%;  background: #000;  transform-origin: 50% 100%;  position: absolute;  top: 30%;  left: 48.5%;
}.minutes {  width: 2%;  height: 37%;  background: #000;  transform-origin: 50% 100%;  position: absolute;  top: 13%;  left: 49%;
}.seconds {  width: 1%;  height: 40%;  background: #f00;  transform-origin: 50% 90%;  position: absolute;  top: 20%;  left: 49.5%;  z-index: 8;
}

JavaScript实现仿Clock ISO时钟

1、分别添加时针、分针和秒针。

2、 使用 % 这种单位可以更好地适应不同的屏幕。

3、transform-origin: 50% 90%; 规定指针旋转的位置为:X 方向的中心线 和 Y 方向的 90% 处这条线的交叉点。(具体看图吧)

JavaScript实现仿Clock ISO时钟

4、 这里在定位的时候把自身的宽度计算在内了,所以就不必在往左上角移动了。

动画

目前为止,这个 Clock 还是没有功能的,我们来让它动起来。

定义动画规则

@keyframes rotate {
  100% {    transform: rotateZ(360deg);
  }
}

1、这里用 @keyframes 规则定义了一个动画,这个动画的名称是 ratate ,应用这个动画的元素会沿着某个 Z 轴(也就是上面规定好的哪个交叉点)旋转 360 度。

定时功能

规定每个指针旋转 360 度需要多长时间。

.hours-container {  animation: rotate 60s infinite linear;
}.minutes-container {  animation: rotate 30s infinite linear;
}.seconds-container {  animation: rotate 10s infinite linear;
}

JavaScript实现仿Clock ISO时钟

为了演示方便,这里固定的时间并没有按照真实的 Clock 来设置。时针应该是 12 小时(43200s)、分针应该是 3600s 、秒针应该是 60s 。

更像真实的 Clock

现实中的 Clock 大部分是秒针和分针都是会跳动的,并且伴随着滴答声,我们来尝试一下。

.hours-container {  animation: rotate 60s infinite linear;
}.minutes-container {  animation: rotate 3600s infinite steps(60);
}.seconds-container {  animation: rotate 60s infinite steps(60);
}

JavaScript实现仿Clock ISO时钟

1、只需要将 分针 和 秒针的旋转方式调整为 steps() 即可。

但是这样的 Clock 每次刷新都是从 0 开始的,并不是我们需要的,怎么做一个显示真实时间的呢??

正确的时间

我们首先要获取到当前的时间,然后计算每个指针应该旋转的角度即可。

获取每个指针

const hourHand = document.querySelector('.hours-container');const minuteHand = document.querySelector('.minutes-container');const secondHand = document.querySelector('.seconds-container');

获取当前时间

const now = new Date();const hour = now.getHours();const minute = now.getMinutes();const second = now.getSeconds();
`

计算每个指针应旋转的角度

在 CSS3 中角度单位一共有四种:

  • deg (度,一个圆 360 度)、
  • grad(梯度,一个圆共400梯度)、
  • turn (转、圈,一个圆共1圈)、
  • rad (弧度,一个圆共2π弧度)
  • 它们的对应关系为:

90deg = 100grad = 0.25turn ≈ 1.570796326794897rad

很显然,我们这里要用到的单位是 deg 。

const secondDegree = second * 6 + 90;
const minuteDegree = minute * 6 + (second / 10) + 90;
const hourDegree = (hour * 30) + (minute / 2) + 90;

1、+90 是因为角度的起始位置为水平的 X 轴,为了和 Clock 指针起始位置(Y 轴)做统一;

2、秒针的计算最简单,(second / 60) * 360 + 90;

3、 分针要考虑秒针的影响,如过了30秒,相当于半分钟。公式为: 当前分钟数 + 秒数在分钟的映射;即:(( minutes/ 60) * 360) + ((seconds / 60) * 6) + 90;

4、 时针稍微复杂一点,因为要考虑分钟的影响,如过了30分钟,相当于半小时。公式为: 当前时数 + 分钟在小时的映射 。即:(( hours/ 12) * 360) + ((minutes / 60) * 30) + 90;

应用角度值

hourHand.style.transform = `rotateZ(${hourDegree}deg)`;
minuteHand.style.transform = `rotateZ(${minuteDegree}deg)`;
secondHand.style.transform = `rotateZ(${secondDegree}deg)`;

为了使页面能实时的更新,我们要把上面的这些东西封装为一个函数,然后用定时器每秒执行一次。

整个时钟的功能都完成了!

Javascript 相关文章推荐
经典的解除许多网站无法复制文字的绝招
Dec 31 Javascript
javascript学习笔记(六) Date 日期类型
Jun 19 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
Jan 27 Javascript
jQuery $.extend()用法总结
Jun 15 Javascript
使用jQuery在对象中缓存选择器的简单方法
Jun 30 Javascript
node.JS md5加密中文与php结果不一致的解决方法
May 05 Javascript
微信小程序 按钮滑动的实现方法
Sep 27 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
May 07 Javascript
最后说说Vue2 SSR 的 Cookies 问题
May 25 Javascript
原生js实现日历效果
Mar 02 Javascript
vue+Element-ui前端实现分页效果
Nov 15 Javascript
vue在图片上传的时候压缩图片
Nov 18 Vue.js
vue ssr 指南详读
Jun 29 #Javascript
jQuery实现获取动态添加的标签对象示例
Jun 28 #jQuery
Vue实现textarea固定输入行数与添加下划线样式的思路详解
Jun 28 #Javascript
详解swipe使用及竖屏页面滚动方法
Jun 28 #Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
Jun 28 #Javascript
浅谈vue首屏加载优化
Jun 28 #Javascript
jQuery实现获取选中复选框的值实例详解
Jun 28 #jQuery
You might like
请php正则走开
2008/03/15 PHP
php实现从上传文件创建缩略图的方法
2015/04/02 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
jQuery插件EasyUI获取当前Tab中iframe窗体对象的方法
2016/08/05 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
JS中数据结构之栈
2019/01/01 Javascript
Vue使用axios出现options请求方法
2019/05/30 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
[01:04:05]VG vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
Pycharm保存不能自动同步到远程服务器的解决方法
2019/06/27 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
python 进程池pool使用详解
2020/10/15 Python
Matplotlib配色之Colormap详解
2021/01/05 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
质量在我心中演讲稿
2014/09/02 职场文书
个人维稳承诺书
2015/05/04 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
用python自动生成日历
2021/04/24 Python