自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

純 CSS 實現(xiàn)一個計時器

開發(fā) 前端
CSS 現(xiàn)在可不僅僅只是改一個顏色這么簡單,還可以做很多交互,比如做一個功能齊全的計時器?

CSS 現(xiàn)在可不僅僅只是改一個顏色這么簡單,還可以做很多交互,比如做一個功能齊全的計時器?

圖片

樣式上并不復雜,主要是幾個交互的地方

  1. 數(shù)字時鐘的變化
  2. 開始、暫停操作
  3. 重置操作

如何僅使用 CSS 來實現(xiàn)這樣的功能呢?一起看看吧

一、數(shù)字時鐘的變化

這里簡單介紹一下實現(xiàn)原理。

在以前,如果要實現(xiàn)數(shù)字的遞增變化,可能需要提前準備好這些數(shù)字,例如像這樣。

<span>
<i>1</i>
<i>2</i>
...
<i>59</i>
</span>

或者用偽元素創(chuàng)建也行。

span::before{
content: '1\A 2\A 3\A ... 59'
}

這種方式需要創(chuàng)建多個標簽,略微繁瑣,也不易擴展?,F(xiàn)在有更簡潔的方式可以實現(xiàn)了,那就是 CSS @property[2]。這是干什么的呢?簡單來講,可以自定義屬性,在這個例子中,可以讓數(shù)字像顏色一樣進行過渡和動畫,可能不太懂,直接看例子吧

假設 HTML 是這樣的。

<span style="--num: 0"></span>

我們讓這個自定義變量在頁面中展示出來,單純的 content無法直接顯示自定義變量,需要借助計數(shù)器,有興趣的可以參考這篇文章:小tips: 如何借助content屬性顯示CSS var變量值[3]

span::after{
counter-reset: num var(--num);
content: counter(num);
}

圖片

現(xiàn)在可以通過:hover改變這個數(shù)字。

span:hover::after{
--num: 59
}

圖片

很生硬的從 0 變成 59 了,非常符合常規(guī),因為--num?并不支持過渡動畫。如果利用 CSS property,情況就不一樣了,需要改造的地方很少,先定義一下--num,然后給這個變量一個過渡時間,如下:

@property --num { 
syntax: '<integer>';
inherits: false;
initial-value: 0;
}
span::after{
transition: 1s --num;
}

神奇的一幕發(fā)生了。

圖片

看著好像不可思議?可以這么理解,通過@property定義后,這個變量本身可以單獨設置過渡了,而不再取決于一些僅支持過渡的屬性(color、width等)。還可以使用動畫,如下:

@keyframes num {
to {
--num: 10
}
}
span{
animation: num 1s infinite steps(10);
}

數(shù)字變化的基本原理就是這樣了,一個無限循環(huán)的 CSS 動畫!

圖片

回到這里,這里需要的是一個秒表,分為“分”、“秒”、“毫秒”(這里的毫秒就用 1/100秒來代替),3個數(shù)字的動畫時長都不一致,所以需要定義3個 CSS 變量,完整實現(xiàn)如下:

@keyframes minitus {
to {
--m: 59
}
}
@keyframes seconds {
to {
--s: 59
}
}
@keyframes ms {
to {
--ms: 99
}
}
span{
counter-reset: minitus var(--m) seconds var(--s) ms var(--ms);
animation: minitus 3600s infinite steps(60, end),
seconds 60s infinite steps(60, end),
ms 1s infinite steps(100, end);
}
span::before{
content: counter(minitus, decimal-leading-zero) ':' counter(seconds, decimal-leading-zero) ':' counter(ms, decimal-leading-zero);
}

這樣就得到了一個自動運行的秒表。

圖片

二、開始、暫停操作

首先思考一下,CSS 需要怎樣記住點擊操作?答案就是input type="checkbox"(通過label關聯(lián)),可以這樣來布局。

<div class="counter">
<input type="checkbox" id="start" hidden>
<label class="btn start" for="start"></label>
<label class="btn reset">重置</label>
<div class="clock"></div>
</div>

因為需要通過input:cheked來控制秒表的狀態(tài),需要借助后置兄弟選擇器~來實現(xiàn),所以input需要在前面(當然,現(xiàn)在有了:has也可以不需要這樣)。

這里可以通過grid布局來靈活擺放各個模塊的位置。

.counter{
display: grid;
grid-template-areas:
"clock clock"
"start reset"
}
.start{
/**/
grid-area: start;
}
.reset{
/**/
grid-area: reset;
}

簡單美化以后,可以得到這樣的效果:

圖片

然后,由于秒表的運行其實就是一個 CSS 動畫,所以我們可以直接用:cheked來控制動畫的狀態(tài),默認設置成暫停的,還有按鈕文字也可以通過::before來生成,實現(xiàn)如下:

.clock{
animation-play-state: paused;/*默認暫停*/
}
.start::before{
content: '開始';
}
:checked~.start::before{
content: '暫停';
}
:checked~.clock{
animation-play-state: running;
}

這樣就可以通過按鈕手動控制開始和暫停了

圖片

三、重置操作

重置看起來好像有點麻煩,有點無從下手。

其實重置一個動畫非常簡單,直接將動畫取消就可以了,也就是相當于重置了動畫,如下:

.reset:active+.clock{
animation: none;
}

其次,重置一般只有在暫停時才可用,所以還需要用前面的:checked禁用一下,并且視覺上可以透明度降低一點,實現(xiàn)如下:

:checked~.reset{
opacity: .65;
pointer-events: none;
}

這樣就得到了文章開頭所示的效果:

圖片

當然,你還可以使用自定義字體,比如DigitalNumbers。

圖片

完整代碼可以查看以下任意鏈接:

  • CSS counter (juejin.cn)[4]
  • CSS counter (codepen.io)[5]
  • CSS counter (runjs.work)[6]

四、會影響業(yè)務邏輯嗎?

還有一點,有同學擔心 CSS 只是視覺層面的,可能會影響業(yè)務邏輯。

圖片

確實,由于是偽元素渲染,頁面上看不到任何數(shù)字,也就是無法直接通過innerText獲取當前時間,但是,我們可以借助getComputedStyle來得到 CSS 變量。

getComputedStyle($0).getPropertyValue('--ms')

實時獲取如下:

圖片

所以通過 CSS 方式也是完全不影響業(yè)務邏輯的。

五、兼容性和總結

由于在實現(xiàn)中用到了CSS @property特性,這是CSS Houdini的一部分,目前只有 Chrome 支持(可惜了??)。讓人驚奇的是,Safari居然在前不久也支持了這個特性,未來可期,如下:

圖片

當然這不是重點,只是這種方式實現(xiàn)更加簡潔而已,完全可以用傳統(tǒng)方式來實現(xiàn),有興趣的可以嘗試一下。

下面總結一下實現(xiàn)要點

  1. CSS 現(xiàn)在很強大,不僅僅只是樣式,還能做很多交互。
  2. CSS @property 可以使CSS變量支持動畫。
  3. 數(shù)字時鐘的變化其實是一個CSS變量不斷遞增循環(huán)的動畫。
  4. CSS 點擊操作狀態(tài)可以通過:checked控制。
  5. Grid 布局可以很方便的控制各個元素的位置。
  6. 計時器開始和暫停其實就是動畫的運行和暫停。
  7. 直接將動畫取消就相當于重置了整個動畫。

參考資料

[1]還在使用定時器嗎?CSS 也能實現(xiàn)電子時鐘: https://juejin.cn/post/7083339388511322143?。

[2]CSS @property: https://developer.mozilla.org/zh-CN/docs/Web/CSS/@property?。

[3]小tips: 如何借助content屬性顯示CSS var變量值: https://link.juejin.cn?target=https%3A%2F%2Fwww.zhangxinxu.com%2Fwordpress%2F2019%2F05%2Fcontent-css-var%2F?。

[4]CSS counter (juejin.cn): https://code.juejin.cn/pen/7221511863551410237?。

[5]CSS counter (codepen.io):  

[6]CSS counter (runjs.work): https://runjs.work/projects/6d3305ab2de14840?。

責任編輯:姜華 來源: 前端偵探
相關推薦

2020-06-11 08:48:49

JavaScript開發(fā)技術

2022-06-28 15:29:56

Python編程語言計時器

2022-06-19 20:48:06

樹莓派Linux

2013-05-23 16:01:47

Android開發(fā)移動開發(fā)Chronometer

2024-03-13 08:21:53

冒泡排序動畫

2011-05-31 16:50:35

Android 線程

2012-05-08 13:58:37

SharePoint

2024-09-02 00:03:00

tabs組件CSS

2025-03-26 01:35:00

tabs開發(fā)組件

2021-11-26 00:04:20

Go計時器重構

2023-01-11 09:02:50

2011-09-08 14:01:01

Android Wid實例

2013-03-25 10:03:35

網絡優(yōu)化網絡抑制快速認知網絡

2023-12-11 09:50:35

Linux定時器

2010-01-05 15:00:30

.NET Framew

2021-10-19 22:23:47

CSSBeautiful按鈕

2024-08-29 08:13:58

2010-01-25 11:29:33

Android計時器

2022-06-23 07:23:34

自定義組件計時器

2023-05-22 09:10:53

CSSloading 效
點贊
收藏

51CTO技術棧公眾號