圆盘时钟效果 原生JS
圆盘时钟 旋转时钟 数字时钟
写在前面
仿荣耀手机时钟,设计的同款时钟效果
实现效果

实现原理
数字时钟
- 利用
Date内置对象获取当下的时间,通过处理呈现在页面上
这一步获取时间是非常简单的,通过
Date下的一些属性就可以实现了
- 背景采用的是一个炫彩流光的效果,利用了CSS3新增的动画效果
这部分的炫彩流光效果在之前的博客中有详细讲到
指针时钟
通过定位将三根针重叠在一起,下端对齐都摆在原点,通过
transfrom-origin属性,将旋转原点定为底部,也就是,让三根针转的时候绕中心点转在获取到时间的基础上,将时间转化为旋转的角度,每一个小时时针转30度,每分钟分钟转6度,每秒钟秒针转6度
这里有一点点的计算,需要理解一下
- 为了让分针和时针是缓慢移动的,而不是突然间的抖动,让秒针转的时候,实时反馈给分针,分针转的时候反馈给时针
'rotate(' + (rotateH + (rotateM / 60)) + 'deg' + ')'
就像这样把分针旋转了多少反馈给时针,60分钟一个小时,所以是除以60
旋转时钟
- 这里采用的是
clip-path属性采取另一半的圆,圆环的效果采用的是大小圆的思路,用小圆盖在大半圆的上方 - 圆环的旋转和指针的旋转异曲同工,圆环是反馈秒钟的,只需根据秒钟来判断即可
- 为了让圆能够自转,需要将旋转原点设置为圆的中心点
实现代码
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的更多相关文章
- 五星评分效果 原生js
五星评分在很多地方都可以用到,网上也有插件或者相应的代码,在这里我给大家提供一款我自己写的超级简单实用的五星评分代码,连图片都不需要 <!-- 评分start --> <ul> ...
- 导航栏4种效果---原生js
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 基于canvas的原生JS时钟效果
概述 运用html5新增画布canvas技术,绘制时钟效果,无需引用任何插件,纯js. 详细 代码下载:http://www.demodashi.com/demo/11935.html 给大家介绍一个 ...
- 原生JS实现"旋转木马"效果的图片轮播插件
一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...
- React.js实现原生js拖拽效果及思考
一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...
- 原生JS封装简单动画效果
原生JS封装简单动画效果 一致使用各种插件,有时候对原生JS陌生了起来,所以决定封装一个简单动画效果,熟悉JS原生代码 function animate(obj, target,num){ if(ob ...
- 原生JS实现分页效果2.0(新增了上一页和下一页,添加当前元素样式)
虽然写的很烂,但至少全部都是自己写的,因为这个没有固定的顺序,所以就没有封装,如果你技术好的话,可以你写的分享给我,谢谢. <!DOCTYPE html><html lang=&qu ...
- 原生JS实现分页效果1.0
不太完整,写的太急,等等加上完整注释,写起来还是有些难度的,写的有点水,后面再改进改进. <!DOCTYPE html><html lang="en">&l ...
- 仿jQuery的siblings效果的js原生代码
仿jQuery的siblings效果的js原生代码 <previousSibling> 属性返回选定节点的上一个同级节点(在相同树层级中的前一个节点). <nextSibling&g ...
随机推荐
- shell脚本 4 函数与正则
shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直接调用该段代码. 格式 func() { #指定函数名 ...
- 11. VUE 数组操作
变异方法 Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新.这些方法如下: push() 添加元素 <ul id="example-1"> <li ...
- 从中国加入WTO来看Java设计模式:中介者模式
目录 应用场景 中介者模式 定义 意图 主要解决问题 何时使用 优缺点 世界贸易组织WTO 应用场景 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象 想通过一个 ...
- Kickdown UVA - 1588
A research laboratory of a world-leading automobile company has received an order to create a specia ...
- 看从小自带BUFF的他,如何用代码降低万物互联的门槛
摘要:3岁下象棋,5岁解方程!他说物联网开发就像打怪玩游戏 本文分享自华为云社区<HDC.Cloud2021 | 华为云IoT开发者:用代码降低万物互联的门槛>,原文作者:华为云头条 . ...
- NodeJS中的LRU缓存(CLOCK-2-hand)实现
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.codeproject.com/Articles/5299328/LRU- ...
- boltdb的实现和改进
整个代码不是很复杂,可以从代码中理解如何实现. 特点:btree,很小巧,但实现了完整事务机制,稳定,即使丢电也不会导致数据库错误. 整个结构如下: meta page (前两页) --- > ...
- 【feign】拦截输出日志
方法一: 使用Feign拦截器 /** * @author: Sam.yang * @date: 2020/11/12 16:55 * @desc: feign请求拦截 */ @Slf4j @Comp ...
- hdu3756 三分求最小圆锥
题意: 让你找到一个最小的圆柱去覆盖所有的竖直的线段.. 思路: 三分,直接去三分他的半径,因为想下,如果某个半径是最优值,那么 从R(MAX->now->MIN) ...
- Linux下逻辑卷LVM的管理和RAID磁盘阵列
目录 LVM 一:LVM的创建 二:LVM的拉伸 三:LVM的缩小 四:LVM的删除 五:RAID磁盘阵列的添加 LVM LVM(Logical Volume Manager) 逻辑卷管理器,可以动态 ...