【CSS】CSS 單位指南與應用大全(em, rem, vh, vw, %, px, vmin, vmax)

閱讀時間約 12 分鐘
CSS 單位指南大全

CSS 單位指南大全

每一次在設定 CSS 時,單位總是在設定過程中,扮演了非常重要的角色。最近在補強 CSS 基礎的過程中,就將常見的單位應用整理出來。也提供實際應用的情境,希望讓讀者在處理各種 CSS 的單位時,不再有選擇困難。

對讀者來說,或許你已經聽說過像是「px」、「em」、「rem」、「vh/vw」以及 % 這些單位;但每一個單位,其實都有其潛在的設定與規則。接下來,筆者會深入探討這些單位的應用情境,以及如何選出合適的單位。

這一篇文章,會分成三個部分。分別是:

  1. 單位的基礎介紹
  2. 各單位的定義說明
  3. 各單位的應用情境、用法

就讓我們,開始探索吧!



一、單位的基礎介紹

基本單位可分成四個類別,分別是絕對長度、視圖長度、相對長度、比例長度

  • Absolute Length: 長度固定,無法被使用者調整。如 pxcm... 等。不要使用 cm 等單位,會因為銀幕解析度的差異,而導致長度不固定。
  • Viewport Length: 長度跟隨瀏覽器視窗而調整,包含 vhvwvminvmax 等單位。
  • Relative Length: 會隨著使用者的習慣調整,包含 remem 等,其他的鮮少用到。
  • Percentage Length: 特殊的比例長度,可能會隨著 viewport 或容器大小調整。

那你有想過,為什麼需要這麼多的單位嗎?

其實,主要是為了 Accessibility 的作用。因為有時要提供給一些特殊需求的使用者,或是為了滿足放大或縮小文字的特定使用。因此,需要讓他們有機會可以放大文字,但同時仍能控制排版。


哪一些屬性,可以使用這一些單位?

基本上圍繞在 Box-model 和定位上,font-size、padding、border、margin、width、height、top、bottom、left、right 都可以適用。通常瀏覽器預設的 1rem 都是 16px (font-size: 16px)。


為什麼需要可調整的單位?

Chrome Setting

Chrome Setting

因為使用者可能會調整瀏覽器的文字大小,我們希望可以隨著使用者設定的大小,來相對應調整。若使用固定如 20px 的大小,則文字不會根據瀏覽器設定,調整大小。




二、各單位的定義說明

接著,就來說明常見的單位,各自的定義是有哪些?

  1. Absolute Length - px
  2. Viewport Length - vh/vw
  3. Relative Length - em/rem
  4. Percentage Length - %



I. Absolute Length - px

.selector {
width: 500px; // 500 像素大小
height: 100px; // 100 像素大小
}

絕對長度。指的是完全固定的長度或尺寸。在 CSS 中,1 像素被正式定義為 1/96 英吋。所有其他的絕對長度單位,都是基於這個像素的定義。例如 cm 或 mm 等。

其實除了常見的 px 之外,也有 inch、cm 等單位可以使用;但會有一個極大的問題,該單位的換算,僅基於一個邏輯計算,例如 1 inch = 96px。

實際上,我們的硬體像素,實際上和軟體像素不同。中間會有一個換算比率。例如 iPhone SE 的設備硬體解析素為 640 x 1136,但軟體解析度則是 320 x 568,轉換率為 2.0。如果採用 inch 等設定,就會導致實際寬度會與預期不符。因此只要是固定長度,一率使用 px 來簡化狀況。



II. Viewport Length - vh/vw/vmin/vmax

.selector {
width: 100vw; // 100% viewport width
height: 100vh; // 100% viewport height
}


vh 和 vw 的定義
vhvw 分別指的是 viewport height 和 viewport width,換句話說,指的是瀏覽器的視窗(viewport)實際的寬度。使用 vh 和 vw 的好處,是可以省掉設定 height:100% 或 width: 100%,不一定會填滿視窗寬度的問題。

vmin 和 vmax 的定義
vminvmax 兩者的差異,在於 min 指的是 vw 和 vh 中較小的一邊;max 則是 vm 和 vh 中較大的一邊。舉例來說,1280px * 1600px 的長寬視窗比,vmin 指的就是 1280px;vmax 則是 1600px。而設定的則是比率,例如 120vmin 指的是 1280px * 120% 的意思;而 80vmax 指的是 1600px * 80% 的意思。

可以用來限制在特定長度或寬度下,可以達成 RWD 的效果。



III. Relative Length - em/rem

em 和 rem 是相對大小,後者指的是 root em,亦即僅會參考 root 的文字大小(亦即 body 的設定)。

  • em:根據父元素的大小,去乘以設定的比率。例如瀏覽器預設文字為 16px,父元素為 1.5em,且子元素設定為 1.5em,則子元素的文字會顯示 16px * 1.5 * 1.5 的文字大小。
  • rem:推薦使用單位。僅會參考 body 或預設瀏覽器設定的大小,不會理會父元素的設定。因為統一的標準都是 root 元素,因此更容易管理與調整。

因為現在瀏覽器的支援程度已經高達 96%,除非可能會用到 IE 舊版本的瀏覽器,不然通常都建議使用 em,作為相對單位的設定。而 em 僅建議使用在特定相依區域,不然大小很容易失控。因為我們不知道父元素是否有設定到 em。



IV. Percentage Length - %

要理解 % 的概念,就需要先理解 Containing block 的概念。意指對於某一個應用的元素來說,其參照的父元素就被稱為 containing block。

舉例來說,如果我有一個下列的元素。對於 div 來說,在 Nav 設定為 position: fixed 的情況下,瀏覽器的 viewport 就是 Nav 的 Containing block;如果設定 div 為 position: absolute 、 nav 設定為 position: relative 的情況下,nav 就是 div 的 containing block。

<nav>
<div />
</nav>

% 在不同 Position 的使用情境:

  • position: fixed: 該元素會根據 viewport 作為參照,並根據設定的 x% 來調整大小。
  • position: absolute: 會根據 ancestor element 該 containing block 的 content + padding 空間來計算。而 ancestor element 指的是顯式設定非position: static 狀態的元素為主。此時,設定 width: 100% 就會以 ancestor 的寬度為主。
  • position: static/relative: 會根據 block level 的父元素,來作為衡量的標準。如果父元素為 inline,則寬度會維持最小內容寬度,但高度會塌陷至內容所需的高度。


如何達成 100% 的瀏覽器 viewport 高度設定?
要從 html > body > ... > div 的目標元素,才有辦法讓 div 設定為 height: 100% 時,可以完全等於 100% 的 viewport。如果沒有設定 top: 0 / left: 0 或 inset 等參數,則一樣會吃到 margin-collapse 的狀態。



三、各單位的應用情境、用法

了解各個常見的單位後,就可以來了解不同情境下,可以如何應用上述所學到的單位。

  1. 對於文字尺寸的設定 Font-size
  2. 對於 Background 的長寬設定



I. 對於文字尺寸的設定 Font-size

因為瀏覽器本身可以設定文字基礎大小,若使用 px 固定大小則會無法自動調整。因此可以使用:

  • rem: 會根據瀏覽器在 html 的字體大小設定,乘以特定的比率來顯示。例如 1 rem 指的是預設 16px * 1 大小的字。通常建議使用此設定。
  • xx%:設定 70%,則會以瀏覽器的文字大小 * 70% 作為文字顯示,但不建議使用。
  • em: 會根據父元素的大小,去乘以設定的比率。例如父元素為 1.5em,則子元素設定為 1.5em 則會顯示 16px * 1.5 * 1.5 的文字大小。建議使用在特定相依區域,不然大小很容易失控。
  • not setting: 或是就根據瀏覽器預設尺寸,來設定。


II. 對於 Background 的長寬設定

對於背景的長寬設定,通常建議可以使用 vh 和 vw 來設定,使之可以根據銀幕大小動態調整。除非有長寬比會隨視窗調換的情境,才會使用 vmin 和 vmax。


III. Box-model 與 Position 的設定

常見的應用情境如下:

  • padding/margin: Only apply rem
  • borderpx (Usually not change)
  • widthx% or vw/vh (which is better depends on the situation)
  • top/buttom/left/rightx% (depend on containing block)


III. 寬度在 Windows 上的 Bug

https://bit.ly/3OkudIq

因為 Windows 如果使用 vw 會自動出現滾動條,為了避免可以使用 width: 100% 來代替。另一個方式,則是使用在 body 加上 overflow-x: hidden;。如果是縱向的捲軸,則可加上  overflow-y: hidden 來解決。


結論:CSS 單位

本文介紹了常見的 CSS 長度單位,包括絕對長度、相對長度、百分比長度以及 viewport 長度。其中,推薦使用相對長度 rem 和 em,以及 viewport 長度 vh 和 vw。此外,本文還介紹了不同情境下各單位的應用方法,包括文字尺寸的設定、背景的長寬設定以及 Box-model 與 Position 的設定。

CSS 之所以難學習,是因為多數時候他並沒有一定的邏輯,而是根據 W3C 的設定而來。這就導致 CSS 很單純靠理解來學習。因此,非常建議在一邊學習的同時,一定要一邊練習,讓眼睛能夠看到,才能夠了解 CSS 實際的變化為何。



延伸閱讀

技術文章

學習成長



Reference

此處作為整理前端(Frontend)和相關的 HTML、CSS、JavaScript、React 等前端觀念與技巧,全部都會收錄在這個專題之中。同時也會將相關的技術與反思記錄在此,歡迎各位讀者互相交流。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
在 React 測試生態系統中,React Testing Library 成為了方便好用的選擇,因其強調測試應該關注於使用者的操作與觀察元件行為,而不是測試細節實現。
在軟體領域中,"Thunk" 是一個常用的術語,它指的是一種用於延遲計算,或將運算延後執行的程式碼片段。它通常用於函數式編程,或編譯器的設計中。Redux 透過 createAsyncThunk 實作了該非同步/異步操作,並提供數個 API 協助我們使用 Redux。
React 表單驗證是一種技術與使用者體驗的設計,讓使用者能夠即時檢查輸入的資料並修正,提升使用者的使用體驗,並確保資料的正確性。
useContext 是一種 React hook,讓我們能夠直接取用其他元件的 Context,而無須層層傳遞 props,進而使程式碼簡潔易讀。
在傳統開發的過程中,很容易會搞混一般的 this 和箭頭函式(arrow function)中的 lexcial "this" 兩者的差異。本文就以實際的例子來說明各自的差異,以及在未來使用時需要注意哪一些細節。
在 React 測試生態系統中,React Testing Library 成為了方便好用的選擇,因其強調測試應該關注於使用者的操作與觀察元件行為,而不是測試細節實現。
在軟體領域中,"Thunk" 是一個常用的術語,它指的是一種用於延遲計算,或將運算延後執行的程式碼片段。它通常用於函數式編程,或編譯器的設計中。Redux 透過 createAsyncThunk 實作了該非同步/異步操作,並提供數個 API 協助我們使用 Redux。
React 表單驗證是一種技術與使用者體驗的設計,讓使用者能夠即時檢查輸入的資料並修正,提升使用者的使用體驗,並確保資料的正確性。
useContext 是一種 React hook,讓我們能夠直接取用其他元件的 Context,而無須層層傳遞 props,進而使程式碼簡潔易讀。
在傳統開發的過程中,很容易會搞混一般的 this 和箭頭函式(arrow function)中的 lexcial "this" 兩者的差異。本文就以實際的例子來說明各自的差異,以及在未來使用時需要注意哪一些細節。
你可能也想看
Google News 追蹤
Thumbnail
CSS 盒模型是理解和設計網頁佈局的核心概念。它包括元素的內容、填充、邊框和外邊距。
Thumbnail
CSS入門-Day3 的主要內容包括字體大小、字體顏色、字體系列、字體樣式、字體粗細等屬性。此外,還涵蓋了文本對齊、行高、文字間距、單詞間距和文本裝飾。最後,介紹了如何引入和使用 Google 字體,以提高網頁的排版效果。
Thumbnail
這節課的學習目標是了解 CSS 的基本語法結構和使用方法。
Thumbnail
CSS 是控制網頁外觀的語言,應用於網頁設計、UI/UX 設計、電子商務和移動應用開發。主要使用者包括前端開發者、UI/UX 設計師和網頁設計師。CSS 的特性有樣式控制、層疊優先級、響應式設計及分離內容與樣式。
Thumbnail
在學習 CSS 的過程中,Padding 與 Margin 是兩個經常出現的名詞,但對於初學者來說,可能會有些難以理解。因此,本篇文章將解釋這兩個非常重要的 CSS 屬性。當你掌握後,便能設計出更具層次或易讀的網頁。
CSS Box Model 是在 CSS 裡面,html 的每個元素都可被視作為一個盒子,然後可以針對這個盒子去做調整,看以下圖片: 簡單來說margin就是一個是外邊距,與外層元素的間距 Margin 用於控制元素與其周邊元素的間隔,可以設定為正數(增加與其他元素的距離)、負數(減少與其他
Thumbnail
接下來喜特先生會介紹一系列關於文字處理時,會常常運用到的函式。我們這次先從比較簡單的 LEN、CHAR 和 REPT 開始,之後會陸續介紹其他的。如果你有什麼想要了解的函式,歡迎在下面留言告訴我! LEN:字元長度 我們可以用 LEN 函式取得儲存格或字元的長度。 語法相當簡單:
Thumbnail
CSS 裡的「寬度,最大寬度,最小寬度」分別是什麼呢? ➊ width 用來設定元素的寬度,且 width 作用範圍僅在 content-box 區塊 ➋ max-width → 用來設定元素的最大寬度 ➌ min-width → 用來設定元素的最小寬度
Thumbnail
在 CSS 的開發過程中,重複使用如顏色、字體大小等值是常見的需求。為了提高程式碼維護性和靈活性,就需要用到 CSS 變量了,CSS 變量可以讓你在樣式表中儲存可重用的值。本文將介紹 CSS 變量的概念、使用方法,以及它對撰寫 CSS 的影響。
Thumbnail
您對前端有興趣,對CSS不陌生。CSS新特性前應瞭解基本內容。CSS屬性制定經歷過程,瀏覽器私有前綴及處理,開發者對新特性漸進增強,優雅降級處理,Web標準定義、作用等。
Thumbnail
CSS 盒模型是理解和設計網頁佈局的核心概念。它包括元素的內容、填充、邊框和外邊距。
Thumbnail
CSS入門-Day3 的主要內容包括字體大小、字體顏色、字體系列、字體樣式、字體粗細等屬性。此外,還涵蓋了文本對齊、行高、文字間距、單詞間距和文本裝飾。最後,介紹了如何引入和使用 Google 字體,以提高網頁的排版效果。
Thumbnail
這節課的學習目標是了解 CSS 的基本語法結構和使用方法。
Thumbnail
CSS 是控制網頁外觀的語言,應用於網頁設計、UI/UX 設計、電子商務和移動應用開發。主要使用者包括前端開發者、UI/UX 設計師和網頁設計師。CSS 的特性有樣式控制、層疊優先級、響應式設計及分離內容與樣式。
Thumbnail
在學習 CSS 的過程中,Padding 與 Margin 是兩個經常出現的名詞,但對於初學者來說,可能會有些難以理解。因此,本篇文章將解釋這兩個非常重要的 CSS 屬性。當你掌握後,便能設計出更具層次或易讀的網頁。
CSS Box Model 是在 CSS 裡面,html 的每個元素都可被視作為一個盒子,然後可以針對這個盒子去做調整,看以下圖片: 簡單來說margin就是一個是外邊距,與外層元素的間距 Margin 用於控制元素與其周邊元素的間隔,可以設定為正數(增加與其他元素的距離)、負數(減少與其他
Thumbnail
接下來喜特先生會介紹一系列關於文字處理時,會常常運用到的函式。我們這次先從比較簡單的 LEN、CHAR 和 REPT 開始,之後會陸續介紹其他的。如果你有什麼想要了解的函式,歡迎在下面留言告訴我! LEN:字元長度 我們可以用 LEN 函式取得儲存格或字元的長度。 語法相當簡單:
Thumbnail
CSS 裡的「寬度,最大寬度,最小寬度」分別是什麼呢? ➊ width 用來設定元素的寬度,且 width 作用範圍僅在 content-box 區塊 ➋ max-width → 用來設定元素的最大寬度 ➌ min-width → 用來設定元素的最小寬度
Thumbnail
在 CSS 的開發過程中,重複使用如顏色、字體大小等值是常見的需求。為了提高程式碼維護性和靈活性,就需要用到 CSS 變量了,CSS 變量可以讓你在樣式表中儲存可重用的值。本文將介紹 CSS 變量的概念、使用方法,以及它對撰寫 CSS 的影響。
Thumbnail
您對前端有興趣,對CSS不陌生。CSS新特性前應瞭解基本內容。CSS屬性制定經歷過程,瀏覽器私有前綴及處理,開發者對新特性漸進增強,優雅降級處理,Web標準定義、作用等。