CSS Podcast - 034:溢位
當內容超出其父項時,您可以透過多種方式處理。您可以捲動畫面來增加空白空間、裁剪溢出的邊緣、以省略號標示截斷處等等。在針對手機應用程式和多種螢幕大小進行開發時,溢位特別重要。
CSS 中有兩種不同的裁剪選項:text-overflow
可用於個別文字行,而 overflow
屬性可用於控制邊框模型中的溢位。
使用 text-overflow
的單行溢位
針對任何包含文字節點的元素使用 text-overflow
屬性,例如段落 <p>
。用於指定文字超出元素可用空間時的顯示方式。網頁上所有可見的 HTML 文字都位於 文字節點中。如要使用 text-overflow
,您需要使用單行未包裝的文字,因此您必須將 overflow
設為 hidden
,並設定禁止換行的 white-space
值。
p {
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
使用溢位屬性
溢位屬性會設在元素上,用於控制子項需要的空間大於可用空間時的處理方式。這可能是刻意為之,例如在 Google 地圖等互動式地圖中,使用者可平移經過裁剪至特定大小的大型圖片。這也可能是無意造成的,例如在聊天應用程式中,使用者輸入的訊息過長,無法顯示在文字氣泡中。
您可以將溢位想成兩個部分。父項元素具有不會變更的固定限制空間。您可以將此視為視窗。子元素是指需要從父項取得更多空間的內容。您可以將這視為透過視窗看到的畫面。管理溢位設定有助於引導視窗以這個內容框住此內容。
在垂直和水平軸上捲動
overflow-y
屬性可控制裝置可視區域垂直軸的實際溢位,因此上下捲動。
overflow-x
屬性會控制裝置檢視區的水平軸溢位,因此會左右捲動。
捲動方向的邏輯屬性
overflow-inline
和 overflow-block
屬性會根據文件方向和書寫模式設定溢位。
overflow
速記法
overflow
速記法可在同一行中設定 overflow-x
和 overflow-y
樣式:
overflow: hidden scroll;
如果指定兩個關鍵字,第一個關鍵字會套用至 overflow-x
,第二個關鍵字則會套用至 overflow-y
。否則,overflow-x
和 overflow-y
都會使用相同的值。
值
讓我們進一步瞭解 overflow
屬性可用的值和關鍵字。
overflow: visible
(預設)- 如未設定屬性,
overflow: visible
即為網站的預設值。這能確保系統絕不會在無意間隱藏內容,並遵循「永不隱藏內容」的核心原則。或「精確版面配置的安全版面配置」。 overflow: hidden
- 使用
overflow: hidden
時,系統會沿著指定方向裁剪內容,且不會提供捲軸來顯示內容。 overflow: scroll
overflow: scroll
可讓使用者透過捲軸捲動內容。即使內容目前未溢出,也會顯示捲軸。如果容器日後可能會根據大小調整等因素變成可捲動的區塊,並為使用者提供可捲動區塊的視覺效果,這麼做就能有效減少日後的版面配置變動。overflow: clip
- 與
overflow: hidden
一樣,含有overflow: clip
的內容會裁剪至元素的邊框間距。clip
和hidden
的差異在於,clip
關鍵字也會禁止所有捲動,包括程式輔助捲動。 overflow: auto
- 最後,最常用的值是
overflow: auto
。這樣會尊重使用者的偏好設定,並在需要時顯示捲軸,但預設會隱藏這類元件,使用者負責捲動至使用者和瀏覽器。
捲動和溢位
許多 overflow
行為都會引入捲軸,但有幾種特定捲動行為和屬性可協助您控制溢位容器的捲動。
捲動和無障礙設計
請務必確認可捲動的區域可接受焦點,讓使用鍵盤的使用者可以按 Tab 鍵前往方塊,然後使用方向鍵捲動。
如要讓捲動方塊接受焦點,請新增 tabindex="0"
、含有 aria-labelledby
屬性的名稱,以及適當的 role
屬性。例如:
<div tabindex="0" role="region" aria-labelledby="id-of-descriptive-text">
content
</div>
接著,您可以使用 CSS 指出方塊已獲得焦點,並使用 outline
屬性提供視覺提示,讓使用者知道方塊現在可捲動。
在「使用 CSS 強制執行無障礙功能」一節中,Adrian Roselli 說明瞭 CSS 如何協助避免無障礙功能迴歸問題。舉例來說,如果使用正確的屬性,您可以只開啟捲動功能並新增焦點指標。下列規則只有在含有 tabindex
、aria-labelledby
和 role
屬性的情況下,才能將方塊設為可捲動。
[role][aria-labelledby][tabindex] {
overflow: auto;
}
[role][aria-labelledby][tabindex]:focus {
outline: .1em solid blue;
}
捲軸在方塊模型中的定位
捲軸列會占用邊框間距內的空間,如果是 inline
而非 overlaid
,則可能會爭奪空間。箱模型模組會進一步說明可能的版面配置位移來源。
根捲軸與隱含捲動器
您可能會發現,部分捲動器具有拉動重新整理行為和其他特殊行為,尤其是在為行動裝置和混合應用程式開發時。這個捲動行為會在根捲動器上發生。一個頁面只能有一個根捲軸。根據預設,documentElement 是頁面的根捲動器,但變更哪個元素是根捲動器後,特殊行為就可以套用至 documentElement 以外的捲動器,我們將這個新的捲動器稱為隱含根捲動器。
如要建立根捲軸器,您可以使用「捲軸器升級」功能,將容器設為固定位置,確保捲軸器涵蓋整個檢視區,並在捲軸器上方顯示 z-index。您可以在這裡體驗根捲動器與巢狀隱含捲動器。
scroll-behavior
scroll-behavior
可讓您選擇瀏覽器控制的元素捲動方式。這可讓您指定如何處理 .scrollTo()
或連結等網頁內導覽功能。
搭配 prefers-reduced-motion 使用時特別實用,可根據使用者偏好指定捲動行為。
@media (prefers-reduced-motion: no-preference) {
.scroll-view {
scroll-behavior: auto;
}
}
overscroll-behavior
如果您曾經到達模式重疊層的結尾,然後繼續捲動,並讓重疊層後方的頁面移動,這就是捲動鏈結,或稱為向上傳遞至父項捲動容器。overscroll-behavior
屬性可防止溢位捲動洩漏到父項容器 (稱為捲動鏈結)。
進行隨堂測驗
測驗您對溢位功能的瞭解
文字溢位和元素溢位是否相同?
overflow
屬性可接受 2 個關鍵字,第一個關鍵字是哪個軸?
方塊模型中顯示和內嵌時,捲軸會使用哪個空間?
如要擷取巢狀隱含捲動器中的捲動額外動力,您會使用哪個屬性?
overscroll-behavior
overscroll-effect
scroll-behavior
scroll-padding
scroll-hint