本單元延續前面 HTML / CSS 的基礎,目標是讓學生能從「做出單一頁面」進一步進入「做出能適應不同螢幕尺寸的頁面」。
新聞、專題、數位長文、活動頁、資料新聞頁面,常常需要同時在桌機、平板、手機上閱讀。因此本單元會從兩個方向切入:
完成本單元後,學生應該能夠:
row、col、p-*、m-*、btn、card、navbar 等。傳統網頁常以桌機螢幕為主,但現在使用者可能透過以下裝置閱讀:
對新聞網站與數位專題而言,這件事特別重要。讀者可能在捷運上用手機打開,也可能在辦公室用電腦閱讀。如果頁面只適合桌機,在手機上可能會出現:
RWD 是 Responsive Web Design,中文通常稱為「響應式網頁設計」或「自適應網頁設計」。
它的核心不是「幫每一種裝置做一份網頁」,而是:
用同一份 HTML,搭配不同 CSS 規則,讓版面能依照螢幕大小自動調整。
常見做法包括:
fr、auto、flex 等彈性單位。max-width 限制內容不要太寬。media query 在不同寬度下切換樣式。Flexbox 是 CSS 的一種排版模型,全名是 Flexible Box Layout。
它很適合處理「一維排版」,也就是:
Flexbox 的常見應用:
Flexbox 需要套用在「容器」上:
.container {
display: flex;
}
HTML 範例:
<div class="container">
<div>區塊 A</div>
<div>區塊 B</div>
<div>區塊 C</div>
</div>
只要父層 .container 設定 display: flex,裡面的直接子元素就會變成 flex items。
Flexbox 最重要的概念是:
預設情況下:
.container {
display: flex;
flex-direction: row;
}
此時主軸是水平向右,交錯軸是垂直向下。
如果改成:
.container {
display: flex;
flex-direction: column;
}
主軸就會變成垂直向下,交錯軸則變成水平。
這會影響 justify-content 與 align-items 的方向。
啟用 Flexbox 排版。
.box {
display: flex;
}
決定子元素排列方向。
.box {
display: flex;
flex-direction: row;
}
常見值:
| 值 | 說明 |
|---|---|
row |
水平排列,預設值 |
row-reverse |
水平反向排列 |
column |
垂直排列 |
column-reverse |
垂直反向排列 |
控制主軸方向的對齊方式。
.box {
display: flex;
justify-content: center;
}
常見值:
| 值 | 說明 |
|---|---|
flex-start |
靠主軸起點 |
flex-end |
靠主軸終點 |
center |
置中 |
space-between |
第一個靠左,最後一個靠右,中間平均分配 |
space-around |
每個元素左右都有空間 |
space-evenly |
所有間距完全平均 |
控制交錯軸方向的對齊方式。
.box {
display: flex;
align-items: center;
}
常見值:
| 值 | 說明 |
|---|---|
stretch |
拉伸填滿,預設值 |
flex-start |
靠交錯軸起點 |
flex-end |
靠交錯軸終點 |
center |
交錯軸置中 |
baseline |
依文字基線對齊 |
控制子元素是否換行。
.box {
display: flex;
flex-wrap: wrap;
}
常見值:
| 值 | 說明 |
|---|---|
nowrap |
不換行,預設值 |
wrap |
空間不足時換行 |
wrap-reverse |
反向換行 |
控制 flex item 之間的間距。
.box {
display: flex;
gap: 16px;
}
gap 比手動幫每個元素加 margin 更直覺,也比較不容易出錯。
你提到的:
flex: 1 0 auto;
它其實是三個屬性的縮寫:
flex-grow: 1;
flex-shrink: 0;
flex-basis: auto;
控制「剩餘空間要不要分配給這個元素」。
.main {
flex-grow: 1;
}
如果一個元素 flex-grow: 1,它會吃掉剩餘空間。
控制「空間不足時,這個元素可不可以被壓縮」。
.sidebar {
flex-shrink: 0;
}
如果設定 flex-shrink: 0,表示它不希望被壓縮。
控制元素在分配空間前的基準大小。
.sidebar {
flex-basis: 240px;
}
這可以理解成「在 flex 運算開始前,先假設這個元素是 240px」。
.main {
flex: 1;
}
等同於常見的彈性主內容區。
.layout {
display: flex;
}
.sidebar {
width: 240px;
flex-shrink: 0;
}
.content {
flex: 1;
}
.center-box {
display: flex;
align-items: center;
justify-content: center;
}
這是 Flexbox 最常見、也最實用的用法之一。
建立一個版面:
概念圖:
+-----------------------------------+
| top bar |
+---------+----------------+--------+
| left | content | right |
| sidebar | | sidebar|
+---------+----------------+--------+
| bottom bar |
+-----------------------------------+
<div class="page">
<header class="top">Top Bar</header>
<div class="middle">
<aside class="left">Left Sidebar</aside>
<main class="content">Main Content</main>
<aside class="right">Right Sidebar</aside>
</div>
<footer class="bottom">Bottom Bar</footer>
</div>
html,
body {
margin: 0;
min-height: 100%;
}
.page {
min-height: 100vh;
display: flex;
flex-direction: column;
}
.top,
.bottom {
padding: 16px;
background: #222;
color: white;
text-align: center;
}
.middle {
flex: 1;
display: flex;
}
.left,
.right {
width: 200px;
padding: 16px;
background: #eee;
flex-shrink: 0;
}
.content {
flex: 1;
padding: 16px;
background: #fff;
}
.page.page {
min-height: 100vh;
display: flex;
flex-direction: column;
}
這裡讓整個頁面至少等於瀏覽器高度。
flex-direction: column 表示 .page 裡面的三個區塊會垂直排列:
.top.middle.bottom.middle.middle {
flex: 1;
display: flex;
}
.middle 的 flex: 1 表示它會吃掉 top 與 bottom 之外剩下的高度。
同時 .middle 自己也是 flex container,因此裡面的 left、content、right 會水平排列。
.content.content {
flex: 1;
}
這代表中間內容區會自動吃掉左右側邊欄之外的剩餘寬度。
Media Query 是 CSS 裡面根據條件套用樣式的語法。
最常見的條件是螢幕寬度:
@media (max-width: 768px) {
.middle {
flex-direction: column;
}
}
意思是:
當螢幕寬度小於或等於 768px 時,套用裡面的 CSS。
常見斷點可以這樣理解:
| 裝置類型 | 大約寬度 |
|---|---|
| 手機 | 小於 576px |
| 大手機 / 小平板 | 576px 以上 |
| 平板 | 768px 以上 |
| 小筆電 | 992px 以上 |
| 桌機 | 1200px 以上 |
| 大螢幕 | 1400px 以上 |
實務上不一定要死背這些尺寸。比較好的做法是:
當你的版面開始壞掉時,就在那個寬度附近加一個 breakpoint。
先寫桌機版,再用 max-width 修改手機版。
.card-list {
display: flex;
}
@media (max-width: 768px) {
.card-list {
flex-direction: column;
}
}
這種寫法直覺,適合初學者。
先寫手機版,再用 min-width 加強大螢幕版。
.card-list {
display: flex;
flex-direction: column;
}
@media (min-width: 768px) {
.card-list {
flex-direction: row;
}
}
Bootstrap 採用的就是比較接近 Mobile First 的思路。
在手機上,左右側邊欄不適合繼續擠在左右,所以可以改成垂直排列。
@media (max-width: 768px) {
.middle {
flex-direction: column;
}
.left,
.right {
width: auto;
}
}
這樣手機版會變成:
+------------------+
| top bar |
+------------------+
| left sidebar |
+------------------+
| main content |
+------------------+
| right sidebar |
+------------------+
| bottom bar |
+------------------+
在 HTML 的 <head> 裡面要加入:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
如果沒有這行,手機瀏覽器可能會用虛擬桌機寬度顯示網頁,導致 RWD 不如預期。
img {
max-width: 100%;
height: auto;
}
這可以避免圖片在手機上超出螢幕。
不建議大量使用:
width: 1200px;
比較好的寫法是:
.container {
width: 100%;
max-width: 1200px;
margin: 0 auto;
}
這樣在大螢幕上不會太寬,在小螢幕上也能自動縮小。
Bootstrap 是一套常見的前端 CSS 框架。
它提供許多已經寫好的 class,讓我們不用從零開始寫 CSS,就可以快速建立:
對初學者來說,Bootstrap 的優點是可以很快做出「看起來像網站」的頁面。
對新聞系學生來說,Bootstrap 很適合拿來快速做:
可以用 CDN 引入 Bootstrap CSS。
<link
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
rel="stylesheet"
>
若要使用 navbar collapse、dropdown、modal 等需要 JavaScript 的元件,還要引入 Bootstrap JS:
<script
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js">
</script>
基本 HTML 範例:
<!doctype html>
<html lang="zh-Hant">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap Demo</title>
<link
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
rel="stylesheet"
>
</head>
<body>
<h1>Hello Bootstrap</h1>
<script
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js">
</script>
</body>
</html>
<p class="text-light">淺色文字</p>
<p class="text-dark">深色文字</p>
<p class="text-primary">主要色文字</p>
<p class="text-danger">危險或警示文字</p>
<div class="bg-dark text-light">深色背景,淺色文字</div>
<div class="bg-light text-dark">淺色背景,深色文字</div>
<div class="bg-primary text-light">主色背景</div>
常見顏色類別:
| 類別 | 常見用途 |
|---|---|
primary |
主色、主要按鈕 |
secondary |
次要資訊 |
success |
成功、正向訊息 |
danger |
危險、錯誤、警示 |
warning |
注意 |
info |
補充資訊 |
light |
淺色 |
dark |
深色 |
Bootstrap 用 p 表示 padding,用 m 表示 margin。
<div class="p-3">四周 padding</div>
<div class="m-3">四周 margin</div>
數字通常從 0 到 5:
| 類別 | 意義 |
|---|---|
p-0 |
沒有 padding |
p-1 |
很小的 padding |
p-2 |
小 padding |
p-3 |
中等 padding |
p-4 |
較大 padding |
p-5 |
很大的 padding |
方向縮寫:
| 縮寫 | 方向 |
|---|---|
t |
top |
b |
bottom |
s |
start,左邊,RTL 語系時會相反 |
e |
end,右邊,RTL 語系時會相反 |
x |
左右 |
y |
上下 |
範例:
<div class="pt-3">上方 padding</div>
<div class="px-4">左右 padding</div>
<div class="my-5">上下 margin</div>
<div class="border rounded p-3">
有邊框與圓角的區塊
</div>
常見類別:
<div class="border">邊框</div>
<div class="border-top">只有上邊框</div>
<div class="rounded">圓角</div>
<div class="rounded-pill">膠囊形圓角</div>
Bootstrap 按鈕通常使用:
<a href="#" class="btn btn-primary">主要按鈕</a>
<button class="btn btn-secondary">次要按鈕</button>
常見按鈕:
<button class="btn btn-primary">Primary</button>
<button class="btn btn-outline-primary">Outline Primary</button>
<button class="btn btn-danger">Danger</button>
<button class="btn btn-light">Light</button>
Alert 適合做提示訊息。
<div class="alert alert-warning">
這是一則提醒訊息。
</div>
常見類型:
<div class="alert alert-success">成功訊息</div>
<div class="alert alert-info">補充資訊</div>
<div class="alert alert-warning">注意事項</div>
<div class="alert alert-danger">錯誤或警告</div>
Card 很適合做新聞卡片、專題卡片、人物介紹、價值主張區塊。
<div class="card">
<img src="photo.jpg" class="card-img-top" alt="照片說明">
<div class="card-body">
<h5 class="card-title">卡片標題</h5>
<p class="card-text">這裡是卡片內容文字。</p>
<a href="#" class="btn btn-primary">閱讀更多</a>
</div>
</div>
Bootstrap 的排版系統以 12 欄為基礎。
基本結構是:
<div class="container">
<div class="row">
<div class="col">第一欄</div>
<div class="col">第二欄</div>
<div class="col">第三欄</div>
</div>
</div>
container 負責限制內容寬度並置中。
row 是一列。
col 是欄。
如果三個欄都寫 col,Bootstrap 會自動平均分配寬度。
Bootstrap 一列總共 12 欄。
<div class="row">
<div class="col-4">佔 4 欄</div>
<div class="col-8">佔 8 欄</div>
</div>
也就是:
col-6:一半寬度。col-4:三分之一寬度。col-3:四分之一寬度。col-12:整列寬度。Bootstrap 的強大之處在於可以指定不同螢幕尺寸下的欄位寬度。
<div class="row">
<div class="col-12 col-md-4">第一欄</div>
<div class="col-12 col-md-4">第二欄</div>
<div class="col-12 col-md-4">第三欄</div>
</div>
意思是:
col-12,所以會變成單欄。md 以上螢幕時,每個欄位是 col-md-4,所以三欄並排。這是 Bootstrap 很常用的 RWD 寫法。
Bootstrap 常見 breakpoint:
| 縮寫 | 寬度 |
|---|---|
sm |
576px 以上 |
md |
768px 以上 |
lg |
992px 以上 |
xl |
1200px 以上 |
xxl |
1400px 以上 |
範例:
<div class="col-12 col-md-6 col-lg-4">
內容
</div>
意思是:
Navbar 是網站上方常見的導覽列。
<nav class="navbar navbar-expand-lg bg-dark navbar-dark">
<div class="container">
<a class="navbar-brand" href="#">網站名稱</a>
<button
class="navbar-toggler"
type="button"
data-bs-toggle="collapse"
data-bs-target="#mainNavbar"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="mainNavbar">
<ul class="navbar-nav ms-auto">
<li class="nav-item">
<a class="nav-link" href="#">首頁</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">專題</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">關於我們</a>
</li>
</ul>
</div>
</div>
</nav>
重點:
navbar:宣告這是一個 navbar。navbar-expand-lg:在 lg 以上展開,小螢幕收合。bg-dark:深色背景。navbar-dark:讓文字與 icon 適合深色背景。navbar-toggler:手機版的選單按鈕。collapse navbar-collapse:可收合的選單內容。ms-auto:margin-start auto,讓選單推到右側。使用 Bootstrap 建立一個單頁網站,包含:
這個練習可以套用到:
<!doctype html>
<html lang="zh-Hant">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>新聞專題 Landing Page</title>
<link
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
rel="stylesheet"
>
</head>
<body>
<nav class="navbar navbar-expand-lg bg-dark navbar-dark">
<div class="container">
<a class="navbar-brand" href="#">新聞專題</a>
<button
class="navbar-toggler"
type="button"
data-bs-toggle="collapse"
data-bs-target="#mainNavbar"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="mainNavbar">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="#intro">介紹</a></li>
<li class="nav-item"><a class="nav-link" href="#features">特色</a></li>
<li class="nav-item"><a class="nav-link" href="#action">行動</a></li>
</ul>
</div>
</div>
</nav>
<header class="bg-light py-5">
<div class="container">
<div class="row align-items-center">
<div class="col-12 col-md-6">
<h1 class="display-4 fw-bold">用資料看見城市變化</h1>
<p class="lead">
這是一個新聞專題頁面範例,展示如何用 Bootstrap 快速建立具備 RWD 的網頁。
</p>
<a href="#action" class="btn btn-primary btn-lg">開始閱讀</a>
</div>
<div class="col-12 col-md-6 mt-4 mt-md-0">
<img
src="https://picsum.photos/800/500"
class="img-fluid rounded"
alt="專題視覺圖"
>
</div>
</div>
</div>
</header>
<main>
<section id="intro" class="py-5">
<div class="container">
<h2>專題介紹</h2>
<p>
在數位新聞中,網頁不只是文章容器,也是一種敘事介面。透過 HTML、CSS 與 Bootstrap,
我們可以快速建立清楚、易讀、可在手機與桌機閱讀的專題頁面。
</p>
<p>
本頁面使用 Bootstrap 的格線系統、按鈕、導覽列、間距工具與 RWD 類別完成。
</p>
</div>
</section>
<section id="features" class="bg-light py-5">
<div class="container">
<h2 class="mb-4">三個價值主張</h2>
<div class="row g-4">
<div class="col-12 col-md-4">
<div class="card h-100">
<div class="card-body">
<h5 class="card-title">快速建立</h5>
<p class="card-text">
使用 Bootstrap 提供的元件與工具類別,不必從零撰寫所有 CSS。
</p>
</div>
</div>
</div>
<div class="col-12 col-md-4">
<div class="card h-100">
<div class="card-body">
<h5 class="card-title">自動適應</h5>
<p class="card-text">
使用 `col-12 col-md-4` 這類 RWD class,讓手機單欄、桌機三欄。
</p>
</div>
</div>
</div>
<div class="col-12 col-md-4">
<div class="card h-100">
<div class="card-body">
<h5 class="card-title">容易維護</h5>
<p class="card-text">
統一使用框架提供的 class,可以讓頁面結構更一致,也方便後續修改。
</p>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="action" class="py-5 text-center">
<div class="container">
<h2>準備好開始你的專題頁面了嗎?</h2>
<p class="lead">試著替自己的採訪題目、資料分析或報導企劃做一個 landing page。</p>
<a href="#" class="btn btn-primary btn-lg">建立我的頁面</a>
</div>
</section>
</main>
<footer class="bg-dark text-light py-4">
<div class="container">
<div class="row align-items-center">
<div class="col-12 col-md-8">
<h5>新聞專題</h5>
<ul class="list-inline mb-0">
<li class="list-inline-item"><a class="text-light" href="#">關於</a></li>
<li class="list-inline-item"><a class="text-light" href="#">資料來源</a></li>
<li class="list-inline-item"><a class="text-light" href="#">聯絡我們</a></li>
</ul>
</div>
<div class="col-12 col-md-4 mt-3 mt-md-0 text-md-end">
<img
src="https://picsum.photos/160/90"
class="img-fluid rounded"
alt="footer 視覺圖"
>
</div>
</div>
</div>
</footer>
<script
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js">
</script>
</body>
</html>
Bootstrap 不是用來完全取代 CSS,而是幫你處理常見樣式。
可以這樣理解:
實務上常見做法是:
檢查 <head> 裡是否有:
<meta name="viewport" content="width=device-width, initial-scale=1">
檢查是否有正確引入 Bootstrap CSS:
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
如果 navbar 的收合選單打不開,通常是沒有引入 Bootstrap JS。
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
也要確認 data-bs-target="#mainNavbar" 與 id="mainNavbar" 是否一致。
確認結構是否是:
<div class="container">
<div class="row">
<div class="col">內容</div>
</div>
</div>
col 通常應該放在 row 裡面。
可以加上:
<img src="photo.jpg" class="img-fluid" alt="說明文字">
或自己寫 CSS:
img {
max-width: 100%;
height: auto;
}
建立一個高度 300px 的區塊,讓裡面的文字水平與垂直置中。
需要使用:
display: flex;
align-items: center;
justify-content: center;
建立一個左側欄與主內容區:
完成本講義第三部分的版面:
並加入 media query,讓手機版變成單欄排列。
使用 Bootstrap 建立三張卡片:
提示:
<div class="col-12 col-md-4">
<div class="card">
...
</div>
</div>
建立一個完整頁面,包含:
主題可以選:
嘗試改變:
把範例文字換成自己的採訪或報導內容。
建議至少包含:
使用瀏覽器 DevTools:
本單元的重點是:
row 與 col 是 Bootstrap 排版核心。col-12 col-md-4 是很常見的 RWD 寫法,代表手機單欄、平板以上三欄。p-*、m-*、bg-*、text-*、rounded、border 可以快速調整視覺樣式。New Media Techniques and Design