精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何讓CSS計數器支持小數的動態變化?

開發 前端
數字變化動畫在一些數據大屏展示的場景下還是挺實用的,有了 CSS 變量,再也不需要通過 JS 去實時計算了。不過目前兼容性還不是太好,適合內部項目小范圍使用(當然直接用了不要緊,不支持的只是沒有動畫而已)。

CSS 計數器是個好東西

原理其實很簡單,content?雖然本身不支持 CSS 變量直接渲染,但是可以支持counter-reset。

count::before {
--percent: 50;
counter-reset: progress var(--percent);
content: counter(progress);
}

通過一次中轉,就可以讓content也能支持CSS變量作為字符展示了。

圖片

這個技巧是通過張鑫旭的這篇文章了解的,非常實用:小tips: 如何借助content屬性顯示CSS var變量值 [1]。

但是,這個方法有個比較遺憾的地方就是,CSS 計數器不支持真正意義上的小數,也就是如果 CSS 變量為小數的話,直接展示為 0。

count::before {
--percent: 50.15;
counter-reset: progress var(--percent);
content: counter(progress);
}

圖片

那么,如何讓content也支持CSS變量的小數展示呢,畢竟很多情況下還是需要小數的?比如下面這個,如果支持了小數,就可以輕易地實現帶小數的數字滾動動畫。

圖片

今天一起來探討一下。

一、CSS 原理拆解

CSS 計數器由于特殊性,目前都是僅支持整數的,畢竟自然個數是沒有小數的(不排除以后自定義計數器可以實現)。既然這樣,可以換一種思路,從數字形態上進行拆分。比如一個小數,48.69?可以分解成整數部分48?和小數部分69,然后再通過小數點鏈接起來。這樣拆分后就都是整數了, CSS 計數器也是支持的。

圖片

用代碼實現就是(便于理解,以下的一些變量都是中文命名的,實際生產不推薦)。

count::before {
--整數: 48;
--小數: 69;
counter-reset: 整數計數器 var(--整數) 小數計數器 var(--小數);
content: counter(整數計數器) "." counter(小數計數器);
}

圖片

所以問題就變成了,如何將一個小數進行拆分呢?

二、CSS變量拆分成整數和小數

接著上面的問題,假設變量是--percent?,問題就是下面兩個變量--整數和--小數?如何通過--percent計算而來呢?

count::before {
--percent: 48.69;
--整數: 48;
--小數: 69;
counter-reset: 整數計數器 var(--整數) 小數計數器 var(--小數);
content: counter(整數計數器) "." counter(小數計數器);
}

看似很容易,但在 CSS 中好像并不怎么好實現。

為了解決這個,需要了解一下 CSS 自定義變量的類型[2]。類型有很多,下面羅列一下。

  • <length>
  • <number>
  • <percentage>
  • <length-percentage>
  • <color>
  • <image>
  • <url>
  • <integer>
  • <angle>
  • <time>
  • <resolution>
  • <transform-function>
  • <custom-ident>
  • <transform-list>

大部分能可以看出具體的類型,我們這里需要用到的就兩種,<number>?和<integer>,兩者都表示數字,具體的區別在于

  • <number>表示任意的數字,整數和小數都可以。
  • <integer>表示整型數字,只能是整數,小數會認為不合法。

回到這里,默認情況下,CSS 變量可以是任意值,但是通過自定義變量@property可以指定變量的類型,它可以對不合法的變量進行轉換。

@property - CSS(層疊樣式表) | MDN (mozilla.org)[3]。

比如,我們需要一個整數,可以這樣來定義,將syntax?屬性設置為<integer>就可以了。

@property --整數 {
syntax: "<integer>"; /*整型*/
initial-value: 0;
inherits: false;
}

這樣,這個變量會被強制轉換成整數。比如,下面給--整數也設置成一個小數。

count::before {
--percent: 48.69;
--整數: 48.69;
--小數: 69;
counter-reset: 整數 var(--整數) 小數 var(--小數);
content: counter(整數) "." counter(小數);
}

結果...

圖片

居然直接變成了 0?

不過沒關系,需要可以配合一些 CSS 計算函數實現自動轉換,比如calc。

count::before {
--percent: 48.69;
--整數: calc(48.69);/*使用 CSS 計算后可以轉換成整數*/
--小數: 69;
counter-reset: 整數 var(--整數) 小數 var(--小數);
content: counter(整數) "." counter(小數);
}

圖片

但是,這里變成了49?,原因其實是四舍五入造成的,并不是向下取整。為了消除這種誤差,可以再減去0.5,所以整數部分的最終實現就是。

@property --整數 {
syntax: "<integer>";
initial-value: 0;
inherits: false;
}
count::before {
--percent: 48.69;
--整數: calc(var(--percent) - 0.5);
--小數: 69;
counter-reset: 整數 var(--整數) 小數 var(--小數);
content: counter(整數) "." counter(小數);
}

未來的 CSS 數學函數應該也會有 floor、ceil  這樣的,可以期待一下~

然后是小數部分,有了整數部分,小數部分就容易了,可以用整個值減去整數部分,然后乘以 100,示意如下。

圖片

用代碼實現就是。

@property --小數 {
syntax: "<integer>";
initial-value: 0;
inherits: false;
}
count::before {
--percent: 48.69;
--整數: calc(var(--percent) - 0.5);
--小數: calc((var(--percent) - var(--整數)) * 100 - 0.5);
counter-reset: 整數 var(--整數) 小數 var(--小數);
content: counter(整數) "." counter(小數);
}

效果如下:

圖片

后面最末位的小數由于四舍五入的關系稍微有些偏差,沒關系,可以修正一下,加上??0.01??就行了。其次,還有一個問題,當小數位小于 10 的時候,計算出的結果可能是這樣。

圖片

那么,這種情況就需要動態補零了。

所以,只需要在計數器后面定義一下計數器樣式decimal-leading-zero,表示十進制前置零,最終實現如下:

count::before {
--percent: 48.69;
--整數: calc(var(--percent) - 0.5);
--小數: calc((var(--percent) - var(--整數)) * 100 - 0.5 + 0.01);
counter-reset: 整數 var(--整數) 小數 var(--小數);
content: counter(整數) "." counter(小數, decimal-leading-zero);
}

這樣整數和小數都可以用同一個變量--percent表示出來了,完美~

三、CSS 變量動畫

有人可能會覺得,為啥要廢這么大勁去實現這樣一個功能?用 js 直接設置不行嗎?如果僅僅是數字的變化,那當然可以,但在這里,除了CSS 單一變量帶來更好的可維護性外, 還可以做到連 JS 也難以做到(或者說成本更高)的事情,比如過渡動畫

首先,再改進一下,很多小數都是百分比形式的,也就是0~1?范圍內,所以前面--percent?可能是這樣的值0.4869。

count::before {
--percent: 0.4869;
--百分比: calc(var(--percent) * 100);
--整數: calc(var(--百分比) - 0.5);
--小數: calc((var(--百分比) - var(--整數)) * 100 - 0.5 + 0.01);
counter-reset: 整數 var(--整數) 小數 var(--小數);
content: counter(整數) "." counter(小數, decimal-leading-zero) "%";
}

效果如下:

圖片

然后,我們通過 JS 讓這個數字隨機變化。

count.addEventListener('click', ev => {
ev.target.style.setProperty("--percent", Math.random());
})

效果如下:

圖片

但是,這樣太死板了,我們需要數字變化的時候有個動畫,可以直接通過 CSS 自定義變量實現。

@property --percent {
syntax: "<number>";
initial-value: 0;
inherits: false;
}
count{
/**/
transition: --percent 1s
}

現在看看效果,非常輕松的就實現了數字的滾動動畫。

圖片

小數部分由于是跟隨整數部分的,比如整數從1?變為3,那么小數部分就跟隨變化兩個循環。本來這個也非常符合常理,就像時鐘的秒永遠要比分要轉的快一樣,但是有人可能覺得變的太快了,有沒有辦法讓小數部分和整數部分獨立開來呢?當然也是可以的,而且非常容易,只需要給整數部分和小數部分分別設置過渡就行了。

count{
/**/
transition: --整數 1s, --小數 1s;
}

現在再看看效果,和上面對比一下。

圖片

這兩種效果可以自行選擇,僅僅只是過渡的不同。

試想一下,如果這個效果用 JS 來實現,是不是還有點點麻煩呢?

下面是完整代碼(不多,就這么幾行)。

@property --percent {
syntax: "<number>";
initial-value: 0;
inherits: false;
}
@property --整數 {
syntax: "<integer>";
initial-value: 0;
inherits: false;
}
@property --小數 {
syntax: "<integer>";
initial-value: 0;
inherits: false;
}
count {
--percent: 0.4512;
font-size: 60px;
font-weight: bolder;
cursor: pointer;
font-family: 'Courier New', Courier, monospace;
--百分比: calc(var(--percent) * 100);
--整數: calc(var(--百分比) - 0.5);
--小數: calc((var(--百分比) - var(--整數)) * 100 - 0.5 + 0.01);
counter-reset: 整數 var(--整數) 小數 var(--小數);
transition: --整數 1s, --小數 1s;
}
count::before {
content: counter(整數) "." counter(小數, decimal-leading-zero) "%";
}

你也可以訪問線上 demo:CSS double num(codepen.io)[4] 或者 CSS double num(runjs.work)[5] 或者 CSS double num (juejin.cn)[6]。

四、總結和說明

以上就是全部內容了,一個還不錯的小技巧,你學會了嗎?

  1. CSS 變量不支持直接在content中渲染,但是可以借助計數器初始化來實現。
  2. CSS 計數器不支持小數初始化。
  3. CSS 計數器支持小數的實現原理在于將小數拆分為整數、小數點、小數三個部分。
  4. CSS 自定義變量可以指定變量的類型,這樣通過 CSS 數學函數可以將一個小數轉換成整數。
  5. 小數部分可以通過減去整數部分得到。
  6. 小數部分還需要通過decimal-leading-zero補全位數。
  7. CSS 單一變量一方面可以帶來更好的可維護性,另一方面還可以更輕易地實現過渡動畫。
  8. 借助@property可以很方便的控制 CSS 變量的過渡和動畫。

數字變化動畫在一些數據大屏展示的場景下還是挺實用的,有了 CSS 變量,再也不需要通過 JS 去實時計算了。不過目前兼容性還不是太好,適合內部項目小范圍使用(當然直接用了不要緊,不支持的只是沒有動畫而已)。

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

2023-08-08 08:01:22

微服務架構服務

2009-11-30 18:08:30

PHP制作動態計數器

2010-06-12 17:16:46

MySQL數據庫

2024-03-04 08:53:50

海量數據計數器存儲

2009-11-06 16:59:26

WCF性能計數器

2023-07-28 08:15:27

PC程序計數器

2009-06-11 16:27:18

科學型Java計數器

2009-11-25 15:07:39

PHP添加計數器

2009-10-29 11:47:15

ADO.NET計數器b

2010-02-22 16:34:17

WCF性能計數器

2009-12-01 15:01:07

PHP生成訪問計數器

2022-08-22 20:10:59

自定義計數器CSS

2009-12-22 13:16:53

WCF性能計數器

2022-04-08 07:22:15

分布式計數器系統設計

2009-12-22 13:25:58

WCF性能計數器內存

2023-02-06 09:31:17

CSSJS 動態

2010-07-16 14:37:53

SQL Server

2010-01-04 16:02:32

ADO.NET計數器

2024-02-07 12:32:00

重構技巧PythonCounter

2009-04-15 10:33:35

SQL Server 性能計數器錯誤
點贊
收藏

51CTO技術棧公眾號

狠狠综合久久av一区二区老牛| 天天操天天舔天天干| 色综合狠狠操| 欧美r级在线观看| 奇米精品一区二区三区| 国产视频精品久久| 久久机这里只有精品| 精品中文字幕在线观看| 人妻无码中文久久久久专区| 高清国产在线观看| 一区二区三区四区精品| 国产精品theporn88| 亚洲午夜18毛片在线看| 99久久久久| 亚洲国产精品高清久久久| 国产情侣av自拍| 最新国产在线拍揄自揄视频| 2014亚洲片线观看视频免费| 国产精品久久久久久中文字| 久久午夜无码鲁丝片| 区一区二视频| 亚洲精品丝袜日韩| 中文字幕55页| 亚洲不卡系列| 午夜视黄欧洲亚洲| 日韩国产精品毛片| 成人欧美亚洲| 91麻豆国产精品久久| 96pao国产成视频永久免费| 天天干天天操天天爱| 欧美日韩一区二区三区四区在线观看| 夜夜躁日日躁狠狠久久88av| 亚洲啪av永久无码精品放毛片 | 亚洲最大综合网| 国产资源在线观看入口av| 亚洲摸摸操操av| 亚洲精品成人a8198a| 久久久资源网| www久久久久| 国产一区二区三区奇米久涩 | 国产一区二区三区四| 国产精品普通话| 精人妻无码一区二区三区| 国产精品久久国产愉拍| 久久久久日韩精品久久久男男| 小泽玛利亚一区二区免费| 99久久www免费| 中文字幕欧美日韩va免费视频| 香蕉网在线播放| 五月综合久久| 日韩精品在线观看网站| 一本加勒比波多野结衣| 美女网站色精品尤物极品姐弟| 精品久久人人做人人爱| 韩国三级hd中文字幕有哪些| 九色精品蝌蚪| 精品捆绑美女sm三区| 国产高潮失禁喷水爽到抽搐| 国产成人av毛片| 亚洲激情视频网| 国产肉体xxxx裸体784大胆| 粉嫩久久久久久久极品| 精品国产伦一区二区三区免费| 精品无码av一区二区三区不卡| 久久精品一级| 亚洲精品一线二线三线无人区| 小毛片在线观看| 欧美日韩爱爱| 在线日韩第一页| 香蕉成人在线视频| 欧美va天堂在线| 韩国精品久久久999| 久久久精品免费看| 视频一区视频二区中文字幕| 国产精品入口夜色视频大尺度| 中文字幕自拍偷拍| 国产麻豆成人精品| 国产一区二区三区四区五区加勒比| 婷婷在线免费观看| 国产午夜精品久久久久久久| 亚洲在线不卡| 蜜臀av在线| 色综合天天视频在线观看| 久久久久久久片| 国内不卡的一区二区三区中文字幕 | 欧美精品影院| 日韩的一区二区| 精品伦精品一区二区三区视频密桃| 亚洲一区 二区 三区| 国内偷自视频区视频综合| 久久这里只有精品9| 国内成人精品2018免费看| 成人午夜电影在线播放| 日韩成人黄色| 亚洲欧美激情插| av免费播放网址| 国产精品久久久久久久久久久久久久久 | 亚洲 中文字幕 日韩 无码| 亚洲a成人v| 日韩成人中文电影| 中文字幕人妻一区二| 亚洲一区国产| 91香蕉电影院| 国内精品一区视频| 亚洲高清久久久| 91女神在线观看| 久久动漫网址| 久久久av网站| 天天射天天干天天| 不卡的av网站| 日本道在线视频| 91伊人久久| 日韩第一页在线| 免费中文字幕在线观看| 蜜臀精品一区二区三区在线观看| 国产九色91| 大片免费在线观看| 欧美亚洲精品一区| 国产三级国产精品| 亚洲调教视频在线观看| 成人精品在线视频| 岛国大片在线观看| 福利视频一区二区| 国产艳妇疯狂做爰视频| 天天射天天综合网| 国产精品美女免费看| 午夜性色福利视频| 亚洲一区在线观看免费观看电影高清| 一本色道久久亚洲综合精品蜜桃| 欧美人与动xxxxz0oz| 久久久免费观看| 国产黄色片免费观看| 中文字幕亚洲欧美在线不卡| 九九九在线观看视频| 九九热线有精品视频99| 91精品国产91久久久久久久久| 国产草草影院ccyycom| 亚洲欧美中日韩| 午夜精品中文字幕| 欧美黄色录像片| 国产精品一区二区久久久久| yw在线观看| 欧美性大战久久久| 无码少妇精品一区二区免费动态| 久久天天综合| 欧美激情www| 三上悠亚国产精品一区二区三区| 日韩精品在线视频美女| 中文字幕亚洲精品在线| 91麻豆精品在线观看| 日本不卡在线观看视频| 香蕉久久精品日日躁夜夜躁| 欧美一区第一页| 你懂的视频在线播放| 欧美性猛交xxxx乱大交蜜桃| 亚洲一区二区三区蜜桃| 日韩电影在线看| 亚洲电影网站| 国产一区二区三区| 久久久久久午夜| 婷婷色在线观看| 一本大道久久a久久综合婷婷| 国产美女免费网站| 麻豆国产91在线播放| 中文字幕久久综合| 日韩视频在线直播| 午夜精品久久17c| 三级毛片在线免费看| 欧洲精品中文字幕| 日韩福利小视频| 成人综合在线观看| 91传媒久久久| 国产高清一区| 国产一区二区三区奇米久涩| 国产麻豆久久| 草民午夜欧美限制a级福利片| 亚洲AV无码成人片在线观看| 精品国产31久久久久久| 国产1区2区在线观看| 国产精品123| 欧美日韩国产精品激情在线播放| 日韩一区电影| 成人3d动漫一区二区三区91| 欧美成人资源| 久久成人av网站| 天堂v视频永久在线播放| 欧美日韩视频一区二区| 国产在线视频二区| 国产欧美一区二区精品性| 伊人成人免费视频| 久久综合九色| 伊人久久在线观看| 国产欧美日韩精品一区二区三区 | 91人人澡人人爽人人精品| 亚洲欧美日韩高清在线| 裸模一区二区三区免费| 国产一区二区三区| 国产激情久久久久| 青春草免费在线视频| 亚洲欧洲日产国码av系列天堂 | 日韩精品在线观看一区| 国产xxxx在线观看| 色噜噜狠狠色综合欧洲selulu| 丰满少妇高潮久久三区| 国产欧美精品一区| 国产十八熟妇av成人一区| 另类小说综合欧美亚洲| 国产日产欧美视频| 欧美国产综合| 亚洲图片小说在线| 伊人久久大香线蕉无限次| 99久久无色码| 日韩成人精品一区二区三区| 欧美专区国产专区| 黄色小说在线播放| 久久av.com| 亚洲麻豆精品| 亚洲色图偷窥自拍| 日本免费一区视频| 日韩欧美自拍偷拍| 夜夜躁狠狠躁日日躁av| 色呦呦国产精品| 久久久国产精华液| 亚洲蜜臀av乱码久久精品蜜桃| 久久久久亚洲av无码a片| 97国产一区二区| av不卡中文字幕| 国产成人在线观看| 色天使在线观看| 日本美女一区二区三区| 黑鬼大战白妞高潮喷白浆| 亚洲国产日韩欧美一区二区三区| 法国空姐在线观看免费| 91免费精品| 一区二区不卡在线| 色爱综合网欧美| 色狠狠久久av五月综合| 禁断一区二区三区在线| 日本不卡在线播放| 狠狠色丁香婷婷综合影院| 欧美高清性xxxxhd| 欧美做受69| 免费看成人午夜电影| 天堂资源在线亚洲| 女女同性女同一区二区三区91| 同性恋视频一区| 欧美激情国产日韩| 国产午夜一区| 亚洲人体一区| 久久久久久免费视频| 自拍偷拍亚洲色图欧美| 香蕉av一区二区| 91麻豆天美传媒在线| 午夜欧美精品| 欧美激情 国产精品| 国产精品久久久久久久免费软件| 日韩精品视频一区二区在线观看| 亚洲欧美大片| 50路60路老熟妇啪啪| 日韩成人精品在线观看| 不卡的av中文字幕| 国产精品系列在线观看| 丰满少妇xbxb毛片日本| 91美女精品福利| 成年人免费视频播放| 亚洲图片你懂的| 国产精彩视频在线| 欧美午夜精品久久久久久久| 中文在线字幕av| 日韩一区二区免费在线观看| 天堂v在线观看| 亚洲一区二区黄| 超碰免费在线播放| 97精品视频在线播放| 日韩成人影音| 亚洲va欧美va在线观看| 林ゆな中文字幕一区二区| 日韩黄色影视| 午夜日韩激情| 国产真实乱子伦| 国产在线乱码一区二区三区| 性久久久久久久久久久| 中文字幕欧美区| 婷婷在线精品视频| 欧美丝袜一区二区| 国产剧情久久久| 亚洲国产精品嫩草影院久久| 国产精品99999| 欧美激情在线有限公司| 97精品国产综合久久久动漫日韩 | 日韩中文字幕综合| 在线播放日韩专区| 国内高清免费在线视频| 国产精品久久久久久久美男| 99re8这里有精品热视频免费| 欧美一区观看| 精品1区2区3区4区| 自拍偷拍21p| 91麻豆.com| 欧美视频www| 在线免费不卡视频| 丰满肥臀噗嗤啊x99av| 中文字幕亚洲天堂| 忘忧草在线日韩www影院| 91视频88av| 精品美女在线视频| 日韩中字在线观看| 国产伦精品一区二区三区免费| 伊人网在线视频观看| 亚洲综合999| 91亚洲欧美激情| 国产亚洲xxx| 婷婷电影在线观看| 国产精品日韩欧美一区二区| 2023国产精品久久久精品双| 亚洲色精品三区二区一区| 99riav久久精品riav| 久久久久久久久久久久久久免费看| 欧美亚洲一区二区在线| 极品美乳网红视频免费在线观看| 久久免费福利视频| 亚洲午夜精品| 日本特级黄色大片| 蜜桃视频在线观看一区| 日本xxxxxxxxx18| 欧美性猛交xxx| 视频一区二区在线播放| 久久久久久免费精品| 99国产精品免费网站| 亚洲精品天堂成人片av在线播放| 精品一区二区三区在线观看国产| 日韩av片在线| 在线一区二区观看| 国产综合在线观看| 国产91色在线播放| 深爱激情综合| 九一精品在线观看| 欧美激情中文字幕| 中文字幕在线观看欧美| 中文日韩在线观看| 91在线成人| 三级网在线观看| 国产精品自拍在线| 中文字幕影音先锋| 日韩欧美亚洲国产另类| 在线你懂的视频| 国产精品一区视频| 国产精品社区| japanese中文字幕| 在线观看日韩一区| 日本激情在线观看| 91麻豆国产精品| 欧美日韩一视频区二区| 日本国产在线视频| 欧美午夜视频一区二区| 激情小视频在线| 国产在线视频2019最新视频| 亚洲乱码电影| 国产a级黄色片| 色偷偷88欧美精品久久久| 成人在线免费视频| 亚洲a∨日韩av高清在线观看| 国产精品地址| 中文字幕乱码一区| 色狠狠色狠狠综合| 在线观看免费网站黄| 99久久精品无码一区二区毛片| 日韩午夜av| 你懂得视频在线观看| 欧美肥妇毛茸茸| 成年人视频免费在线播放| 欧美另类高清视频在线| 久久精品国产在热久久| 久久久久久久久久久97| 亚洲视频精品在线| 精品国产一区二| 大陆极品少妇内射aaaaa| 欧美激情一区二区三区在线| 国产色综合视频| 97婷婷大伊香蕉精品视频| 成人激情视频| 欧美xxxxx少妇| 欧美日韩五月天| 黄色漫画在线免费看| 亚洲精品tv久久久久久久久| 丁香另类激情小说| 成年人晚上看的视频| 欧美日本精品在线| 国产成人精品免费视| 人妻巨大乳一二三区| 日本久久电影网| 免费在线观看的电影网站| 日韩亚洲不卡在线| 成人国产精品免费观看动漫| 中文字幕av影视| 91精品国产九九九久久久亚洲| 91亚洲国产高清| 亚洲第一香蕉网| 精品久久人人做人人爱| 亚洲综合视频|