5.3 響應式設計與媒體查詢#
時代轉折:iPhone 與「行動優先」#
2007 年 iPhone 問世前,網站=桌面。之後行動流量 2016 年超過桌面(並持續擴大)。2010 年 Ethan Marcotte 提出 Responsive Web Design(RWD)三支柱:
- 流式格線(fluid grid)—— 相對單位
- 彈性媒體(flexible media)—— 圖片隨容器縮放
- 媒體查詢(media queries)—— 依裝置條件調整樣式
背後的世界觀轉變:你不知道使用者的裝置,也不該假設 —— 從「設計一張固定畫布」變成「設計一套會呼吸的規則」。
Viewport:一切的起點#
<meta name="viewport" content="width=device-width, initial-scale=1" />
沒有它,手機瀏覽器假設頁面是 980px 寬的桌面頁,然後縮小塞進 390px 螢幕 —— 字如螻蟻。這一行 meta 是行動網頁的前提(4.2 節已提,此處補全因果)。
媒體查詢#
/* 窄於 768px(含)適用 */
@media (max-width: 768px) {
.sidebar { display: none; }
}
/* 依裝置能力而非寬度 */
@media (prefers-color-scheme: dark) { /* 深色模式 */
body { background: #111; color: #eee; }
}
@media (hover: none) { /* 觸控裝置:放大點擊目標 */
.btn { min-height: 44px; }
}
@media (prefers-reduced-motion: reduce) { /* 4.4 無障礙 */
* { animation: none; }
}
行動優先(mobile first)的寫法#
/* 基礎樣式 = 手機(預設最小) */
.container { display: block; }
/* 平板起,逐級增強 */
@media (min-width: 768px) {
.container { display: grid; grid-template-columns: 1fr 2fr; }
}
為什麼行動優先:桌面版樣式簡單(手機版 + 增強),反向寫法要不停「撤除」桌面樣式(覆蓋成本高)。這也是效能策略:手機不需要載入桌面專用的規則與資源。
斷點的真相#
斷點不是「iPhone 的寬度」,而是你的內容開始破版的寬度:
\[ \text{斷點} = \text{讓內容變形臨界點,而非設備清單} \]
實務用 3–5 個斷點就夠(576 / 768 / 1024 / 1200),其餘靠流式佈局與 5.2 節的 minmax 自動處理。
彈性媒體#
img, video { max-width: 100%; height: auto; } /* 絕不破容器 */
/* iframe 影片的比例鎖定(避免 CLS,4.4 節) */
.video-wrap {
aspect-ratio: 16 / 9; /* 現代解 */
}
配合 4.2 節的 srcset:寬度響應不只改 CSS,還要換資源 —— RWD 是全鏈路工程,不只 CSS。
邏輯屬性與容器查詢:RWD 的下一代#
邏輯屬性:讓佈局支援 RTL#
.card {
margin-inline-start: 16px; /* 取代 margin-left */
padding-block: 8px; /* 取代 padding-top/bottom */
}
left/right 變成 inline-start/end:切換阿拉伯文(右到左)版面時,CSS 不用重寫 —— 抽象方向而非座標。
容器查詢(Container Queries, 2023)#
媒體查詢問「視窗多寬」,容器查詢問「我的容器多寬」:
.card-zone { container-type: inline-size; }
@container (min-width: 480px) {
.card { display: flex; } /* 卡片在側欄時直排、拉寬時橫排 */
}
革命性:元件根據自己被放進的容器自適應 —— 元件真正可攜,不再假設頁面寬度。這把 RWD 從「頁面級」下放到「元件級」,與元件化開發(React 時代)終於對齊。
快速響應檢查清單#
flowchart TD
A[viewport meta 設了嗎] --> B[字級用 rem 嗎]
B --> C[佈局用 %/flex/grid 嗎]
C --> D[圖片 max-width + srcset]
D --> E[觸控目標 ≥ 44px]
E --> F[實機測:375px / 768px / 1440px]習題#
- 把 5.2 節的三欄頁面改成行動優先:手機單欄、平板雙欄、桌面三欄,數出你用了幾個媒體查詢,並解釋哪些被 minmax 免掉了。
- 容器查詢與媒體查詢的差別,用「同一個卡片組件放進側欄與主欄」的例子說明。
- 深色模式除了媒體查詢,還要注意配色對比(4.4)—— 設計一組兩模式都過 4.5:1 的色票。