2026年9月10日 星期四

響應式網頁設計(RWD)入門:5 步驟讓網頁在手機、平板、電腦都好看

你辛苦做好的網頁,在電腦上看起來很漂亮,拿手機一開,卻出現橫向捲軸、字小到看不清、圖片超出畫面……這是因為訪客使用的裝置五花八門,螢幕寬度從手機的 360 像素到桌機的 1920 像素都有。要讓同一個網頁在各種螢幕上都能舒服閱讀,就需要「響應式網頁設計」(Responsive Web Design,簡稱 RWD)。

本文延續上一篇〈網頁版面配置入門〉的觀念,用「記事本」與瀏覽器,以 5 個步驟做出一個會隨螢幕寬度自動調整的卡片網頁。我們會另外建立 rwd.html 與 rwd.css 練習,不影響你之前的檔案。文中的圖片為示意圖,不是實際畫面。

先搞懂:RWD 是什麼?

RWD 的概念是:只做一份網頁,讓它自己依照螢幕寬度調整排版,而不是為手機、平板、電腦各做一個網站。想做到這件事,需要三個要素:

  • 流動的版面:寬度用百分比等彈性單位,而不是固定像素。
  • 彈性的圖片:圖片不會比容器更寬。
  • 媒體查詢(Media Query):依螢幕寬度,套用不同的樣式。
同一份網頁,三種排版 手機:1 欄 平板:2 欄 電腦:3 欄
圖 1 螢幕越寬,欄數越多(示意圖)

步驟一:建立練習檔案,並設定 viewport

在 myweb 資料夾新增 rwd.html 與 rwd.css(存檔類型選「所有檔案」,編碼選 UTF-8),然後在 rwd.html 輸入:

<!DOCTYPE html>
<html lang="zh-Hant">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>響應式網頁練習</title>
  <link rel="stylesheet" href="rwd.css">
</head>
<body>

  <header class="top">
    <h1>響應式網頁練習</h1>
  </header>

  <main class="page">
    <section class="intro">
      <h2>歡迎來到我的網站</h2>
      <p>試著拉動瀏覽器視窗的寬度,看看下面的卡片會怎麼變化。</p>
    </section>

    <section class="cards">
      <article class="card"><h3>HTML</h3><p>決定網頁的結構與內容。</p></article>
      <article class="card"><h3>CSS</h3><p>決定網頁的外觀與版面。</p></article>
      <article class="card"><h3>JavaScript</h3><p>讓網頁能回應使用者的操作。</p></article>
      <article class="card"><h3>表格</h3><p>整齊地呈現資料。</p></article>
      <article class="card"><h3>表單</h3><p>蒐集訪客輸入的資料。</p></article>
      <article class="card"><h3>Flexbox</h3><p>彈性排列網頁的區塊。</p></article>
    </section>
  </main>

  <footer>
    <p>© 2026 我的學習筆記</p>
  </footer>

</body>
</html>

重點是 <head> 裡的這一行:

<meta name="viewport" content="width=device-width, initial-scale=1">

手機瀏覽器為了相容舊網站,預設會假裝自己的螢幕寬度有 980 像素,再把畫面縮小顯示。這行設定告訴它:「請使用裝置的真實寬度,不要縮放。」少了它,後面所有的 RWD 設定在手機上都不會生效,這是新手最常忘記的一步。

步驟二:用彈性單位取代固定寬度

RWD 的第一個原則:少用固定的像素寬度,多用彈性單位。打開 rwd.css,輸入以下的基本樣式:

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

body {
  font-family: "Microsoft JhengHei", sans-serif;
  font-size: 1rem;
  line-height: 1.8;
  color: #333333;
  background-color: #f5f8ff;
}

img {
  max-width: 100%;
  height: auto;
  display: block;
}

.top {
  background-color: #1f3a5f;
  color: #ffffff;
  text-align: center;
  padding: 20px 16px;
}

.top h1 {
  font-size: clamp(1.4rem, 4vw, 2.2rem);
}

.page {
  width: 92%;
  max-width: 1100px;
  margin: 24px auto;
}

.intro {
  margin-bottom: 24px;
}

footer {
  background-color: #1e293b;
  color: #cbd5e1;
  text-align: center;
  padding: 16px;
}

來看這幾個關鍵設定:

  • width: 92% 搭配 max-width: 1100px:內容區平常占螢幕 92% 的寬度,螢幕很寬時最多只到 1100 像素,兩者合作就能「小螢幕貼合、大螢幕不拉太寬」。
  • img { max-width: 100%; height: auto }:圖片最寬只會到容器的寬度,高度跟著等比例縮放。只要加上這一條,圖片就不會再超出畫面。
  • rem:相對於根元素字體大小的單位,預設 1rem=16 像素。用 rem 設定字級,使用者在瀏覽器調整字體大小時,網頁才會跟著變。
  • clamp(最小值, 理想值, 最大值):讓數值在範圍內隨螢幕變動。標題字級的理想值是視窗寬度的 4%,但不會小於 1.4rem,也不會大於 2.2rem。

常見的 CSS 單位

單位 意思 適合用在
px固定像素框線粗細、小細節
%相對於父元素區塊寬度
rem相對於根元素的字級字級、間距
vw、vh視窗寬度、高度的 1%滿版區塊、隨視窗變動的字級
frGrid 中「一份」剩餘空間Grid 欄寬(步驟三會用到)

步驟三:用 CSS Grid 排出卡片

上一篇我們學了 Flexbox,它擅長「一維」排列(一橫列或一直欄)。這次要認識它的好夥伴 CSS Grid(格線),專門處理「二維」的排列:同時控制列與欄,非常適合排卡片、相簿這類整齊的格狀內容。

在 rwd.css 後面加入:

.cards {
  display: grid;
  gap: 16px;
  grid-template-columns: 1fr;
}

.card {
  background-color: #ffffff;
  border: 1px solid #dbe3ee;
  border-radius: 8px;
  padding: 16px;
}

.card h3 {
  color: #1f6feb;
  margin-bottom: 6px;
}
  • display: grid:把 .cards 變成一個格線容器,裡面的卡片會自動排進格子。
  • grid-template-columns: 1fr:定義欄的數量與寬度。fr 是「份數」,1fr 代表只有一欄,寬度占滿整個容器。
  • gap: 16px:格子之間的間距,列與欄都適用。

存檔後用瀏覽器開啟 rwd.html,6 張卡片會由上往下排成一欄。這正好是手機畫面最適合的排法,我們先把手機版做好,這種做法稱為「行動優先」(Mobile First)。

Flexbox 與 Grid 怎麼選?

  • Flexbox:一維排列。適合選單、按鈕列、一排項目的對齊與分布。
  • Grid:二維排列。適合卡片牆、相簿、整個頁面的大區塊配置。

兩者可以搭配使用:用 Grid 排出整體格局,再用 Flexbox 排列每一格裡面的內容。

步驟四:用媒體查詢,在螢幕變寬時增加欄數

媒體查詢的寫法是 @media (條件) { 規則 },只有條件成立時,大括號裡的規則才會生效。「行動優先」的做法,是先寫好手機版的基本樣式,再用 min-width「當螢幕寬度『至少』達到多少時」,逐步加上更寬螢幕的樣式。請在 rwd.css 最後面加入:

@media (min-width: 600px) {
  .cards {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 960px) {
  .cards {
    grid-template-columns: repeat(3, 1fr);
  }
}
  • repeat(2, 1fr):等於寫 1fr 1fr,也就是兩欄等寬。repeat(3, 1fr) 就是三欄等寬。
  • min-width: 600px:視窗寬度達到 600 像素以上時,改成兩欄。
  • min-width: 960px:視窗寬度達到 960 像素以上時,改成三欄。
斷點(Breakpoint)與欄數 1 欄 基本樣式(手機) 2 欄 600px 以上(平板) 3 欄 960px 以上(電腦) 0 600px 960px 視窗寬度 紅線就是「斷點」:版面在這裡切換成另一種排法
圖 2 用兩個斷點,切成三種排版(示意圖)

存檔後重新整理 rwd.html,把瀏覽器視窗慢慢拉寬,你會看到卡片從 1 欄,變成 2 欄,再變成 3 欄。

斷點該怎麼決定?

視窗寬度 常見對應裝置 常見做法
小於 600px手機單欄,區塊上下堆疊
600px~959px平板、手機橫放雙欄
960px 以上筆電、桌機三欄以上、加上側邊欄

這些數字只是常見的參考值。比較好的做法是:拉動視窗寬度,在「版面看起來開始不舒服」的地方設斷點,而不是死守某款手機的規格。斷點也不必設太多,2 到 3 個通常就夠了。

步驟五:用 auto-fit 讓格線自動換欄,並測試成果

步驟四的做法很直覺,但每增加一種欄數就要多寫一個 @media。Grid 有個更聰明的寫法,可以不寫斷點,由瀏覽器自己決定能放幾欄。請把 .cards 規則裡的 grid-template-columns 改成:

.cards {
  display: grid;
  gap: 16px;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
}

然後把步驟四加入的兩個 @media 區塊刪掉(或前後加上 /* */ 註解起來),存檔重新整理。你會發現效果幾乎一樣,而且程式更短:

  • minmax(220px, 1fr):每個欄位「最窄 220 像素,最寬占一份」。
  • auto-fit:由瀏覽器計算「容器寬度能放得下幾個 220 像素的欄位」,放得下就多排一欄,放不下就自動減少欄數。
auto-fit:容器越寬,欄數自動越多 容器寬度約 300px → 1 欄 容器寬度約 500px → 2 欄 容器寬度約 720px → 3 欄 容器寬度約 960px → 4 欄 (寬度為縮小比例)
圖 3 auto-fit 會依容器寬度,自動決定欄數(示意圖)

什麼時候用 auto-fit?什麼時候用媒體查詢?

  • auto-fit+minmax:適合卡片、相簿這種「一堆相同大小的項目」,程式短、不用想斷點。
  • 媒體查詢:適合「版面結構」要改變的時候,例如電腦版的側邊欄,到了手機要移到文章下方,或選單要收合起來。

實務上兩者常常搭配使用。上一篇的 layout.css 最後那段,就是用媒體查詢,把雙欄改成單欄。

測試你的 RWD 成果

  1. 拉動視窗寬度:最簡單的方法。把瀏覽器視窗慢慢縮小,觀察版面在哪裡開始不舒服。
  2. 使用開發人員工具的裝置模擬:在 Chrome 或 Edge 按 F12,再按 Ctrl+Shift+M(或點工具列上的「切換裝置工具列」圖示),就能選擇各種手機、平板的尺寸預覽。Firefox 也可用 Ctrl+Shift+M 開啟「回應式設計模式」。
  3. 用真實的手機測試:模擬器無法完全取代實機。等你把網頁上傳到網站空間後,用自己的手機實際開啟看看,特別留意文字大小與按鈕好不好點。

新手常見問題

  • 手機上看起來是縮小的電腦版:檢查 <head> 裡有沒有 viewport 那行 <meta>,這是最常見的原因。
  • 畫面出現橫向捲軸:通常是某個元素用了固定的像素寬度,比螢幕還寬。找出是哪個元素,改用 % 或 max-width: 100%。圖片則記得加上 img { max-width: 100%; height: auto; }。
  • 媒體查詢沒有生效:確認括號與大括號有成對、@media 寫在被它覆蓋的規則「後面」(CSS 後寫的會蓋掉先寫的)。
  • min-width 與 max-width 搞混:min-width 是「寬度至少」,用在行動優先,由小到大;max-width 則是「寬度至多」,用在電腦優先,由大到小。同一份 CSS 盡量只選一種寫法,才不會越寫越亂。
  • 手機上字太小、按鈕不好點:內文字級建議不要小於 16 像素(1rem),按鈕與連結的可點區域,建議至少約 44 像素高。

小練習:讓網頁更能適應各種螢幕

  1. 在卡片裡放一張圖片,加上 img { max-width: 100%; height: auto; },拉動視窗確認圖片不會超出卡片。
  2. 把 minmax(220px, 1fr) 的 220 改成 160 與 300,觀察欄數有什麼不同。
  3. 替頁首加上選單,電腦版橫向排列,手機版(小於 600px)改成直向堆疊。
  4. 用 @media (min-width: 960px),替電腦版加上一個側邊欄,手機版則讓側邊欄移到內容下方。
  5. 挑戰:把前面幾篇做的課表放進 RWD 網頁,並讓表格在小螢幕時可以左右捲動(提示:把表格包在一個加上 overflow-x: auto 的 <div> 裡)。

結語

RWD 的核心觀念是:設定 viewport,用彈性單位取代固定寬度,再靠 Grid 與媒體查詢,讓版面隨螢幕寬度自動調整。今天你學會了 max-width、rem、clamp()、CSS Grid、行動優先的媒體查詢,以及不靠斷點的 auto-fit,這些是現代網頁設計的基本功。

下一步,可以把整個系列做的成果整合成一個完整的個人網站,並學習如何把網站上傳到網路空間,讓全世界的人都能看到你的作品。

沒有留言:

張貼留言