拟态时钟动画

效果展示

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 分钟前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
风骏时光牛马17 分钟前
前沿视界
前端
kyriewen21 分钟前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员
陈随易38 分钟前
3000 万人在用的翻译插件,重写一遍就是一门生意
前端·后端·程序员
IT_陈寒1 小时前
Vue的这个响应式陷阱,差点让我加班到天亮
前端·人工智能·后端
choumou_M1 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
程序员大阳1 小时前
HTML+CSS+JS对话式实战(9)-项目总结与问题分析
javascript·css·html·实战·项目总结
Flynt2 小时前
别写拖拽行为,只声明"能拖到哪":UIST 最佳论文的拖拽方案我实测了
前端·svg·preact
Moment3 小时前
代码都能让 Agent 写了,我们为什么还要学前端?
前端·后端·面试
Hilaku3 小时前
MCP 协议会成为前端 AI 工程的标准接口吗?
前端·javascript·程序员