用 CSS 完成單行與多行省略號功能!

什麼是省略號?

省略號就是「……」,又稱刪節號,中文省略號原本為「…」,後來因為避免與直排文字中的冒號混淆,因此改成「……」。在網頁排版中,常使用於文章列表中的標題與摘要段落,為了讓版面整齊,我們會使用省略號讓文字限制於特定行數使其高度一致。

許久以前,要處理省略號時,可能會使用以下方式

  • 後端程式語言(e.g. PHP)計算字數後加上省略號
  • 前端程式語言(e.g. Javascript)計算字號後加上省略號
  • 使用 HTML + CSS 產生一個內含省略號的小區塊放至在行尾

然而,隨著 CSS 技術的進展與瀏覽器對這些新技術支援度的提升,如今我們可以用幾行 CSS 設定就完成單行文字與多行文字的省略號功能,現在就來為大家介紹一下。

單行文字省略號

單行文字省略號的技術相信大家已不陌生,首先我們先使用 white-space: nowrap; 強制讓文字不換行,再來使用 overflow: hidden; 隱藏此行文字超出容器的部分,最後使用 text-overflow: ellipsis; 來為溢出的文字加上省略號即可。以下寫法舊版 IE 都支援,程式碼範例如下:

HTML

<h3 class="single-ellipsis">這是一個很長的標題超過一行就會隱藏,還包含 English text 可以再更多更多字,請再試試看,超過一行就會隱藏接下來的文字</h3>

CSS

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

呈現效果如下圖:

多行文字省略號

由於 text-overflow 屬性是處理文字溢出時如何顯示,然而如上所述是透過強制不換行的方式來完成文字溢出,因此並不適用於多行文字,接下來就為大家介紹多行文字如何透過 CSS 來實現省略號功能。

首先我們來可以透過 -webkit-line-clamp 這個屬性來限制區塊容器中內容為指定行數,這樣聽起來好像已經幾乎完成了,但是要注意的是 -webkit-line-clamp 必須要同時搭配以下條件才會生效

  • display 屬性設定為 -webkit-box 或 -webkit-inline-box 時
  • webkit-box-orient 屬性必須設為 vertical

最後,我們還會需要將 overflow 屬性設為 hidden,因為大多時候不設定此屬性,容器內的文字不會被裁減,下圖為沒設定 overflow: hidden 時多行文字沒有實現省略號功能並溢出了容器

設定 overflow: hidden 後,因文字內容超出容器的高而被隱藏,並搭配 -webkit-line-clamp 而完成限制行數並顯示省略號的需求。此方法除了 IE 不支援外,其他主流瀏覽器都支援,由於 IE 將在 2022 終止服務,因此放心地使用吧!程式碼範例如下:

HTML

<p class="multiline-ellipsis">這是一段很長的段落文字至少超過兩行,還包含 English text 可以再更多更多更多更多字。這是一段很長的段落文字至少超過兩行,還包含 English text 可以更多更多更多更多字,請再試試看。請再試試看,超過五行就會隱藏接下來的文字。這是一段很長的段落文字至少超過兩行,還包含 English text 可以再更多更多字。</p>

CSS

.multiline-ellipsis { 
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 5;
  overflow: hidden;
}

呈現效果如下圖:

最後附上實作範例給大家

相關資訊:
https://zh.wikipedia.org/wiki/%E7%9C%81%E7%95%A5%E5%8F%B7
https://developer.mozilla.org/en-US/docs/Web/CSS/white-space
https://developer.mozilla.org/en-US/docs/Web/CSS/overflow
https://developer.mozilla.org/en-US/docs/Web/CSS/text-overflow
https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-line-clamp
https://developer.mozilla.org/en-US/docs/Web/CSS/box-orient