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

純 CSS 實現(xiàn)標簽自動顯示超出數(shù)量

開發(fā) 前端
1. 計數(shù)累加器可以放在滾動驅動動畫中,這樣在動畫觸發(fā)時也就相當于計數(shù)器生效了,這樣就能統(tǒng)計可視區(qū)的標簽數(shù)量了。

現(xiàn)代CSS強大的令人難以置信。

這次我們來用 CSS 實現(xiàn)這樣一個功能:有多個寬度不同的標簽水平排列,當外層寬度不足時,會提示超出的數(shù)量,演示效果如下:

圖片圖片

如果讓我用 JavaScript來實現(xiàn)估計都有點折騰,畢竟寬度都是動態(tài)的,要監(jiān)聽各部分的尺寸變化,包括標簽的位置和外層的寬度,總之不是一兩行代碼就能搞定的。

現(xiàn)如今,純CSS也能完美的實現(xiàn)這樣的效果,而且比 JS 實現(xiàn)更加簡單,一起來看看吧!

一、CSS 實現(xiàn)思路

很多時候,CSS并沒有直接的實現(xiàn)方式,需要“繞”點彎路,將需求拆分成很多小點,然后逐一突破。

回到本文這里,其實有幾個問題需要考慮:

  1. CSS 如何動態(tài)累計數(shù)字?
  2. CSS 如何知道哪些元素在容器之外?
  3. CSS 如何區(qū)分是否溢出(顯示數(shù)量)

關于第3點,其實在之前這篇文章中有詳細介紹,有興趣可以回顧一下,非常有意思。

純 CSS 檢測文本是否溢出

那么第一點,CSS有沒有什么方式可以統(tǒng)計數(shù)量呢?

沒錯,相信很多小伙伴已經猜到了,就是利用 CSS計數(shù)器,示意如下:

counter-reset: num var(--num);
counter-increment: num;
::after{
	content: "+"counter(num);
}

關于計數(shù)器,我之前也在很多文章中有用到。

你可能不需要 JS!CSS實現(xiàn)一個計時器

如何讓CSS計數(shù)器支持小數(shù)的動態(tài)變化?

還在使用定時器嗎?CSS 也能實現(xiàn)電子時鐘

動畫合成小技巧!CSS 實現(xiàn)動感的倒計時效果

自定義計數(shù)器小技巧!CSS 實現(xiàn)長按點贊累積動畫

然后是第二點,CSS有什么方式可以知道元素是出去了還是在視野之內呢?

如果是用 JS來判斷的話,最穩(wěn)妥的方式應該Intersection Observer(交叉觀察者),相信很多同學都用過,這個在圖片懶加載非常有用。

交叉觀察器 API - Web API 接口參考 | MDN (mozilla.org)[1]。

那么,CSS中有什么類似的呢?沒錯,還是之前提到過的CSS滾動驅動動畫。

不過這里用到的是視圖進度,也就是關注的是元素自身位置,元素進入到容器范圍之內就會觸發(fā)動畫,非常類似 JS中的Intersection Observer。

tag{
  animation: appear;
  animation-timeline: view(inline);
  animation-range: contain;
}
@keyframes appear{
  to {
    background-color: #9747FF;
  }
}

好了,關鍵原理就這些了,我們需要做的就是想辦法將「計數(shù)器」和「元素進出容器范圍」關聯(lián)起來就行了,接著往下看。

二、CSS 計數(shù)器

利用 CSS 計數(shù)器,我們可以很輕松的統(tǒng)計元素的數(shù)量。

先簡單布局一下文章開頭的例子,HTML如下所示:

<div class="con">
  <a class="tag">HTML</a>
  <a class="tag">CSS</a>
  <a class="tag">JavaScript</a>
  <a class="tag">Flutter</a>
  <a class="tag">Vue</a>
  <a class="tag">React</a>
  <a class="tag">Svelte</a>
</div>
<span class="num"></span><!--用來計數(shù)的標簽-->

然后美化一下:

.con{
  display: flex;
  gap: 5px;
  padding: 5px;
  overflow: hidden;
}
.tag{
  padding: .2em .5em;
  background-color: #c49ef5;
  color: #fff;
  border-radius: 4px;
  animation: appear;
}
.num::after{
  content: "+0";
  padding: .2em .5em;
  background-color: #FFE8A3;
  color: #191919;
  border-radius: 4px;
}

這樣就得到了水平排列的 tag 布局(超出隱藏),后面跟一個數(shù)字。

圖片圖片

現(xiàn)在我們定義一個計數(shù)器,然后通過每個tag進行累計,有多個tag相當于多少次累加,最后在::after中顯示出來。

.con{
  counter-reset: num;  /*計數(shù)器初始值,默認為0*/
}
.tag{
  counter-increment: num; /*計數(shù)器增量值,默認為1*/
}
.num::after{
  content: "+"counter(num); 
}

默認計數(shù)器的起始值是 0,每次累計是1,所以這里最后得到了7,這樣就能實時統(tǒng)計元素的數(shù)量了。

圖片圖片

當然,我們也可以自定義這些默認值,比如:

.con{
  counter-reset: num 10;
}
.tag{
  counter-increment: num -1;
}

這種情況下,起始值是10,增量值是-1,所以最后得到了3,如下:

圖片圖片

那么,該如何統(tǒng)計容器之外的標簽數(shù)量呢?

三、CSS 滾動驅動動畫

這里我們要利用CSS 視圖進度時間軸,也就是觀察元素自身的位置,在進入到容器范圍之內執(zhí)行動畫。

拿上面這個例子,我們給標簽添加一個動畫,讓標簽在進入到容器之內時變個顏色,實現(xiàn)如下:

.tag{
  animation: appear;
  animation-timeline: view(inline);
}
@keyframes appear{
  to {
    background-color: #4d47ff;
  }
}

由于是水平方向,所以這里需要設置view(inline) ,效果如下:

圖片圖片

好像不是很明顯?這是因為動畫是在整個視區(qū)內過渡的,我們可以改變動畫時間線的區(qū)間animation-range,讓這個動畫在進出的一瞬間就變化。

.tag{
  animation: appear;
  animation-timeline: view(inline);
  animation-range: contain;
}
@keyframes appear{
  from,to {
    background-color: #4d47ff;
  }
}

效果如下:

圖片圖片

那么,這個效果和前面的計數(shù)器有什么關聯(lián)呢?

從效果上來看,在視區(qū)內會執(zhí)行一個動畫,如果在這個動畫中加入計數(shù)器的累加會怎么樣呢?先去除原先的累加器。

.tag{
  /* counter-increment: num; */
}
@keyframes appear{
  from,to {
    background-color: #4d47ff;
    counter-increment: num;
  }
}

效果如下:

圖片圖片

可以看到計數(shù)器已經生效了,不過現(xiàn)在統(tǒng)計的在「可視區(qū)內」標簽的數(shù)量。而我們要統(tǒng)計的是「可視區(qū)外」的數(shù)量,好像反過來了,如何實現(xiàn)呢?

這里有兩種思路。

第一種,用總數(shù)減去可視區(qū)內的數(shù)量,不就行了嗎?由于現(xiàn)在動畫是針對可視區(qū)內的,我們可以給計數(shù)器設置一個初始值,就是總量,然后動畫中給累加值設置為-1,就相當于減去當前數(shù)量了,實現(xiàn)如下:

.con{
	counter-reset: num 7;
}
@keyframes appear{
  from,to {
    background-color: #4d47ff;
    counter-increment: num -1;
  }
}

這樣就完美統(tǒng)計出了可視區(qū)外的數(shù)量了。

圖片圖片

還有一種方式,我覺得更加巧妙,需要反向思考。原理是重置當前的累加值,比如默認情況下,正常累加,進入可視范圍,把累加值設置為0,不就相當于可視區(qū)外的正常累加了嗎?

.tag{
  counter-increment: num;
}
@keyframes appear{
  from,to {
    background-color: #4d47ff;
    counter-increment: num 0;
  }
}

同樣能達到相同的效果

圖片圖片

現(xiàn)在基本已經達到我們需要的效果了。

四、其他細節(jié)修正

首先是,在超出范圍時,需要在邊緣出添加一個半透明蒙層,這樣體驗效果會更好。

半透明蒙層很好實現(xiàn),只需要添加一個水平漸變的mask遮罩就行了。

.con{
  -webkit-mask: linear-gradient(to right, #fff calc(100% - 30px), transparent);
}

效果如下:

那么,如何在沒有超出時,不出現(xiàn)這個遮罩呢?

利用CSS滾動驅動動畫,可以檢測容器是否可滾動,也就是是否超出。所以我們只需要將遮罩放在滾動驅動動畫里就行了,關鍵實現(xiàn)如下

.con{
  animation: check;
  animation-timeline: scroll(x self);
}
@keyframes check{
  from,to {
    -webkit-mask: linear-gradient(to right, #fff calc(100% - 30px), transparent);
  }
}

效果如下:

還有一個問題,希望在沒有超出的時候不顯示后面的數(shù)量。

關于這個,我本來是打算用樣式查詢來實現(xiàn),但是遇到了一個問題,由于樣式查詢只能匹配到子元素,所以不得不將顯示數(shù)量的標簽放到.con容器內。但是這樣一來,mask遮罩就會出現(xiàn)問題,就像這樣:

遮罩層連同數(shù)量標簽一起被裁剪了!

于是又想出了另一種方案,這個在以前的布局中其實用到的更多,那就是負margin。

實現(xiàn)很簡單,給標簽容器一個的負margin-right,這樣,右邊的數(shù)量就會被左邊的標簽蓋住,比如

.con{
  margin-right: -20px;
}

效果如下:

是不是已經被蓋住一部分了?我們繼續(xù)向左偏移。

.con{
  margin-right: -50px;
}

這樣就完全看不到右邊的數(shù)量了。

那么,如何在超出時顯示數(shù)量呢?這里就體現(xiàn)出負margin的好處了,可以借助前一個元素來隱藏后一個元素,在這里,我們直接在前面的動畫中還原margin就行了。

.con{
  animation: check;
  animation-timeline: scroll(x self);
}
@keyframes check{
  from,to {
    -webkit-mask: linear-gradient(to right, #fff calc(100% - 30px), transparent);
    margin-right: 0;
  }
}

這樣就完美實現(xiàn)了文章開頭所示效果了。

你也可以訪問以下鏈接來體驗真實效果(Chrome115+)

  • CSS auto tag num (juejin.cn)[2]
  • CSS auto tag num (codepen.io)[3]

五、總結一下

以上就是本文的全部內容了,不知道你學會了嗎?下面總結一下實現(xiàn)重點:

  1. 很多時候,CSS并沒有直接的實現(xiàn)方式,需要“繞”點彎路
  2. CSS計數(shù)器可以實現(xiàn)數(shù)字累加
  3. CSS滾動驅動動畫可以檢測元素是否在可視范圍之內
  4. CSS滾動驅動動畫還能檢測元素是否內容超出
  5. 計數(shù)累加器可以放在滾動驅動動畫中,這樣在動畫觸發(fā)時也就相當于計數(shù)器生效了,這樣就能統(tǒng)計可視區(qū)的標簽數(shù)量了
  6. 樣式查詢只能匹配到子元素,但是用子元素會受到mask遮罩的影響
  7. 負margin可以借助前一個元素來隱藏后一個元素
責任編輯:武曉燕 來源: 前端偵探
相關推薦

2021-10-19 22:23:47

CSSBeautiful按鈕

2024-08-29 08:13:58

2022-02-21 07:02:16

CSSbeautiful按鈕

2020-11-04 13:55:06

CSS密室逃脫前端

2022-08-10 16:08:38

鴻蒙CSS

2013-04-08 14:07:28

CSS

2022-08-29 17:39:53

應用開發(fā)css動畫

2021-01-19 12:16:10

CSS前端UI

2017-04-27 14:05:59

CSS動畫前端

2023-08-03 09:12:02

2021-01-25 06:37:06

Css前端CSS 特效

2015-04-24 10:05:15

HTML+CSS阿童木頭像

2022-08-04 06:57:54

CSS拼圖游戲

2023-04-17 09:08:27

CSS計時器

2024-07-31 20:38:18

2010-09-06 15:46:08

CSSDIV

2022-03-28 08:44:15

css3水波動畫

2010-09-13 16:04:27

CSS控制自動換行

2021-08-23 06:25:57

CSS 技巧animation

2023-07-03 08:51:41

選擇器detailssummary
點贊
收藏

51CTO技術棧公眾號