点击查看
简介
实现模拟时钟的效果,大致思路和解决方案如下:
- 分别获取到当前时间的时、分、秒。
- 通过时分秒对一圈360度,进行映射,确定每一个指针所需旋转的角度。
- 通过CSS的
transform:rotate(deg)
,来实时的调整指针在键盘中的位置。
页面布局
1 2 3 4 5 6 7
| <div class="clock"> <div class="clock-face"> <div class="hand hour-hand"></div> <div class="hand min-hand"></div> <div class="hand second-hand"></div> </div> </div>
|
CSS样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| <style> html { background: #018DED url(http://unsplash.it/1500/1000?image=881&blur=50); background-size: cover; font-family: 'helvetica neue'; text-align: center; font-size: 10px; }
body { margin: 0; font-size: 2rem; display: flex; flex: 1; min-height: 100vh; align-items: center; }
.clock { width: 30rem; height: 30rem; border: 20px solid white; border-radius: 50%; margin: 50px auto; position: relative; padding: 2rem; box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.1), inset 0 0 0 3px #EFEFEF, inset 0 0 10px black, 0 0 10px rgba(0, 0, 0, 0.2); }
.clock-face { position: relative; width: 100%; height: 100%; transform: translateY(-3px); }
.hand { width: 50%; height: 6px; background: black; position: absolute; top: 50%; transform-origin: 100%; transform: rotate(90deg); transition: all 0.05s; transition-timing-function: cubic-bezier(0.1, 2.7, 0.58, 1); } </style>
|
涉及到的特性:
调整指针的初始位置以及旋转的轴点:transform-oragin
1
| transform-oragin: 100%; //初始化使三个指针全部指向12时
|
设置旋转角度
1
| transition: all //0.05s;设置动画时间为0.05秒
|
transition-timing-function: cubic-bezier(x, x, x, x)
设置 transition-time-function
的值,以实现秒针“滴答滴答”的效果。此外注意 transform
中的 rotate
(旋转)属性由角度来控制,可以试着在页面上修改这个参数来查看效果。
JS代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <script> const secondHand = document.querySelector('.second-hand'); const minsHand = document.querySelector('.min-hand'); const hourHand = document.querySelector('.hour-hand');
function setDate() { const now = new Date();
const seconds = now.getSeconds(); const secondsDegrees = ((seconds / 60) * 360) + 90; secondHand.style.transform = `rotate(${secondsDegrees}deg)`;
const mins = now.getMinutes(); const minsDegrees = ((mins / 60) * 360) + ((seconds / 60) * 6) + 90; minsHand.style.transform = `rotate(${minsDegrees}deg)`;
const hour = now.getHours(); const hourDegrees = ((hour / 12) * 360) + ((mins / 60) * 30) + 90; hourHand.style.transform = `rotate(${hourDegrees}deg)`; }
setInterval(setDate, 1000);
setDate(); </script>
|
1 2 3
| const secondHand = document.querySelector('.second-hand'); const minsHand = document.querySelector('.min-hand'); const hourHand = document.querySelector('.hour-hand');
|
1 2 3 4
| const now = new Date(); const seconds = now.getSeconds(); const mins = now.getMinutes(); const hour = now.getHours();
|
1 2 3
| const secondsDegrees = ((seconds / 60) * 360) + 90; const minsDegrees = ((mins / 60) * 360) + ((seconds / 60) * 6) + 90; const hourDegrees = ((hour / 12) * 360) + ((mins / 60) * 30) + 90;
|
1 2 3
| secondHand.style.transform = `rotate(${secondsDegrees}deg)`; minsHand.style.transform = `rotate(${minsDegrees}deg)`; hourHand.style.transform = `rotate(${hourDegrees}deg)`;
|
1
| setInterval(setDate, 1000);
|