本帖最后由 马黑黑 于 2022-3-20 10:37 编辑
我打算用CSS驱动这个数字表盘的时钟,就是说,用 rotate 来旋转时分秒指针,这样得出的效果是秒针该是平滑运行的,就像我客厅里的石英钟那样。
但这里存在一个问题:rotate 将元素从角度1转动360deg,元素要能平滑运行的话受驱动的元素其初始角度必须是它自然存在时的角度,默认是 0deg,从 0deg 转到 360deg,它的运行是平滑的。但作为指针,它不太可能从0deg开始转动,因为它依据当前时间决定自己在时钟上的指向。以秒针为例,它可能会从 45deg 起步,我们来看看以下代码循环运行CSS动画会有什么效果:
<style> .rectBox { width: 80px; height: 10px; background: olive; transform-origin: 100% 100%; transform: rotate(45deg); //模拟秒针当前时间应在的位置 animation: Roll 60s linear infinite; } @keyframes Roll { to {transform: rotate(360deg); } } </style>
<div class="rectBox"></div>
观察一下效果:
虽然可以持续运行,但每一圈都有一个跳动的现象,秒针不可以有这样的行为。
解决思路有两个:
其一,指针作为子元素放置在一个没有背景色的父元素里,指针在父元素中按当前时间初始化自己的角度,然后父元素匀速做 transform 的 rotate 动作。父元素未做初始化转换,所以它运行到 1turn 即 360deg 是平滑的,指针在它上面跟着走就能平滑运转。
其二,改变 @keyframes 动画机制,from xxdeg to 360deg + xxdeg。此法也能令受驱动元素平滑运动,但会给时钟的开发带来额外的编程开销还不见得好实现,所以不考虑使用。
那就使用方法一,给指针加一个父元素:
HTML代码:
<div class="papaBox"> <div class="rectBox"></div> </div>
CSS代码:
.papaBox { margin: 100px 0; width: 80px; height: 10px; background: transparent; transform-origin: 100% 100%; animation: Roll 2s linear infinite; }
.rectBox1 { width: 80px; height: 10px; background: olive; transform-origin: 100% 100%; transform: rotate(45deg);
} @keyframes Roll { to {transform: rotate(360deg); } }
观察运行效果:
|