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

写在前面

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

实现效果

实现原理

数字时钟

  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. (七)docker-compose 安装

    一.Docker-Compose简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排. Docker-Compose将所管理的容器分为三层,分别 ...

  2. (二十)VMware Harbor - API

    可以用swagger在线解析 http://editor.swagger.io/将swagger.yaml中的内容拷贝到里面即可. 官方文档说明链接如下:https://github.com/vmwa ...

  3. Go之Zap日志库集成Gin

    简介 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1 . 能够将事件记录到文件中,而不是应用程序控制台; 2 . 日志切割-能够根据文件大小.时间或间隔等来切割日志文件; ...

  4. Puzzle UVA - 227 PE代码求大佬指点

    ​ A children's puzzle that was popular 30 years ago consisted of a 5×5 frame which contained 24 smal ...

  5. Kickdown UVA - 1588

    A research laboratory of a world-leading automobile company has received an order to create a specia ...

  6. C++雾中风景17:模板的非推断语境与std::type_identity

    乍一看这个标题很玄乎,但是其实这只是涉及一个很简单的CPP的模板推导的知识点. 笔者近期进行CPP开发工作时,在编译时遇到了如下的模板类型的推断错误:note: candidate template ...

  7. sqlserver2018 报错恢复

    报错: Description: SQL Server 检测到基于一致性的逻辑 I/O 错误 校验和不正确(应为: 0xb2b1af16,但实际为: 0xac9393a2).在文件 'C:\Progr ...

  8. POJ 1961 KMP(当前重复次数)

    题意:       前缀重复次数,举个例子,aaa 2的位置2个a,3的位置3个a abcabcabc 6的位置两个abcabc,9的位置三个abcabc.... 思路:      KMP基础题目之一 ...

  9. 手脱UPX3.91壳(练习)

    0x01 准备 OD UPX加壳程序 可以加壳的软件 0x02 给软件加壳 我找了半天发现winhex不错,而且是没壳的可以直接加壳 1.复制一份可执行文件 将赋值好的文件用UPX3.91加壳 0x0 ...

  10. 通过 Netty、ZooKeeper 手撸一个 RPC 服务

    说明 项目链接 微服务框架都包括什么? 如何实现 RPC 远程调用? 开源 RPC 框架 限定语言 跨语言 RPC 框架 本地 Docker 搭建 ZooKeeper 下载镜像 启动容器 查看容器日志 ...