文章中英模式
布魯斯前端面試題目 - px vs rem vs em 詳解
深入了解CSS中px、rem和em單位的差異、使用場景與響應式設計實踐,掌握現代網頁開發中各種長度單位的精確應用。
文章中英模式
懶得看文章?那就來看影片吧
CSS長度單位的基本概念
CSS提供了多種設置元素尺寸的單位,它們可以分為絕對單位(如px)和相對單位(如em、rem、%)。理解這些單位的特性及適用場景,對於創建響應式且可訪問的網頁至關重要。
本文將重點介紹三種最常用的長度單位:px、em和rem,它們的差異以及各自的優缺點。
像素(px)- 固定的絕對單位
像素(px)是CSS中最基本的絕對單位,表示螢幕上的一個物理顯示點。
px特性
- 1. 固定大小,不受外部因素影響
- 2. 1px在不同的螢幕密度下可能有不同的實際大小
- 3. 不隨用戶設置的字體大小變化
- 4. 精確控制元素大小
.button {
width: 200px;
height: 50px;
font-size: 16px;
padding: 10px;
border-radius: 4px;
}
px的優點
- 1. 精確控制元素尺寸
- 2. 穩定且可預測的表現
- 3. 適合需要像素級別精確的設計
- 4. 直觀易懂,數值即視覺大小
px的缺點
- 1. 缺乏響應式特性,不隨視窗變化
- 2. 不隨用戶的字體大小設置變化
- 3. 在高DPI螢幕可能呈現不一致
- 4. 不利於實現無障礙設計
em - 相對於父元素的單位
em是一種相對單位,相對於元素的父元素的字體大小。1em等於父元素的字體大小。
em特性
- 1. 相對於父元素的字體大小
- 2. 具有繼承性和級聯效果
- 3. 可用於創建比例關係的設計
- 4. 在嵌套元素中會產生複合效果
body {
font-size: 16px; /* 基準字體大小 */
}
.parent {
font-size: 20px; /* 新的基準 */
}
.child {
font-size: 1.5em; /* = 20px * 1.5 = 30px */
margin: 1em; /* = 30px * 1 = 30px (因為margin相對於自身字體大小) */
}
.grandchild {
font-size: 1.5em; /* = 30px * 1.5 = 45px (注意這裡的複合效果) */
}
em的優點
- 1. 能創建比例一致的設計
- 2. 適合定義元素內部的相對尺寸
- 3. 在元素縮放時保持內部比例
- 4. 可以根據父元素調整大小
em的缺點
- 1. 複合效應可能導致難以預測的結果
- 2. 嵌套元素的尺寸計算複雜
- 3. 需要謹慎管理繼承關係
- 4. 不易於全局一致的響應式設計
rem - 相對於根元素的單位
rem(root em)是相對於根元素(html)的字體大小的單位。1rem等於根元素的字體大小。
rem特性
- 1. 相對於根元素的字體大小
- 2. 不受元素嵌套層級的影響
- 3. 便於全局控制網站的比例
- 4. 簡化響應式設計的實現
html {
font-size: 16px; /* 根元素字體大小 */
}
@media (max-width: 768px) {
html {
font-size: 14px; /* 小螢幕上調整根字體大小 */
}
}
.title {
font-size: 2rem; /* = 16px * 2 = 32px (在大螢幕) */
/* = 14px * 2 = 28px (在小螢幕) */
}
.container {
width: 50rem; /* = 16px * 50 = 800px (在大螢幕) */
/* = 14px * 50 = 700px (在小螢幕) */
padding: 1.5rem; /* = 16px * 1.5 = 24px (在大螢幕) */
/* = 14px * 1.5 = 21px (在小螢幕) */
}
rem的優點
- 1. 易於全局控制所有元素的比例
- 2. 不受嵌套影響,計算簡單
- 3. 非常適合響應式網站設計
- 4. 支持用戶自訂字體大小的無障礙設計
rem的缺點
- 1. 不能基於父元素創建局部比例關係
- 2. IE8及以下瀏覽器不支持
- 3. 過度依賴於根元素設置
- 4. 可能需要JavaScript輔助實現高級響應式行為
單位對比:何時使用px、em還是rem?
單位 | 適用場景 | 優勢 |
---|---|---|
px | 邊框、陰影、一像素線條 | 精確控制視覺元素 |
媒體查詢斷點 | 基於設備尺寸的精確值 | |
小型裝飾元素 | 不需隨字體變化的元素 | |
rem | 字體大小 | 全站一致縮放,支持用戶自訂 |
按鈕、輸入框 | 保持表單元素一致響應 | |
容器尺寸、間距 | 整體佈局響應式調整 | |
em | 元素內部間距 | 與元素字體大小成比例 |
圖標、局部元素 | 與周圍文本保持比例關係 |
最佳實踐是混合使用這些單位,針對不同的元素和目的選擇最合適的單位。現代網頁設計中,常見的方法是:
- 1. 使用rem作為全局比例的基礎(字體大小、間距、容器尺寸)
- 2. 使用em處理與特定元素字體相關的排版細節
- 3. 使用px處理需要精確控制的小元素和視覺細節
- 4. 使用%處理響應式佈局的寬度和彈性元素
使用rem實現響應式設計
rem單位在響應式設計中特別有用,因為通過改變根元素的字體大小,我們可以同時按比例調整整個網站的元素大小。
/* 基於視窗寬度動態設置根字體大小 */
html {
/* 默認字體大小 */
font-size: 16px;
}
/* 平板設備 */
@media (max-width: 992px) {
html {
font-size: 15px;
}
}
/* 手機設備 */
@media (max-width: 576px) {
html {
font-size: 14px;
}
}
/* 或使用vw單位使字體大小流暢縮放 */
html {
/* 基準為16px(在視窗寬度為1000px時) */
font-size: calc(14px + 0.2vw);
}
/* 然後所有使用rem的元素都會自動響應 */
.container {
width: 70rem; /* 會隨根字體大小變化 */
padding: 2rem;
}
.heading {
font-size: 2.5rem;
margin-bottom: 1.5rem;
}
🔥 常見面試題目
(一) 解釋px、em和rem之間的主要區別
答:px、em和rem的主要區別在於它們的參考基準:
- px(像素) 是絕對單位,表示螢幕上的一個物理點。1px始終是固定大小,不受任何元素的字體大小影響。
- em 是相對單位,相對於當前元素的父元素的字體大小。例如,如果父元素的字體大小是16px,那麼子元素的1em就等於16px。em具有繼承性,在嵌套元素中會產生複合效果。
- rem 是相對單位,相對於根元素(html)的字體大小。所有的rem值都統一參考根元素字體大小,不受元素嵌套的影響。比如,如果html的字體大小是16px,那麼1rem就等於16px,無論這個元素在文檔中的嵌套位置如何。
這些區別決定了它們的適用場景:px適合精確控制,em適合元素內部的比例關係,rem適合全局一致的響應式設計。
(二) em和rem在嵌套元素中的表現有何不同?
答:em和rem在嵌套元素中的主要區別是:
em單位會產生複合效應:
/* 假設body的字體大小是16px */
.parent {
font-size: 1.5em; /* = 16px * 1.5 = 24px */
}
.child {
font-size: 1.5em; /* = 24px * 1.5 = 36px */
}
.grandchild {
font-size: 1.5em; /* = 36px * 1.5 = 54px */
}
rem單位不受嵌套影響,始終參考根元素大小:
/* 假設html的字體大小是16px */
.parent {
font-size: 1.5rem; /* = 16px * 1.5 = 24px */
}
.child {
font-size: 1.5rem; /* = 16px * 1.5 = 24px (仍然參考根元素) */
}
.grandchild {
font-size: 1.5rem; /* = 16px * 1.5 = 24px (仍然參考根元素) */
}
這種差異使rem更適合全局一致的大小控制,而em適合在特定元素內部創建比例關係。比如,可以用rem設置全局字體大小,用em設置段落內的標題、列表等元素,使它們與周圍內容保持一致比例。
(三) 為什麼在響應式設計中rem單位比px更受推薦?
答:在響應式設計中,rem單位比px更受推薦,原因如下:
優勢 | 說明 |
---|---|
全局比例縮放 | 通過僅改變根元素字體大小,網頁上所有使用rem的元素都會成比例調整,簡化媒體查詢 |
無障礙性支持 | 尊重用戶的字體大小設置,對有視力障礙的用戶更友好 |
維護性 | 更容易維護比例一致的設計系統,因為所有尺寸都基於同一個參考值 |
設備適配性 | 更容易適應不同尺寸的設備,不需要為每個元素單獨設置斷點 |
流暢的縮放 | 結合vw等單位設置html的字體大小,可以實現元素尺寸隨視窗大小流暢縮放 |
實際開發中,常見的模式是使用rem設置布局尺寸和文本大小,然後使用媒體查詢調整根字體大小,從而一次性調整整個頁面的比例。這比使用px單獨調整每個元素更高效且一致。