拟态时钟动画

效果展示

CSS 知识点

  • box-shadow 属性灵活运用

    通过此属性来创建效果较好的仪表盘效果。

页面整体布局

html 复制代码
<!-- 时钟 -->
<div class="clock">
  <div class="numbers">
    <span style="--i:0"><b>12</b></span>
    <span style="--i:1"><b>3</b></span>
    <span style="--i:2"><b>6</b></span>
    <span style="--i:3"><b>9</b></span>

    <div class="circle" id="hr"><i></i></div>
    <div class="circle" id="mn"><i></i></div>
    <div class="circle" id="sc"><i></i></div>
  </div>
</div>

编写时钟仪表盘

css 复制代码
.clock {
  position: absolute;
  top: 50%;
  right: 220px;
  transform: translateY(-50%);
  width: 400px;
  height: 400px;
  display: flex;
  justify-content: center;
  align-items: center;
  background: #c9d5e0;
  border-radius: 50px;
  box-shadow: 30px 30px 30px -10px rgba(0, 0, 0, 0.15), inset 15px 15px 10px
      rgba(255, 255, 255, 0.75), -15px -15px 35px rgba(255, 255, 255, 0.55), inset -1px -1px
      10px rgba(0, 0, 0, 0.2);
}

绘制时钟上的数值

css 复制代码
.clock .numbers {
  position: absolute;
  inset: 35px;
  background: #152b4a;
  border-radius: 50%;
  box-shadow: 5px 5px 15px #152b4a66, inset 5px 5px 5px rgba(255, 255, 255, 0.55),
    -6px -6px 10px rgba(255, 255, 255, 1);
}

.clock .numbers span {
  position: absolute;
  inset: 5px;
  text-align: center;
  color: #fff;
  font-size: 1.25em;
  transform: rotate(calc(90deg * var(--i)));
}

.clock .numbers span b {
  font-weight: 600;
  display: inline-block;
  transform: rotate(calc(-90deg * var(--i)));
}

绘制时钟的指针

css 复制代码
.clock .numbers .circle {
  position: absolute;
  inset: 0;
  border-radius: 50%;
  display: flex;
  justify-content: center;
  z-index: 10;
}

.clock .numbers .circle i {
  position: absolute;
  width: 3px;
  height: 50%;
  background: #fff;
  transform-origin: bottom;
}

.clock .numbers .circle#hr i {
  transform: scaleY(0.5);
  width: 4px;
}

.clock .numbers .circle#mn i {
  transform: scaleY(0.65);
}

.clock .numbers .circle#sc i {
  width: 2px;
  transform: scaleY(0.7);
  background: #e91e63;
  box-shadow: 0 30px 0 #e91e63;
}

编写时钟边框(中心圆)

css 复制代码
.clock .numbers::before {
  content: "";
  position: absolute;
  inset: 35px;
  background: linear-gradient(#2196f3, #e91e63);
  border-radius: 50%;
  animation: animate 2s linear infinite;
}

.clock .numbers::after {
  content: "";
  position: absolute;
  inset: 38px;
  background: #152b4a;
  border-radius: 50%;
}

编写时钟事件

javascript 复制代码
let hr = document.querySelector("#hr");
let mn = document.querySelector("#mn");
let sc = document.querySelector("#sc");

setInterval(() => {
  let day = new Date();
  let hh = day.getHours() * 30;
  let mm = day.getMinutes() * 6;
  let ss = day.getSeconds() * 6;

  hr.style.transform = `rotateZ(${hh + mm / 12}deg)`;
  mn.style.transform = `rotateZ(${mm}deg)`;
  sc.style.transform = `rotateZ(${ss}deg)`;
}, 1000);

完整代码下载

完整代码下载

相关推荐
咩咩啃树皮6 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
阳光是sunny6 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
触底反弹6 小时前
一文搞懂 Tailwind CSS 弹性布局:从原理到实战
前端·css·html
阳光是sunny7 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
小林ixn7 小时前
从 ??= 到 onKeyDown:一个 React 组件的“自我修养”
前端·javascript·react.js
REDcker8 小时前
显示分辨率标准对照详解
前端·网络·分辨率·显示·屏幕
世人万千丶8 小时前
参数管理_Flutter在鸿蒙平台路由参数最佳实践
学习·flutter·华为·harmonyos·鸿蒙
এ慕ོ冬℘゜8 小时前
前端实战:jQuery 多条件联合搜索(标题模糊查询 + 日历时间段筛选)
前端·javascript·jquery
武子康8 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
一点一木9 小时前
从60首歌到1个网站:输入你的故事,还你一首歌
前端·github