天天看點

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...
之前一直在部落格園寫作,最近幾天才開的知乎專欄,才疏學淺, 謬誤之處請不吝于評論區指教,謝謝大家。

文章目錄

  • 單行文本溢出的省略
  • 從單行文本溢出省略到多行文本溢出省略
  • 多行文本溢出的省略(...)方案一 ---簡單友善的解決方案
  • 多行文本溢出的省略(...)方案二 ---簡單粗暴的解決方案
  • 多行文本溢出的省略(...)方案三 --簡潔優雅的解決方案

寫前端UI的朋友們也許都遇到過這樣的問題:我們需要實作這樣一個需求,在一個父級元素中隐藏一個可能過長的文本

這個文本可能是單行的:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...

也可能是多行的:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...

下面我就給大家展示如何簡單或優雅地實作這種需求

單行文本溢出的省略

先上代碼

<
           

demo:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...
關于overflow: hidden

這裡我們需要注意到一點:這裡的overflow并不是設定為父級元素div的屬性,而是p标簽的屬性,需要和overflow的普通用法區分開來

  1. overflow:hidden的普通用法:用在塊級元素(例如div)的外層隐藏内部溢出元素
  2. overflow: hidden的特殊用法:在上述例子中配合text-overflow: ellipsis;white-space: nowrap;實作p元素隐藏自身的溢出并設定(...)的效果
關于text-overflow: ellipsis;

這一屬性依賴于overflow: hidden存在,隻有設定了overflow:hidden它才是能夠生效的,你可以把它看作overflow對于文本溢出隐藏的一種‘特殊樣式’

關于white-space: nowrap

它的作用是讓文本不換行,這是overflow:hidden和text-overflow:ellipsis生效的基礎!沒有它overflow:hidden和text-overflow:ellipsis無法生效!(在單行文本溢出省略這一案例中)

從單行文本溢出省略到多行文本溢出省略

許多同學可能會這樣想:怎麼實作多行文本省略呢?不是隻要把white-space:nowrap去掉就可以了嗎?( _(:3 」∠)_ 要是這麼簡單就好了...)

實踐出真知,讓我們來試一下,

去掉CSS樣式中的white-space:nowrap

demo:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...

這次,沒能隐藏成功,那如果我們overflow:hidden是設在父級元素div中呢?

得到demo:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...

隐藏成功了,

可你仍然看不到你想看到的那三個點

妥妥地失敗了,嗯,沒錯,是以對于多行文本溢出的省略我們需要另辟蹊徑了

多行文本溢出的省略(...)方案一 ---簡單友善的解決方案

我們可以借助

webkit的CSS擴充屬性

實作這一點:

<
           

demo:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...

【注意】

  1. 四行CSS缺一不可!
  2. 因為這是webkit的CSS屬性擴充,是以相容浏覽器範圍是PC端的webkit核心的浏覽器:chrome/safari/QQ浏覽器/360/獵豹等以及絕大多數的移動端浏覽器
多行文本溢出的省略(...)方案二 ---簡單粗暴的解決方案
方案一固然最為簡單,但其還存在着跨浏覽器相容的問題

,于是人民群衆們提出了一種簡單粗暴的方式去實作通用的解決方案:給div固定高和寬,同時采用相對定位,與此同時對在div内放一個<p>...</p>對其使用絕對定位,定在右下角,同時設其背景顔色為白色就可以了:

<
           

demo:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...

但方案二也有一些問題

1在文本沒有溢出父級元素時也同樣顯示省略号:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...

2末尾處文本可能有被“裁剪”的副效果:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...
多行文本溢出的省略(...)方案三 --簡潔優雅的解決方案

那麼有沒有更加優雅的解決方案,在沒有溢出的時候不顯示省略号(...),在溢出的時候隐藏并顯示省略号呢?答案是有的!先看看我們最終實作的demo:

在文本沒有溢出父級元素時:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...

文本溢出父級元素時:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...

下面是HTML和JS代碼:

<
           

JS代碼

s 
           

首先我們需要弄清楚offsetHeight和scrollHeight所表示的高度:

1溢出顯示滾動條時:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...

2沒有溢出時:

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...
el 
           

表示的是取到目前包裹文本的父級元素的高度

el
           

表示在for循環中取出長度遞增的文段,例如:

'這'   --> '這是'   -->   '這是一'
           

當n < el.scrollHeight也就是 目前文本高度<滾動條内的内容的高度,代表着剛好達到溢出的界限,此時執行if内的語句

el
           

将父級元素view的overflow設定為hidden,并且将末尾的三個文字用...取代,同時跳出for循環

perfect! 這樣我們就實作了優雅的解決方案

css中如何實作幀布局_【CSS/JS】如何實作單行/多行文本溢出的省略(...)--繞過坑道的正确姿勢...

繼續閱讀