亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關(guān)于帶有"顯示更多"按鈕的多行文本截斷思考

  發(fā)布時間:2019-09-16 14:33:28   作者:佚名   我要評論
這篇文章主要介紹了關(guān)于帶有"顯示更多"按鈕的多行文本截斷思考,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下

剛好最近遇到這個小需求,記得很早之前都是用 JS 處理,畢竟那時候年少無知。 切換類的操作 可以用 Checked 偽類實現(xiàn),成本會比較低一點,那么先來列一下功能要點:

  1. 多行文本截斷,顯示省略號
  2. "顯示更多" 按鈕可以展開所有文本
  3. 展開文本后,按鈕的文字變成 "收起文本"
  4. 按鈕的出現(xiàn)條件為當(dāng)文本 被截斷 時(如果你文本只有 一行 ,那就沒必要顯示了吧:sweat:)

疑問點: text-overflow: ellipsis 不支持多行 截斷 。按鈕文字切換, CSS 該如何切換文本? 按鈕的出現(xiàn)條件又如何判斷? 下面我將逐一講解:balloon:

多行文本截斷

假設(shè)現(xiàn)有的 HTML 結(jié)構(gòu)如下:

 

<div class="box">
  <p>文本內(nèi)容</p>
</div>

如果需要單行 截斷 ,一般的做法是:

 

p {
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
}

效果如下:

 

多行文本需要用到 line-clamp ,定義 被截斷 文本的行數(shù):

 

p {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

效果如下:

 

按鈕點擊展示所有文本

現(xiàn)在 HTML 結(jié)構(gòu)改造成如下:

 

<div class="box">
  <input type="checkbox" name="toggle" id="toggle" style="display: none;">
  <p>文本內(nèi)容</p>
  <label for="toggle">顯示更多</label>
</div>

監(jiān)聽按鈕的點擊行為則用文首說的 Checked 偽類:

 

input[name="toggle"]:checked {
 & + p {
   -webkit-line-clamp: unset;
 }
}

這樣當(dāng)用戶點擊(選中)的時候,將 展示 所有文本,未選中則 收起 文本:

 

按鈕文字動態(tài)化

講道理,當(dāng)展示所有文本之后,按鈕的文字應(yīng)該要切換成 "收起文本" , CSS 怎么修改文本啊,其實用偽元素的 content 就行了。

把 HTML 中的文字去掉,然后換成 CSS 控制:

 

<label for="toggle"></label>

label {
  &::after {
    content: "顯示更多";
  }
}

 

同理可得:

 

input[name="toggle"]:checked {
  & ~ label {
    &::after {
      content: "收起文本";
    }
  }
}

效果如下:

 

按鈕樣式丑的那就自己調(diào)一下咯:sweat:

按鈕出現(xiàn)的條件

當(dāng)文本少于 三行 時,按鈕不應(yīng)該出現(xiàn),因為沒必要:

 

出大問題,網(wǎng)上沖浪后,發(fā)現(xiàn)沒有任何 偽類 可以判斷文本是否 被截斷 ,如果有,我們可以這樣做:

 

p {
 &:truncated {
   & + label {
    display: block;
   }
 }   
}
label {
  display: none;
}

truncated 意思是 截斷 的。

不過就算這樣,也無法實現(xiàn)我們的需求,因為當(dāng)你顯示所有文本后,你的文本就沒有 被截斷 了,所以按鈕會消失:

 

以上是依靠一段 JS 實現(xiàn)的 模擬效果 ,源碼如下:

 

let list = document.querySelectorAll("p");
let observer = new ResizeObserver(entries => {
  entries.forEach(item => {
    item.target.classList[item.target.scrollHeight > item.contentRect.height ? "add" : "remove"]("truncated");
  });
});

list.forEach(p => {
  observer.observe(p);
});

 

原理就是 監(jiān)聽 文本元素的大小變化,然后動態(tài)增加 truncated 類名:joy:

所以,你的 CSS 中的 truncated 偽類應(yīng)該改成 truncated 類:sweat:

 

p {
 &.truncated {
   & + label {
    display: block;
   }
 }   
}

我們希望 切換 的時候,按鈕一直都在,而不是文本沒 被截斷 的時候就不顯示按鈕,因此,我們不需要一直 監(jiān)聽 文本元素的大小改變,我們只需要一個初始值(文本初始化的時候到底有沒有 被截斷 ),也就是只監(jiān)聽一次!

 

entries.forEach(item => {
  //... 原來的代碼
  
  observer.unobserve(item.target); // 移除監(jiān)聽
});

或者根本不需要用這個 API ,直接頁面初始化的時候,遍歷判斷一遍就行拉!

 

let list = document.querySelectorAll("p");

list.forEach(item => {
  item.classList[item.scrollHeight > item.offsetHeight ? "add" : "remove"]("truncated");
});

 

這樣, P 元素在頁面初始化的時候,會自動加上 truncated 類名,而按鈕又可以一直顯示:

 

擴(kuò)展

比如你可以自定義按鈕樣式、在底部增加一個透明漸變的蒙層、切換時候的過渡效果:grin:

總結(jié)
 

checked 偽類是個好東西,能滿足很多需求而不用寫 JS ,因此凡是有關(guān) 切換類的操作 都可以考慮用它。

以上所述是小編給大家介紹的關(guān)于帶有"顯示更多"按鈕的多行文本截斷思考,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • css中text-overflow屬性與文本截斷詳解

    這篇文章主要給大家介紹了關(guān)于css中text-overflow屬性與文本截斷的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),希望本文的內(nèi)容對各位前端開發(fā)者們能帶一定的幫助,
    2017-06-04
  • 使用純css截斷多行文本

    這篇文章主要介紹了用純css怎么截斷多行文本,本文先對css屬性進(jìn)行介紹,而后又給出了完整實例代碼,讓大家能直觀的了解如何使用,下面一起來看看。
    2016-08-17
  • 用css截取字符實現(xiàn)文字自動截斷隱藏溢出文本

    這篇文章主要介紹了用css截取字符實現(xiàn)文字自動截斷隱藏溢出文本,需要的朋友可以參考下
    2014-05-19

最新評論