多餘文字省略解決方案

網頁前端開發過程當中,後端傳來的文本數據長短不可控,若是接收到的文本很是長且又沒有做自適應處理,頁面效果會十分可怕。自適應處理在這種場景下確實很重要,不過,另外一種解決方案一樣也能夠考慮,那就是本文將要討論的省略多餘文字,尤爲是在移動端屏幕資源有限的狀況下,更應該採用省略文字的解決方案。
本文將討論單行和多行文字省略的方案,特別是多行文字的省略,不像單行省略的解決方案那麼簡單全面,故本文重點討論多行文字的方案。前端

單行文字省略

單行文字的省略方案已經有比較主流又有效的解決方案,就是CSS3的text-overflow屬性。該屬性可以優雅地完成全部單行文字省略的需求,並且覆蓋了目前市場上幾乎全部的瀏覽器版本(瀏覽器支持狀況,請參考:http://caniuse.com/#search=te... )。
在使用中惟一須要注意的是要加上代碼:git

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

white-space: nowrap 保證單行文字不會換行,若無此屬性文字會自動換行而不會顯示省略號。overflow: hidden 則不顯示超出容器的文字內容,若無此屬性,文字會顯示超過容器而不省略。github

多行文字省略

方案一:-webkit-line-clamp(僅適用於webkit內核瀏覽器)

在webkit內核的瀏覽器中,多行文字省略能夠採用CSS屬性-webkit-line-clamp實現。web

.multiple-line {
      overflow: hidden;
      text-overflow: ellipsis;
      display: -webkit-box;
      -webkit-line-clamp: 2;
      -webkit-box-orient: vertical;
}

其中overflow:hidden 保證超出行數的內容不顯示;display: -webkit-box-webkit-box-orient: vertical 表示採用-webkit-box顯示,其行數方向爲垂直。
這種方法實現起來簡單明瞭,缺點就是受用面太窄,只適用於webkit內核瀏覽器。並且,-webkit-box已經被flex替代,後續不太可能被其餘內核瀏覽器支持。不過,因爲大部分移動端瀏覽器(Safari, Android Browser, Chrome)都是webkit內核的,若是該頁面僅在移動端瀏覽,那麼這不失爲一種最簡單有效的方案。後端

方案二:clamp.js

CSS搞不定的事情,只能交給JS了。
解決方案代碼,請參考這個倉庫~ https://github.com/yuanqing/l...瀏覽器

基本思路

先按單詞截斷,再按字符進行截斷。單詞與字符的截斷方法相似,以截斷字符的思路爲例:性能

  • 每次循環減小element.innerHTML一個字符;flex

  • 觀察此時的element元素內容的高度是否知足要求的最大高度spa

    • 其中元素內容的高度用element.offsetHeight獲取;code

    • 獲取要求的最大高度:因爲傳入的是最大行數,故而將其與line-height相乘獲得(line-height能夠由計算樣式得到window.getComputedStyle(element).lineHeight);

function truncateByCharacter(element, maximumHeight, ellipsisCharacter) {
  const innerHTML = element.innerHTML;
  let length = innerHTML.length;

  while (length > 0) {
      element.innerHTML = innerHTML.substring(0, length).replace(TRAILING_WHITESPACE_REGEX, '') + ellipsisCharacter;
    if (element.offsetHeight <= maximumHeight) {
      return;
    }
    length--;
  }
}

JS的解決方案相比CSS的更加靈活,如須要隱藏或顯示更多文字信息時,則應該採用clamp.js解決方案。

總結

本文介紹的多餘文字省略方案,都是較爲經常使用的。單行文字解決方案中的text-overflow已經足以應對各類場景各類瀏覽器;而多行省略文字的解決方案較簡單的可採用-webkit-line-clamp方法,尤爲是移動端,若存在兼容性問題則參考clamp.js用JS來解決。

相關文章
相關標籤/搜索