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