如图所示,这是一个类似算盘的时钟作用,三个颜色从上往下别离代表时分秒,算盘左边的算珠即是对应的当时时刻。
本次文章将解析如何用代码完成这个时钟作用,依据上面的动图分分出我们要完成的几个主要功能点:
- 每个珠子代表一个数字,每行珠子的数量和方位反映了时刻的一个特定部分(如小时、分钟或秒)
- 算珠的动画从右往左,到十位整数时算珠一切康复到右侧
- 每过一秒刷新整个算盘时钟
完成进程
HTML
在HTML中,我们有一个具有abaclock
类名的<div>
元素,用作整个算盘时钟的容器。在容器中包含了多个子元素,其间每个子元素代表一个数字位,经过data-beads
特点来指定该位的数字范围。还能够经过style
特点自界说子元素的颜色。
<div class="abaclock">
<div data-beads=2 style="--color: red"></div>
<div data-beads=10 style="--color: red"></div>
<div data-beads=6 style="--color: green"></div>
<div data-beads=10 style="--color: green"></div>
</div>
CSS
接着是CSS部分,界说了.abaclock
的样式。CSS运用了自界说特点(如--max-beads
和--min-beads-gap
,用于设置最大珠子数和最小珠子距离。),grid布局,以及伪元素来创立算盘的视觉作用。
--max-beads: 10;
--min-beads-gap: 4;
盘算的视觉作用是依据linear-gradient
线性突变完成,且都是依据伪元素完成,中心的突变代码定位为以下变量,以便于多个当地调用。
--grad: hsl(0 0% 100% / .25), hsl(0 0% 100% / .5) 25%, hsl(0 0% 0% / .5) 90%;
关于不同的颜色只需求增加 background-color
即可,例如算盘种的两边框和传过算珠的档便是运用了不同的背景色。
算珠部分选用flex
布局,默认设置为 justify-content: flex-end;
将算珠放置在右侧。
算珠移动的进程时经过设置 transform: translateX
平移完成,
那些具有data-active="true"
特点的元素代表需求进行平移操作,经过translateX()
函数将元素沿X轴进行平移。
[data-active=true] {
transform: translateX(calc(-100% * (var(--max-beads) - var(--beads, var(--max-beads)) + var(--min-beads-gap,1))));
}
计算逻辑如下:
-
--max-beads
表明该数字位上的最大珠子数。 -
--beads
表明当时活动的珠子数,默认值为--max-beads
,即悉数珠子都处于活动状况。 -
--min-beads-gap
表明珠子间的最小距离数,默认值为1。
依据这些参数计算得出的结果是一个负百分比值,经过乘以-100%
来完成向左平移的作用。
这段代码的作用是依据当时数字位上的活动珠子个数,对珠子进行相应的平移,然后显现出正确的时刻数字。经过调整--beads
和其他相关参数的值,能够控制每个数字位上显现的珠子数量,并依据实际需求进行调整。
最终是增加平移的过渡作用,增加 transition: transform 0.5s;
即可。
JavaScript
最终是JavaScript部分,界说了一个名为abaclock的函数,这个函数会创立并更新算盘时钟的时刻。
初始化: 经过查询选择器获取一切珠子的行和展示的数字时刻time
元素。
const abaclockRows = document.querySelectorAll(selector + '>[data-beads]');
const timeEl = document.querySelector(selector + '>time');
if(!abaclockRows) return
创立珠子: 依据data-beads特点的值,动态创立每行的珠子。
const digitEls = [];
abaclockRows.forEach(digitEl => {
const beads = Number(digitEl.dataset.beads);
digitEl.style.setProperty("--beads", beads);
const beadEls = [];
digitEls.push(beadEls)
for(let i = 0; i < beads; i++) {
const beadEl = document.createElement("i")
digitEl.append(beadEl);
beadEls.push(beadEl);
}
})
时刻更新: 运用toLocaleTimeString方法格局化当时时刻,以便获取到的时刻格局为 17:21:21
这样的的格局。并更新每行珠子的状况active
和time
元素的显现。
function time(){
const options = { hour12: false, hour: "2-digit", minute: "2-digit", second: "2-digit"};
const str = new Date().toLocaleTimeString([], options);
str.match(/d/g).forEach((d, di) => digitEls[di].forEach((b, bi) => b.dataset.active = bi < d));
timeEl.dateTime = timeEl.innerHTML = str;
window.requestAnimationFrame(time);
}
time();
依据以上的代码每一秒[data-beads]
元素内部的i
都会实时更新特点状况active
,然后和上面的CSS代码中的[data-active=true]
相关触发算珠的动画作用。
这段代码的中心在于它如何将当时时刻转换成算盘的形式来显现。每个珠子代表一个数字,每行珠子的数量和方位反映了时刻的一个特定部分(如小时、分钟或秒)。JavaScript部分的time函数会在每一帧更新这些珠子,然后实时显现当时时刻。
在线预览
码上地址:
最终
本文解析了算盘时钟的代码完成进程,这个一个立异的时钟显现作用,将传统的算盘规划与现代的前端技能结合起来。这个时钟界面不仅风趣而且具有学习意义。这种方法展示了现代Web技能在创造性视觉作用方面的潜力,合适用于教育、文娱或展示在网页的一个独特的小组件。有爱好的朋友能够尝试看看~
参阅
https://codepen.io/MarkBoots/pen/WNPgRLN
看完本文假如觉得有用,记得点个赞支撑,收藏起来说不定哪天就用上啦~
专注前端开发,分享前端相关技能干货,大众号:南城大前端(ID: nanchengfe)