圆盘时钟 旋转时钟 数字时钟

写在前面

仿荣耀手机时钟,设计的同款时钟效果

实现效果

实现原理

数字时钟

  1. 利用Date内置对象获取当下的时间,通过处理呈现在页面上

这一步获取时间是非常简单的,通过Date下的一些属性就可以实现了

  1. 背景采用的是一个炫彩流光的效果,利用了CSS3新增的动画效果

这部分的炫彩流光效果在之前的博客中有详细讲到

炫彩流光效果

指针时钟

  1. 通过定位将三根针重叠在一起,下端对齐都摆在原点,通过transfrom-origin属性,将旋转原点定为底部,也就是,让三根针转的时候绕中心点转

  2. 在获取到时间的基础上,将时间转化为旋转的角度,每一个小时时针转30度,每分钟分钟转6度,每秒钟秒针转6度

这里有一点点的计算,需要理解一下

  1. 为了让分针和时针是缓慢移动的,而不是突然间的抖动,让秒针转的时候,实时反馈给分针,分针转的时候反馈给时针
'rotate(' + (rotateH + (rotateM / 60)) + 'deg' + ')'

就像这样把分针旋转了多少反馈给时针,60分钟一个小时,所以是除以60

旋转时钟

  1. 这里采用的是clip-path属性采取另一半的圆,圆环的效果采用的是大小圆的思路,用小圆盖在大半圆的上方
  2. 圆环的旋转和指针的旋转异曲同工,圆环是反馈秒钟的,只需根据秒钟来判断即可
  3. 为了让圆能够自转,需要将旋转原点设置为圆的中心点

实现代码

HTML结构

<!-- 转盘时钟 -->
<div class="clocker">
<span class="long"></span>
<span class="short"></span>
<span class="mini"></span>
<i class="twelve">12</i>
<i class="three">3</i>
<i class="six">6</i>
<i class="nine">9</i>
<div class="round"></div>
</div>
<!-- 旋转时钟 -->
<div class="rot">
<div class="timing"></div>
<div class="outer"></div>
<div class="inner"></div>
</div>
<!-- 显示日期 -->
<div class="date">
<p>中国标准时间</p>
<div class="now"></div>
</div>
<!-- 数字时钟 -->
<div class = "clock">
<span class ="hour"></span>
<span class ="minute"></span>
<span class ="second"></span>
</div>

CSS部分

* {
margin: 0;
padding: 0;
}
body {
background-color: black;
}
@keyframes move {
0% {
background-position: 0%;
}
100% {
background-position: 100%;
}
}
/* 数字炫彩时钟 */
.clock {
display: flex;
position: relative;
width: 400px;
height: 100px;
margin: 20px auto;
background: linear-gradient(90deg,rgb(39,122,218),rgb(74,230,121),rgb(201,214,13),rgb(226,20,233),rgb(16,172,219));
background-size: 400%;
border-radius: 10px;
justify-content: center;
align-items: center;
animation: move 3s linear infinite alternate;
}
.clock::before {
content: '';
position: absolute;
top: -5px;
left: -5px;
width: 410px;
height: 110px;
background: linear-gradient(90deg,rgb(39,122,218),rgb(74,230,121),rgb(201,214,13),rgb(226,20,233),rgb(16,172,219));
background-size: 400%;
opacity: 1;
border-radius: 10px;
transition: all .6s;
z-index: -1;
filter: blur(10px);
animation: move 3s linear infinite alternate;
}
.clock span {
color: white;
font-size: 50px;
margin: 0px 30px;
text-shadow: 0px 0px 12px white;
}
/* 日期样式 */
.date {
width: 300px;
height: 100px;
margin: 0 auto;
}
p {
text-align: center;
letter-spacing: 4px;
color: white;
font-size: 34px;
}
.date .now {
color: white;
font-size: 20px;
margin-top: 10px;
letter-spacing: 3px;
text-align: center;
}
/* 表盘 */
.clocker {
/* display: none; */
position: relative;
width: 400px;
height: 400px;
border-radius: 50%;
margin: 50px auto;
background-color: rgb(179, 179, 179);
}
.clocker span {
display: inline-block;
position: absolute;
left: 50%;
transform-origin: bottom;
}
/* 三根针 */
.long {
top: 30px;
width: 4px;
height: 170px;
background: linear-gradient(rgb(39,122,218),rgb(226,20,233),pink);
background-size: 400%;
transform: translate(-2px,0);
}
.short {
position: relative;
top: 60px;
width: 8px;
height: 140px;
border-radius: 4px;
background-color: black;
transform: translate(-4px,0);
}
.short::before {
position: absolute;
bottom: 0;
left: 3px;
content: '';
width: 2px;
height: 60px;
background-color: white;
border-radius: 1px;
}
.mini {
position: relative;
top: 100px;
width: 10px;
height: 100px;
border-radius: 5px ;
background-color: black;
transform: translate(-3px,0);
}
.mini::before {
position: absolute;
bottom: 0;
left: 4px;
content: '';
width: 2px;
height: 40px;
background-color: white;
border-radius: 1px;
}
/* 中间的小圆圈 */
.round {
position: absolute;
width: 20px;
height: 20px;
border: px solid black;
/* background-color: white; */
background: linear-gradient(rgb(39,122,218),rgb(226,20,233),pink);
border-radius: 50%;
top: 50%;
left: 50%;
box-sizing: border-box;
transform: translate(-8px,-10px);
}
/* 表盘数字的样式 */
i {
font-style: normal;
font-size: 24px;
color: white;
}
.twelve {
position: absolute;
top: 0;
left: 50%;
transform: translate(-10px,0);
}
.three {
position: absolute;
top: 50%;
right: 5px;
transform: translate(0px,-10px);
}
.six {
position: absolute;
bottom: 10px;
left: 50%;
transform: translate(-10px,0);
}
.nine {
position: absolute;
top: 50%;
left: 5px;
transform: translate(0px,-10px);
}
/* 旋转时钟 */
.rot {
display: none;
position: relative;
width: 400px;
height: 400px;
border-radius: 50%;
margin: 50px auto;
background-color: rgb(41, 41, 41);
}
.timing {
position: absolute;
width: 260px;
height: 260px;
text-align: center;
line-height: 260px;
top: 50%;
left: 50%;
letter-spacing: 2px;
transform: translate(-50%,-50%);
font-size: 65px;
color: black;
z-index: 2;
}
.inner {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
width: 260px;
height: 260px;
border-radius: 50%;
background-color: rgb(243, 236, 236);
}
.outer {
position: absolute;
width: 400px;
height: 400px;
box-sizing: border-box;
border-radius: 50%;
background: linear-gradient(rgb(39,122,218),rgb(226,20,233),rgb(41, 41, 41));
clip-path: inset( 0 50% 0 0 );
transform-origin: center center;
}

JS代码

<script>
/* 前面数字的三个span */
var hour = document.querySelector('.hour');
var minute = document.querySelector('.minute');
var second = document.querySelector('.second');
/* 获取圆盘的三根针 */
var hourNeedle = document.querySelector('.mini');
var minuteNeedle = document.querySelector('.short');
var secondNeedle = document.querySelector('.long');
/* 获取显示日期的div */
var date = document.querySelector('.now');
/* 旋转时钟 */
var timing = document.querySelector('.timing');
var outer = document.querySelector('.outer');
/* 获取三个时钟 */
var clocker = document.querySelector('.clocker');
var rot = document.querySelector('.rot');
console.log(clocker);
/* 先来个立即执行函数让时间在页面打开时就显示 */
(function times() {
var time = new Date();
var year = time.getFullYear();
var month = time.getMonth();
var dates = time.getDate();
var day = time.getDay();
var h = time.getHours();
var days = ['星期天','星期一','星期二','星期三','星期四','星期五','星期六'];
var divText = (month + 1) + '月' + dates + '日' + days[day];
date.innerHTML = divText;
h = h < 10 ? '0' + h : h;
var m = time.getMinutes();
m = m < 10 ? '0' + m : m;
var s = time.getSeconds();
s = s < 10 ? '0' + s : s;
hour.innerHTML = h ;
minute.innerHTML = m;
second.innerHTML = s;
timing.innerHTML = h + ':' + m ;
var rotateH = h * 30 ;
var rotateM = m * 6;
var rotateS = s * 6;
hourNeedle.style.transform = 'rotate(' + rotateH + rotateM / 60 + 'deg' + ')';
minuteNeedle.style.transform = 'rotate(' + (rotateM + (rotateS / 60)) + 'deg' + ')';
secondNeedle.style.transform = 'rotate(' + rotateS + 'deg' + ')';
outer.style.transform = 'rotate(' + rotateS + 'deg' + ')'
}())
/* 因为页面的加载需要一定的时间,所以这里会有一定的误差 */
window.onload = function () {
setInterval(timer,1000);
function timer() {
var time = new Date();
var year = time.getFullYear();
var month = time.getMonth();
var dates = time.getDate();
var day = time.getDay();
var h = time.getHours();
var days = ['星期天','星期一','星期二','星期三','星期四','星期五','星期六'];
var divText = (month + 1) + '月' + dates + '日' + days[day];
date.innerHTML = divText;
h = h < 10 ? '0' + h : h;
var m = time.getMinutes();
m = m < 10 ? '0' + m : m;
var s = time.getSeconds();
s = s < 10 ? '0' + s : s;
hour.innerHTML = h ;
minute.innerHTML = m;
second.innerHTML = s;
timing.innerHTML = h + ':' + m ;
var rotateH = h * 30 ;
var rotateM = m * 6;
var rotateS = s * 6;
hourNeedle.style.transform = 'rotate(' + (rotateH + (rotateM / 60)) + 'deg' + ')';
minuteNeedle.style.transform = 'rotate(' + (rotateM + (rotateS / 60)) + 'deg' + ')';
secondNeedle.style.transform = 'rotate(' + rotateS + 'deg' + ')';
outer.style.transform = 'rotate(' + rotateS + 'deg' + ')'
}
}
clocker.onclick = function() {
clocker.style.display = 'none';
rot.style.display = 'block';
}
rot.onclick = function() {
rot.style.display = 'none';
clocker.style.display = 'block';
}
</script>

由于还没有学习canvas,技术水平不足,表盘的效果没有办法实现,圆环的实现,也只是通过了简单的裁剪,想不到实现圆弧的效果

代码有点长,如需完整代码,可以留言或私信


更多CSS特效

文字抖动效果
旋转魔方效果
文字闪烁效果
加载动画效果
炫彩流光按钮
原生js轮播图效果
文字折叠效果

圆盘时钟效果 原生JS的更多相关文章

  1. 五星评分效果 原生js

    五星评分在很多地方都可以用到,网上也有插件或者相应的代码,在这里我给大家提供一款我自己写的超级简单实用的五星评分代码,连图片都不需要 <!-- 评分start --> <ul> ...

  2. 导航栏4种效果---原生js

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. 基于canvas的原生JS时钟效果

    概述 运用html5新增画布canvas技术,绘制时钟效果,无需引用任何插件,纯js. 详细 代码下载:http://www.demodashi.com/demo/11935.html 给大家介绍一个 ...

  4. 原生JS实现"旋转木马"效果的图片轮播插件

    一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...

  5. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  6. 原生JS封装简单动画效果

    原生JS封装简单动画效果 一致使用各种插件,有时候对原生JS陌生了起来,所以决定封装一个简单动画效果,熟悉JS原生代码 function animate(obj, target,num){ if(ob ...

  7. 原生JS实现分页效果2.0(新增了上一页和下一页,添加当前元素样式)

    虽然写的很烂,但至少全部都是自己写的,因为这个没有固定的顺序,所以就没有封装,如果你技术好的话,可以你写的分享给我,谢谢. <!DOCTYPE html><html lang=&qu ...

  8. 原生JS实现分页效果1.0

    不太完整,写的太急,等等加上完整注释,写起来还是有些难度的,写的有点水,后面再改进改进. <!DOCTYPE html><html lang="en">&l ...

  9. 仿jQuery的siblings效果的js原生代码

    仿jQuery的siblings效果的js原生代码 <previousSibling> 属性返回选定节点的上一个同级节点(在相同树层级中的前一个节点). <nextSibling&g ...

随机推荐

  1. 序列化 pickle模块

    1. pickle 简介 2. pickle 核心函数 3. pickle 高级 -- 复杂对象 1. 持久化与 pickle 简介 1.1 什么是持久化? 持久化的基本思想很简单.假定有一个 Pyt ...

  2. 抛弃vuex ,拥抱ts,手撸泛型Store<T>!

    前段时间学习了下vue3 和ts ,就尝试下做了个项目,结果发现vuex和ts几乎无法结合,越写越别扭,开始怀疑用ts就是自己给自己挖坑,然后加了几个vue相关的群,去抱怨了几句,得到大佬指点:你可以 ...

  3. PAT 乙级 -- 1002 -- 写出这个数

    题目: 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式:在一行内输出n的各位数字 ...

  4. WinDbg 配置联机调试环境搭建

    接下来设置虚拟机启动模式,可以直接设置现在的虚拟机启动项为debug模式 或者直接新建一个启动项目 bcdedit /dbgsettings {serial [baudrate:value][debu ...

  5. Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-下

    4.3  和数据相关的操作符和伪指令 操作符和伪指令并非机器可执行的指令,相反,它们是由汇编器进行解释的.开发者可以使用一系列的MASM操作符或伪指令获取数据的地址以及大小等特征信息: OFFSET操 ...

  6. <JVM下篇:性能监控与调优篇>03-JVM监控及诊断工具-GUI篇

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  7. 一句 Task.Result 就死锁, 这代码还怎么写?

    一:背景 1. 讲故事 前些天把 .NET 高级调试 方面的文章索引到 github 的过程中,发现了一个有意思的评论,详见 文章,截图如下: 大概就是说在 Winform 的主线程下执行 Task. ...

  8. Asp.NetCore 自定义中间件

    这节演示一下自定义中间件,第一节我们讲到,中间件的处理流程就像一个俄罗斯套娃,那这种俄罗斯套娃型的流程内部是如何实现的呢,下面请看代码​. ​第一种写法是直接写在Configure方法中的,使用app ...

  9. Ubuntu执行命令时,不sudo提示权限不足,sudo提示找不到该命令

    问题:Ubuntu执行命令时,不sudo提示权限不足,sudo提示找不到该命令 补充描述:尝试将命令所在路径添加到/etc/profile中(所有用户环境变量),结果sudo -i切换到root用户后 ...

  10. SE_Work3_结队项目

    项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 要求:求交点个数 结对项目作业 班级:005 Sample GitHub地址 intersect 北航网盘地址 SE结队项目 1. PS ...