您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“CSS怎么實現自動補全字符串”,內容詳細,步驟清晰,細節處理妥當,希望這篇“CSS怎么實現自動補全字符串”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
很多時候都會碰到字符串補全的需求,典型的例子就時間或者日期中的補零操作,例如
2021-12-31 2022-03-03
通常的做法是
if (num < 10) { num = '0' + num }
后來,JS 中出現了原生的補全方法padStart()
和padEnd()
,如下
'3'.padStart(2, '0') // 結果是 ’03‘ '12'.padStart(2, '0') // 結果是 ’12‘
其實呢,在 CSS 中也是可以實現這樣的效果的,并且有多種方案,下面一起看看吧,相信能有不一樣的體會。
先介紹一個比較容易理解的方案,也非常簡單,假設 HTML 是這樣的
<span>2</span> - <span>28</span>
一般情況下,還會設置等寬字體,看起來更加協調、美觀
span{ font-family: Consolas, Monaco, monospace; }
我們需要在數字前用偽元素生成一個“0”
span::before{ content: '0' }
接下來,給元素設置一個固定寬度,這里由于是等寬字體,所以可以直接設置為2ch
,注意這個ch
單位,它表示字符0
的寬度(有興趣的可以參考這篇文章:等寬字體在web布局中應用以及CSS3 ch單位嘿嘿),然后設置右對齊就行了
span{ /**/ display: inline-flex; width: 2ch; justify-content: flex-end; }
原理很簡單,在 2 個字符寬度的空間里放置 3 個字符,以右對齊的方式,是不是就自動把最左邊的 0 給擠出去了?然后超出隱藏就可以了
完整代碼如下
span::before{ content: '0' } span{ display: inline-flex; width: 2ch; justify-content: flex-end; overflow: hidden; }
由于 CSS 無法獲取標簽的文本內容,所以這里需要構建一個 CSS 變量傳遞下去,如下
<span style="--num:2">2</span> - <span style="--num:12">28</span>
通過 var(--num)
拿到變量以后,就可以進行一系列的邏輯判斷了,那么,如何在小于 10 的情況下自動補零呢?
同樣我們需要在數字前用偽元素生成一個“0”
span::before{ content: '0' }
然后,只需要根據 CSS 變量動態隱藏這個偽元素就行了,先設置透明度,如下
span::before{ /**/ opacity: calc(10 - var(--num)); }
效果如下
具體的邏輯就是
當 --num
等于 10 時,透明度的計算值就是 0,直接按照 0 來渲染
當 --num
大于 10 時,透明度的計算值就是負數值,會按照 0 來渲染
當 --num
小于 10 時,透明度的計算值就是大于等于1的值,會按照 1 來渲染
所以,最終的表現就是當大于等于10時不可見,小于10的時候可見
但是,這樣還是有點問題的,透明度不會影響元素的位置,如下
如何消除這個位置呢?方法有很多,這里采用 margin-left
的方式,如下
span::before{ /**/ margin-left: clamp(-1ch, calc((9 - var(--num)) * 1ch),0ch); }
這里用到了clamp,你可以理解為一個區間,有 3 個值 [Min, Val, Max]
,前后分別是最小、最大值,中間是可變值(注意這里是和 9 比較),所以這里的邏輯就是
當 --num
大于等于 10 時,假設為 15,中間 calc 值計算為 -5ch,clamp 取值為最小值 -1ch
當 --num
小于 10 時,假設為 5,中間 calc 值計算為 5ch,clamp 取值為最大值 0ch
所以,最終的表現就是當大于等于10時margin-left為-1ch,小于10的時候margin-left為0
這樣就比較完美了
完整代碼如下
span::before{ content: '0'; opacity: calc(10 - var(--num)); margin-left: clamp(-1ch, calc((9 - var(--num)) * 1ch),0ch); }
利用計數器也能實現這一效果,首先看默認的計數器效果,我們需要隱藏原有的文字,利用計數器讓 CSS 變量通過偽元素展示出來,關于這個技巧,可以參考這篇文章:小tips: 如何借助content屬性顯示CSS var變量值,如下
span::before{ counter-reset: num var(--num); content: counter(num); }
接下來需要用到 counter
的第 2 個參數 ,計數器樣式。這是干什么的呢?相信大家都用過一個屬性 list-style-type,就是和這個相通的,可以定義序列的樣式,比如按照小寫英文字母的順序
list-style-type: lower-latin;
這里我們需要一個 10 以內自動補零的計數器,剛好有個現成的,叫做 decimal-leading-zero
,翻譯過來就是,十進制前置零
list-style-type: decimal-leading-zero;
回到這里,需要做的就很簡單了,補上這個參數就行了,完整代碼如下
span::before{ counter-reset: num var(--num); content: counter(num, decimal-leading-zero); }
效果如下
上面的計數器只適用于2位數的,如果需要 3 位數的怎么辦呢? 例如
001、002、...、010、012、...、098、099、100
JS 中的 padStart
可以指定填充后的位數
'1'.padStart(3, '0') // 結果是 ’001‘ '99'.padStart(3, '0') // 結果是 ’099‘ '101'.padStart(3, '0') // 結果是 ’101‘
其實,CSS 中也是有這樣的能力的,叫做@counter-style/pad
,嚴格來說,這才是官方的補全方案,語法也非常類似
pad: 3 "0";
但是,這個需要用在自定義計數器上,也就是@counter-style,有興趣的可以參考張老師的這篇文章:CSS @counter-style規則詳細介紹,這里簡單介紹一下用法,假設定義一個計數器叫做pad-num
,實現如下
@counter-style pad-num { system: extends numeric; pad: 3 "0"; }
語法是這樣的:這里的system
表示“系統”,就是內置的一些計數器,比如這里用到了extends numeric
,后面的numeric
表示數字技術系統,前面的extends
表示擴展,以這個為基礎,然后pad: 3 "0"
就和 JS 的意義一樣了,表示不足 3 位的地方補“0”
然后運用到計數器中:
span::before{ counter-reset: num var(--num); content: counter(num, pad-num); }
讀到這里,這篇“CSS怎么實現自動補全字符串”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。