0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CSS 計(jì)數(shù)器的數(shù)字遞增動(dòng)效技術(shù)解析

454398 ? 來(lái)源:oschina ? 作者:李中凱 ? 2020-10-18 10:09 ? 次閱讀

CSS 計(jì)數(shù)器是由 CSS 維護(hù)的變量,這些變量可根據(jù) CSS 規(guī)則增加從而跟蹤使用次數(shù)。我們可以利用這個(gè)特性,根據(jù)文檔位置來(lái)調(diào)整內(nèi)容表現(xiàn),比如顯示列表編號(hào)。

最近在公司官網(wǎng)就用到了這個(gè)特性:

image.png

因?yàn)檫@里的序號(hào)只是個(gè)裝飾,并不強(qiáng)調(diào)先后順序。比起使用真實(shí) DOM 元素顯示序號(hào),CSS 計(jì)數(shù)器更加簡(jiǎn)潔靈活,萬(wàn)一內(nèi)容順序需要調(diào)整,序號(hào)也不受影響。

有時(shí)候我們會(huì)看到某些 Dashboard 界面有數(shù)字快速滾動(dòng)的效果,比如招行 App 的賬戶余額。這種效果怎么實(shí)現(xiàn)呢?本文會(huì)介紹幾種方法。

JavaScript 方案

最簡(jiǎn)單的莫過(guò)于用setInterval定時(shí)器了,定期修改 DOM 內(nèi)容就行。不過(guò)為了實(shí)現(xiàn)更平順的動(dòng)畫(huà)效果,更推薦使用requestAnimationFrame:

functionanimateValue(obj,start,end,duration){
letstartTimestamp=null;
conststep=(timestamp)=>{
if(!startTimestamp)startTimestamp=timestamp;
constprogress=Math.min((timestamp-startTimestamp)/duration,1);
obj.innerHTML=Math.floor(progress*(end-start)+start);
if(progress

js.gif

CSS @keyframes 結(jié)合 margin

這個(gè)思路比較有意思,原理是把數(shù)字排成一行,通過(guò)動(dòng)畫(huà)移動(dòng)元素位置來(lái)顯示不同位置的數(shù)字:



0
1
2
3
4
5
6
7
8
9
10
.counter{
width:100px;
overflow:hidden;
}
.numbers{
width:auto;
display:flex;
animation:countNumber4sinfinitealternate;
animation-timing-function:steps(10);
}
.numbersdiv{
text-align:center;
flex:00100px;
}

@keyframescountNumber{
0%{
margin-left:0px;
}
100%{
margin-left:-1000px;
}
}

keyframe.gif

CSS 計(jì)數(shù)器入門(mén)版

CSS 計(jì)數(shù)器使用到以下幾個(gè)屬性:

counter-reset - 創(chuàng)建或者重置計(jì)數(shù)器

counter-increment - 遞增變量

content - 插入生成的內(nèi)容

counter() 或 counters() 函數(shù) - 將計(jì)數(shù)器的值添加到元素

要使用 CSS 計(jì)數(shù)器,得先用 counter-reset 創(chuàng)建。結(jié)合 CSS 動(dòng)畫(huà)@keyframes,在動(dòng)畫(huà)的不同階段設(shè)置不同的遞增值,就能實(shí)現(xiàn)這個(gè)效果:

div::after{
content:counter(count);
animation:counter3slinearinfinitealternate;
counter-reset:count0;
}

@keyframescounter{
0%{
counter-increment:count0;
}
10%{
counter-increment:count1;
}
20%{
counter-increment:count2;
}
30%{
counter-increment:count3;
}
40%{
counter-increment:count4;
}
50%{
counter-increment:count5;
}
60%{
counter-increment:count6;
}
70%{
counter-increment:count7;
}
80%{
counter-increment:count8;
}
90%{
counter-increment:count9;
}
100%{
counter-increment:count10;
}
}

CSS 計(jì)數(shù)器高配版

更進(jìn)一步,如果敢用最新特性,其實(shí)有更秀的操作,那就是給 CSS 變量設(shè)置動(dòng)畫(huà)。這個(gè)技巧的核心就是設(shè)置 CSS 自定義屬性為整數(shù)類型,這樣就能像其他擁有整數(shù)類型值的 CSS 屬性一樣,可用于transition中了。

@property--num{
syntax:'';
initial-value:0;
inherits:false;
}

div{
transition:--num1s;
counter-reset:numvar(--num);
}
div:hover{
--num:10000;
}
div::after{
content:counter(num);
}

不過(guò)需要注意的是,目前只有 Chrome (或者 Chromium 內(nèi)核的瀏覽器比如 Edge 和 Opera)支持@property語(yǔ)法,因此兼容性是個(gè)問(wèn)題。如果你的頁(yè)面只針對(duì) Chrome(比如 Electron 應(yīng)用),那就可以放心使用。否則還是用前面的保守方案吧。

小數(shù)也能玩動(dòng)畫(huà)

前面說(shuō)的變量都要求是整數(shù),那能不能讓小數(shù)也支持這種動(dòng)畫(huà)呢?答案是可以的。

可以把小數(shù)轉(zhuǎn)成整數(shù)。步驟原理是:

注冊(cè)一個(gè)整型的 CSS 變量(即--number),指定初始值initial-value。

用calc將值取整:--integer: calc(var(--number))

@property--integer{
syntax:"";
initial-value:0;
inherits:false;
}
--number:1234.5678;
--integer:calc(var(--number));/*1235*/

如果只需要提取整數(shù)部分,可以這樣:--integer: max(var(--number) - 0.5, 0),連calc()都不需要了。類似方法可以提取小數(shù)部分。

/*@property--integer*/
--number:1234.5678;
--integer:max(var(--number)-0.5,0);/*1234*/

完整代碼:

@property--percent{
syntax:"";
initial-value:0;
inherits:false;
}
@property--temp{
syntax:"";
initial-value:0;
inherits:false;
}
@property--v1{
syntax:"";
initial-value:0;
inherits:false;
}
@property--v2{
syntax:"";
initial-value:0;
inherits:false;
}

div{
font:80040pxmonospace;
padding:2rem;
transition:--percent1s;
--temp:calc(var(--percent)*100);
--v1:max(var(--temp)-0.5,0);
--v2:max((var(--temp)-var(--v1))*100-0.5,0);
counter-reset:v1var(--v1)v2var(--v2);
}
div::before{
content:counter(v1)"."counter(v2,decimal-leading-zero)"%";
}
constgenNumber=()=>{
document.querySelector("div").style.setProperty("--percent",Math.random());
};

setInterval(genNumber,2000);
setTimeout(genNumber);


編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    頻率計(jì)數(shù)器技術(shù)原理和應(yīng)用場(chǎng)景

    頻率計(jì)數(shù)器,又稱頻率計(jì),是一種專門(mén)用于測(cè)量信號(hào)頻率的電子測(cè)量?jī)x器。以下是對(duì)其技術(shù)原理和應(yīng)用場(chǎng)景的詳細(xì)分析:一、技術(shù)原理頻率計(jì)數(shù)器技術(shù)原理基
    發(fā)表于 10-18 14:03

    計(jì)數(shù)器的特點(diǎn)和參數(shù)

    計(jì)數(shù)器作為一種常用的電子元件,在電子設(shè)備和系統(tǒng)中扮演著至關(guān)重要的角色。它們不僅用于存儲(chǔ)和增減數(shù)字值,還廣泛應(yīng)用于時(shí)序和頻率測(cè)量、事件計(jì)數(shù)、控制步進(jìn)電機(jī)和伺服系統(tǒng)、錯(cuò)誤檢測(cè)和糾正以及計(jì)算機(jī)數(shù)據(jù)存儲(chǔ)和操作等領(lǐng)域。以下將詳細(xì)闡述
    的頭像 發(fā)表于 08-29 14:54 ?479次閱讀

    計(jì)數(shù)器同步和異步怎么判斷

    計(jì)數(shù)器同步和異步是數(shù)字電路設(shè)計(jì)中的一個(gè)重要概念,它們?cè)诤芏鄳?yīng)用場(chǎng)景中都扮演著關(guān)鍵角色。 一、計(jì)數(shù)器概述 計(jì)數(shù)器是一種常見(jiàn)的數(shù)字電路,它可以對(duì)
    的頭像 發(fā)表于 07-23 11:14 ?610次閱讀

    SN74HC193-Q1 4位同步遞增/遞減計(jì)數(shù)器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《SN74HC193-Q1 4位同步遞增/遞減計(jì)數(shù)器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 06-04 10:46 ?0次下載
    SN74HC193-Q1 4位同步<b class='flag-5'>遞增</b>/遞減<b class='flag-5'>計(jì)數(shù)器</b>數(shù)據(jù)表

    二進(jìn)制串行計(jì)數(shù)器工作原理是什么?

    的工作原理進(jìn)行深入解析,幫助你更好地理解這一數(shù)字電路的核心組件。 一、二進(jìn)制串行計(jì)數(shù)器的基本概念 二進(jìn)制串行計(jì)數(shù)器是一種基于二進(jìn)制數(shù)制的計(jì)數(shù)器
    的頭像 發(fā)表于 05-28 15:52 ?692次閱讀

    同步計(jì)數(shù)器和異步計(jì)數(shù)器的區(qū)別

    數(shù)字電子領(lǐng)域中,計(jì)數(shù)器是一種用于統(tǒng)計(jì)脈沖信號(hào)數(shù)量的重要設(shè)備。其中,同步計(jì)數(shù)器和異步計(jì)數(shù)器是兩種不同類型的計(jì)數(shù)器,它們?cè)诠ぷ髟?、特性以及?yīng)
    的頭像 發(fā)表于 05-24 14:36 ?3294次閱讀

    同步計(jì)數(shù)器的主要類型和工作原理

    數(shù)字電子領(lǐng)域,計(jì)數(shù)器是一種用于統(tǒng)計(jì)脈沖信號(hào)數(shù)量的設(shè)備,廣泛應(yīng)用于各種數(shù)字系統(tǒng)和電路中。其中,同步計(jì)數(shù)器作為計(jì)數(shù)器的一種重要類型,具有其獨(dú)特
    的頭像 發(fā)表于 05-24 14:34 ?1135次閱讀

    計(jì)數(shù)器的結(jié)構(gòu)和工作原理

    計(jì)數(shù)器,作為一種基礎(chǔ)的電子設(shè)備,廣泛應(yīng)用于數(shù)字電路、計(jì)算機(jī)系統(tǒng)以及工業(yè)自動(dòng)化等多個(gè)領(lǐng)域。它通過(guò)對(duì)輸入信號(hào)進(jìn)行計(jì)數(shù)和狀態(tài)轉(zhuǎn)換,實(shí)現(xiàn)對(duì)事件發(fā)生次數(shù)的統(tǒng)計(jì)和顯示。本文將深入探討計(jì)數(shù)器的定義、
    的頭像 發(fā)表于 05-23 15:34 ?4164次閱讀

    脈沖計(jì)數(shù)器的分類和作用

    在電子技術(shù)數(shù)字系統(tǒng)中,脈沖計(jì)數(shù)器作為一種基本而重要的邏輯器件,其應(yīng)用廣泛且功能多樣。脈沖計(jì)數(shù)器不僅能夠?qū)崿F(xiàn)基本的計(jì)數(shù)操作,還具備多種輸出功
    的頭像 發(fā)表于 05-15 17:11 ?915次閱讀

    簡(jiǎn)單認(rèn)識(shí)脈沖計(jì)數(shù)器

    數(shù)字電路和電子測(cè)量領(lǐng)域中,脈沖計(jì)數(shù)器作為一種基本而重要的工具,其應(yīng)用十分廣泛。脈沖計(jì)數(shù)器,也被稱為脈沖頻率計(jì)或脈沖數(shù)計(jì),主要用于統(tǒng)計(jì)和測(cè)量輸入脈沖信號(hào)的頻率或數(shù)量。本文將詳細(xì)闡述脈沖計(jì)數(shù)器
    的頭像 發(fā)表于 05-15 17:08 ?1567次閱讀

    計(jì)數(shù)器怎么用 計(jì)數(shù)器的作用有哪些

    計(jì)數(shù)器是一種被廣泛應(yīng)用于各個(gè)領(lǐng)域的實(shí)用工具,在我們的日常生活中隨處可見(jiàn)。無(wú)論是進(jìn)行時(shí)間統(tǒng)計(jì),協(xié)助工作任務(wù)的完成,還是用于科學(xué)研究和編程技術(shù),在各個(gè)領(lǐng)域都起到了重要的作用。本文將詳細(xì)介紹計(jì)數(shù)器
    的頭像 發(fā)表于 02-03 10:04 ?4950次閱讀

    雷擊計(jì)數(shù)器綜合選型應(yīng)用方案

    雷擊計(jì)數(shù)器的基本原理是利用雷電流通過(guò)導(dǎo)線時(shí)產(chǎn)生的感應(yīng)電壓或電流來(lái)驅(qū)動(dòng)計(jì)數(shù)器計(jì)數(shù)。根據(jù)計(jì)數(shù)器的類型,可以分為機(jī)械式雷擊計(jì)數(shù)器和電子式雷擊
    的頭像 發(fā)表于 01-31 09:50 ?494次閱讀
    雷擊<b class='flag-5'>計(jì)數(shù)器</b>綜合選型應(yīng)用方案

    同步計(jì)數(shù)器和異步計(jì)數(shù)器各有什么特點(diǎn)

    同步計(jì)數(shù)器和異步計(jì)數(shù)器是兩種常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),它們都用于控制對(duì)共享資源的訪問(wèn)。它們的主要作用是實(shí)現(xiàn)多個(gè)線程之間的同步和并發(fā)控制。盡管它們都被用于同步的目的,但它們有很多不同的特點(diǎn)和用例。 同步計(jì)數(shù)器
    的頭像 發(fā)表于 12-15 10:49 ?1795次閱讀

    4017計(jì)數(shù)器的工作原理

    4017計(jì)數(shù)器是一種廣泛應(yīng)用于數(shù)字電路中的集成電路,它可以用來(lái)計(jì)數(shù)和控制電子設(shè)備。4017計(jì)數(shù)器有10個(gè)輸出引腳,可以依次輸出從0到9的十個(gè)數(shù)字
    的頭像 發(fā)表于 12-15 09:24 ?4024次閱讀

    同步計(jì)數(shù)器和異步計(jì)數(shù)器的區(qū)別主要在哪里

    同步計(jì)數(shù)器和異步計(jì)數(shù)器的區(qū)別詳解 同步計(jì)數(shù)器和異步計(jì)數(shù)器數(shù)字電路中兩種常見(jiàn)的計(jì)數(shù)器類型,它們?cè)?/div>
    的頭像 發(fā)表于 12-13 14:54 ?9252次閱讀