日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

純 CSS 實現標簽自動顯示超出數量

來源: 責編: 時間:2024-05-09 09:26:18 151觀看
導讀現代CSS強大的令人難以置信。這次我們來用 CSS 實現這樣一個功能:有多個寬度不同的標簽水平排列,當外層寬度不足時,會提示超出的數量,演示效果如下圖片如果讓我用 JavaScript來實現估計都有點折騰,畢竟寬度都是動態的,要監

現代CSS強大的令人難以置信。M4g28資訊網——每日最新資訊28at.com

這次我們來用 CSS 實現這樣一個功能:有多個寬度不同的標簽水平排列,當外層寬度不足時,會提示超出的數量,演示效果如下M4g28資訊網——每日最新資訊28at.com

圖片圖片M4g28資訊網——每日最新資訊28at.com

如果讓我用 JavaScript來實現估計都有點折騰,畢竟寬度都是動態的,要監聽各部分的尺寸變化,包括標簽的位置和外層的寬度,總之不是一兩行代碼就能搞定的。M4g28資訊網——每日最新資訊28at.com

現如今,純CSS也能完美的實現這樣的效果,而且比 JS 實現更加簡單,一起來看看吧M4g28資訊網——每日最新資訊28at.com

一、CSS 實現思路

很多時候,CSS并沒有直接的實現方式,需要“繞”點彎路,將需求拆分成很多小點,然后逐一突破。M4g28資訊網——每日最新資訊28at.com

回到本文這里,其實有幾個問題需要考慮:M4g28資訊網——每日最新資訊28at.com

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

關于第3點,其實在之前這篇文章中有詳細介紹,有興趣可以回顧一下,非常有意思M4g28資訊網——每日最新資訊28at.com

純 CSS 檢測文本是否溢出M4g28資訊網——每日最新資訊28at.com

M4g28資訊網——每日最新資訊28at.com

那么第一點,CSS有沒有什么方式可以統計數量呢?M4g28資訊網——每日最新資訊28at.com

沒錯,相信很多小伙伴已經猜到了,就是利用 CSS計數器,示意如下M4g28資訊網——每日最新資訊28at.com

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

關于計數器,我之前也在很多文章中有用到M4g28資訊網——每日最新資訊28at.com

你可能不需要 JS!CSS實現一個計時器M4g28資訊網——每日最新資訊28at.com

如何讓CSS計數器支持小數的動態變化?M4g28資訊網——每日最新資訊28at.com

還在使用定時器嗎?CSS 也能實現電子時鐘M4g28資訊網——每日最新資訊28at.com

動畫合成小技巧!CSS 實現動感的倒計時效果M4g28資訊網——每日最新資訊28at.com

自定義計數器小技巧!CSS 實現長按點贊累積動畫M4g28資訊網——每日最新資訊28at.com

M4g28資訊網——每日最新資訊28at.com

然后是第二點,CSS有什么方式可以知道元素是出去了還是在視野之內呢?M4g28資訊網——每日最新資訊28at.com

如果是用 JS來判斷的話,最穩妥的方式應該Intersection Observer(交叉觀察者),相信很多同學都用過,這個在圖片懶加載非常有用M4g28資訊網——每日最新資訊28at.com

交叉觀察器 API - Web API 接口參考 | MDN (mozilla.org)[1]M4g28資訊網——每日最新資訊28at.com

M4g28資訊網——每日最新資訊28at.com

那么,CSS中有什么類似的呢?沒錯,還是之前提到過的CSS滾動驅動動畫。M4g28資訊網——每日最新資訊28at.com

不過這里用到的是視圖進度,也就是關注的是元素自身位置,元素進入到容器范圍之內就會觸發動畫,非常類似 JS中的Intersection ObserverM4g28資訊網——每日最新資訊28at.com

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

這里就不詳細介紹了,有興趣回顧之前這篇文章M4g28資訊網——每日最新資訊28at.com

CSS 滾動驅動動畫終于正式支持了~ M4g28資訊網——每日最新資訊28at.com

M4g28資訊網——每日最新資訊28at.com

好了,關鍵原理就這些了,我們需要做的就是想辦法將「計數器」和「元素進出容器范圍」關聯起來就行了,接著往下看M4g28資訊網——每日最新資訊28at.com

二、CSS 計數器

利用 CSS 計數器,我們可以很輕松的統計元素的數量。M4g28資訊網——每日最新資訊28at.com

先簡單布局一下文章開頭的例子,HTML如下所示M4g28資訊網——每日最新資訊28at.com

<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><!--用來計數的標簽-->

然后美化一下M4g28資訊網——每日最新資訊28at.com

.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 布局(超出隱藏),后面跟一個數字M4g28資訊網——每日最新資訊28at.com

圖片圖片M4g28資訊網——每日最新資訊28at.com

現在我們定義一個計數器,然后通過每個tag進行累計,有多個tag相當于多少次累加,最后在::after中顯示出來M4g28資訊網——每日最新資訊28at.com

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

默認計數器的起始值是 0,每次累計是1,所以這里最后得到了7,這樣就能實時統計元素的數量了M4g28資訊網——每日最新資訊28at.com

圖片圖片M4g28資訊網——每日最新資訊28at.com

當然,我們也可以自定義這些默認值,比如M4g28資訊網——每日最新資訊28at.com

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

這種情況下,起始值是10,增量值是-1,所以最后得到了3,如下M4g28資訊網——每日最新資訊28at.com

圖片圖片M4g28資訊網——每日最新資訊28at.com

那么,該如何統計容器之外的標簽數量呢?M4g28資訊網——每日最新資訊28at.com

三、CSS 滾動驅動動畫

這里我們要利用CSS 視圖進度時間軸,也就是觀察元素自身的位置,在進入到容器范圍之內執行動畫。M4g28資訊網——每日最新資訊28at.com

拿上面這個例子,我們給標簽添加一個動畫,讓標簽在進入到容器之內時變個顏色,實現如下M4g28資訊網——每日最新資訊28at.com

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

由于是水平方向,所以這里需要設置view(inline) ,效果如下M4g28資訊網——每日最新資訊28at.com

圖片圖片M4g28資訊網——每日最新資訊28at.com

好像不是很明顯?這是因為動畫是在整個視區內過渡的,我們可以改變動畫時間線的區間animation-range,讓這個動畫在進出的一瞬間就變化M4g28資訊網——每日最新資訊28at.com

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

效果如下M4g28資訊網——每日最新資訊28at.com

圖片圖片M4g28資訊網——每日最新資訊28at.com

那么,這個效果和前面的計數器有什么關聯呢?M4g28資訊網——每日最新資訊28at.com

從效果上來看,在視區內會執行一個動畫,如果在這個動畫中加入計數器的累加會怎么樣呢?先去除原先的累加器M4g28資訊網——每日最新資訊28at.com

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

效果如下M4g28資訊網——每日最新資訊28at.com

圖片圖片M4g28資訊網——每日最新資訊28at.com

可以看到計數器已經生效了,不過現在統計的在「可視區內」標簽的數量。而我們要統計的是「可視區外」的數量,好像反過來了,如何實現呢?M4g28資訊網——每日最新資訊28at.com

這里有兩種思路。M4g28資訊網——每日最新資訊28at.com

第一種,用總數減去可視區內的數量,不就行了嗎?由于現在動畫是針對可視區內的,我們可以給計數器設置一個初始值,就是總量,然后動畫中給累加值設置為-1,就相當于減去當前數量了,實現如下M4g28資訊網——每日最新資訊28at.com

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

這樣就完美統計出了可視區外的數量了M4g28資訊網——每日最新資訊28at.com

圖片圖片M4g28資訊網——每日最新資訊28at.com

還有一種方式,我覺得更加巧妙,需要反向思考。原理是重置當前的累加值,比如默認情況下,正常累加,進入可視范圍,把累加值設置為0,不就相當于可視區外的正常累加了嗎?M4g28資訊網——每日最新資訊28at.com

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

同樣能達到相同的效果M4g28資訊網——每日最新資訊28at.com

圖片圖片M4g28資訊網——每日最新資訊28at.com

現在基本已經達到我們需要的效果了M4g28資訊網——每日最新資訊28at.com

四、其他細節修正

首先是,在超出范圍時,需要在邊緣出添加一個半透明蒙層,這樣體驗效果會更好。M4g28資訊網——每日最新資訊28at.com

半透明蒙層很好實現,只需要添加一個水平漸變的mask遮罩就行了M4g28資訊網——每日最新資訊28at.com

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

效果如下M4g28資訊網——每日最新資訊28at.com

那么,如何在沒有超出時,不出現這個遮罩呢?M4g28資訊網——每日最新資訊28at.com

這個其實在之前的文章中有詳細介紹了,建議回顧一下M4g28資訊網——每日最新資訊28at.com

純 CSS 檢測文本是否溢出M4g28資訊網——每日最新資訊28at.com

M4g28資訊網——每日最新資訊28at.com

利用CSS滾動驅動動畫,可以檢測容器是否可滾動,也就是是否超出。所以我們只需要將遮罩放在滾動驅動動畫里就行了,關鍵實現如下M4g28資訊網——每日最新資訊28at.com

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

效果如下M4g28資訊網——每日最新資訊28at.com

還有一個問題,希望在沒有超出的時候不顯示后面的數量。M4g28資訊網——每日最新資訊28at.com

關于這個,我本來是打算用樣式查詢來實現,但是遇到了一個問題,由于樣式查詢只能匹配到子元素,所以不得不將顯示數量的標簽放到.con容器內。但是這樣一來,mask遮罩就會出現問題,就像這樣M4g28資訊網——每日最新資訊28at.com

遮罩層連同數量標簽一起被裁剪了!M4g28資訊網——每日最新資訊28at.com

于是又想出了另一種方案,這個在以前的布局中其實用到的更多,那就是負margin。M4g28資訊網——每日最新資訊28at.com

實現很簡單,給標簽容器一個的負margin-right,這樣,右邊的數量就會被左邊的標簽蓋住,比如M4g28資訊網——每日最新資訊28at.com

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

效果如下M4g28資訊網——每日最新資訊28at.com

是不是已經被蓋住一部分了?我們繼續向左偏移M4g28資訊網——每日最新資訊28at.com

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

這樣就完全看不到右邊的數量了M4g28資訊網——每日最新資訊28at.com

那么,如何在超出時顯示數量呢?這里就體現出負margin的好處了,可以借助前一個元素來隱藏后一個元素,在這里,我們直接在前面的動畫中還原margin就行了M4g28資訊網——每日最新資訊28at.com

.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;  }}

這樣就完美實現了文章開頭所示效果了M4g28資訊網——每日最新資訊28at.com

你也可以訪問以下鏈接來體驗真實效果(Chrome115+)M4g28資訊網——每日最新資訊28at.com

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

五、總結一下

以上就是本文的全部內容了,不知道你學會了嗎?下面總結一下實現重點:M4g28資訊網——每日最新資訊28at.com

  1. 很多時候,CSS并沒有直接的實現方式,需要“繞”點彎路
  2. CSS計數器可以實現數字累加
  3. CSS滾動驅動動畫可以檢測元素是否在可視范圍之內
  4. CSS滾動驅動動畫還能檢測元素是否內容超出
  5. 計數累加器可以放在滾動驅動動畫中,這樣在動畫觸發時也就相當于計數器生效了,這樣就能統計可視區的標簽數量了
  6. 樣式查詢只能匹配到子元素,但是用子元素會受到mask遮罩的影響
  7. 負margin可以借助前一個元素來隱藏后一個元素

M4g28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-87492-0.html純 CSS 實現標簽自動顯示超出數量

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: RabbitMQ如何保證消息可靠性?

下一篇: 如何在Ollama創建自定義模型?構建本地大模型

標簽:
  • 熱門焦點
  • 6月安卓手機性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經正式過去了,我們也迎來了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發布之前,性能榜的榜單大體會以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領先
  • 印度登月最關鍵一步!月船三號今晚進入環月軌道

    8月5日消息,據印度官方消息,月船三號將于北京時間今晚21時30分左右開始近月制動進入環月軌道。這是該探測器能夠成功的最關鍵步驟之一,如果成功將開始圍
  • 28個SpringBoot項目中常用注解,日常開發、求職面試不再懵圈

    前言在使用SpringBoot開發中或者在求職面試中都會使用到很多注解或者問到注解相關的知識。本文主要對一些常用的注解進行了總結,同時也會舉出具體例子,供大家學習和參考。注解
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現百度,功能雖然實現了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 阿里大調整

    來源:產品劉有媒體報道稱,近期淘寶天貓集團啟動了近年來最大的人力制度改革,涉及員工績效、層級體系等多個核心事項,目前已形成一個初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯網那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • 英特爾Xe HPG游戲顯卡:擁有512EU,單風扇版本

    據10 月 30 日外媒 TheVerge 消息報道,英特爾 Xe HPG Arc Alchemist 的正面實被曝光,不僅擁有 512 EU 版顯卡,還擁有 128EU 的單風扇版本。另外,這款顯卡 PCB
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日報 記者 王春   □ 本報通訊員 胡佳麗  2020年初,還在上大學的小東加入了一個大學生兼職QQ群。群主&ldquo;七王&rdquo;在群里介紹一些刷單賺
Top 主站蜘蛛池模板: 临汾市| 绿春县| 调兵山市| 夹江县| 伊春市| 平陆县| 文昌市| 定兴县| 新巴尔虎左旗| 松潘县| 青浦区| 哈巴河县| 定州市| 常熟市| 克什克腾旗| 广州市| 龙海市| 大余县| 长葛市| 岗巴县| 原阳县| 黄大仙区| 龙南县| 依安县| 开远市| 武安市| 华池县| 谢通门县| 兴业县| 怀集县| 连平县| 杭锦后旗| 府谷县| 新安县| 珲春市| 湟中县| 五指山市| 桐柏县| 锡林浩特市| 年辖:市辖区| 黄大仙区|