EP.10網頁開發實戰

HTML / CSS 核心概念
前端面試基礎題

Box Model、Flexbox、Grid、RWD、Selector —
寫前端 10 年都用得到的基礎,面試必考

Joseph Chen 2026 10 min read HTML · CSS · RWD · Flexbox · Grid

「HTML 決定了什麼東西存在,CSS 決定了它長什麼樣子。這兩件事分清楚,前端就通了一半。」

很多人把 HTML 和 CSS 當成「入門就會」的東西,結果面試的時候才發現 Box Model 說不清楚、 Flexbox 和 Grid 搞混、Specificity 計算錯誤。這篇把面試必考的核心概念整理成速查格式, 附上視覺化圖解,讓你隨時複習。

1. HTML 語意化標籤

語意化(Semantic HTML)的核心概念:用有意義的標籤取代萬用的 div。 好處是提升 SEO、無障礙性(Accessibility),讓程式碼更易讀。

語意化 vs 非語意化
<!-- ❌ 非語意化:滿版 div,不知道每塊是什麼 -->
<div class="header"> ... </div>
<div class="nav"> ... </div>
<div class="main"> ... </div>

<!-- ✅ 語意化:標籤本身說明了用途 -->
<header> ... </header>
<nav> ... </nav>
<main>
  <article> ... </article>
  <aside> ... </aside>
</main>
<footer> ... </footer>
標籤語意使用場景
<header>頁首區塊Logo、標題、頂部導覽
<nav>導覽連結主選單、麵包屑、分頁
<main>主要內容每個頁面只應有一個
<article>獨立文章部落格文章、新聞稿、討論串
<section>主題分段文章內的章節、功能區塊
<aside>附屬內容側欄、廣告、相關連結
<footer>頁尾區塊版權聲明、聯絡資訊

2. CSS Box Model

每一個 HTML 元素都是一個「盒子」,由四層組成。理解 Box Model 是寫出精確排版的前提。

Margin(外距)

Border(邊框)

Padding(內距)

Content

width × height

box-sizing:最重要的 CSS 習慣

content-box(預設):width 只計算 Content,Padding + Border 會加在外面,讓元素比你設定的更寬。

border-box(推薦):width 包含 Content + Padding + Border,所見即所得,更直覺。

幾乎所有現代專案都會在全局設定 * { box-sizing: border-box }

box-sizing 差異示範
/* content-box(預設):實際渲染寬度 = 200 + 20 + 20 = 240px */
.box-content {
  box-sizing: content-box;
  width: 200px;
  padding: 20px;   /* 往外擴張 */
}

/* border-box(推薦):實際渲染寬度 = 就是 200px */
.box-border {
  box-sizing: border-box;
  width: 200px;
  padding: 20px;   /* 向內壓縮 content 空間 */
}

/* 全局設定(最佳實踐) */
*, *::before, *::after {
  box-sizing: border-box;
}

3. Flexbox 速查

Flexbox 是一維排版工具,沿著主軸(Main Axis)排列子元素。 設在父容器上的屬性控制排列方式,設在子元素上的屬性控制個別行為。

主軸(Main Axis)

flex-direction: row → 主軸是水平方向(預設)
flex-direction: column → 主軸是垂直方向
justify-content 控制主軸對齊

交叉軸(Cross Axis)

永遠垂直於主軸
align-items 控制交叉軸對齊
align-self 可覆蓋單一子元素的對齊

屬性常用值說明
display: flex啟動 Flexbox,套用在父容器
flex-directionrow / column / row-reverse主軸方向
justify-contentflex-start / center / space-between / space-around主軸對齊
align-itemsstretch / center / flex-start / flex-end交叉軸對齊
flex-wrapnowrap / wrap子元素是否換行
gap8px / 1rem子元素間距(取代 margin hack)
flex: 1子元素平均分配剩餘空間

4. Grid 速查

Grid 是二維排版工具,同時控制列(rows)與欄(columns)。適合整體頁面佈局或複雜的表格式排列。

Grid 核心語法
/* 3 欄等寬 Grid */
.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);  /* 1fr = 1 份自由空間 */
  gap: 16px;
}

/* 響應式 Grid:自動決定欄數 */
.auto-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 24px;
}

/* 子元素跨欄 */
.featured-card {
  grid-column: span 2;    /* 佔 2 欄 */
  grid-row: span 2;       /* 佔 2 列 */
}

/* 水平垂直置中(配合 Grid) */
.centered {
  display: grid;
  place-items: center;    /* = align-items + justify-items */
}
面向FlexboxGrid
維度一維(單行或單列)二維(同時控制行與列)
適合場景Navbar、按鈕群組、卡片水平排列整體頁面佈局、複雜表格
對齊方式主軸 + 交叉軸行軸 + 列軸(更精細)
子元素控制flex-grow / shrink / basisgrid-column / row / span
Tailwind 寫法flex gap-4 justify-betweengrid grid-cols-3 gap-6

5. Selector 優先順序(Specificity)

當多個 CSS 規則套用到同一個元素時,瀏覽器用優先順序分數決定誰贏。 分數格式是 (a, b, c, d),數字越大越優先。

Inline Style

(1,0,0,0)

style="color:red"

ID Selector

(0,1,0,0)

#header

Class / Pseudo

(0,0,1,0)

.btn :hover

Element

(0,0,0,1)

div h1

Specificity 計算範例
/* Specificity: (0,0,0,1) → 最低 */
p { color: black; }

/* Specificity: (0,0,1,1) → class + element */
.text p { color: blue; }

/* Specificity: (0,1,0,1) → id + element */
#main p { color: green; }

/* Specificity: (1,0,0,0) → inline style,幾乎無法覆蓋 */
<p style="color: red;">文字</p>

/* 例外:!important 直接無視 specificity(不推薦濫用)*/
p { color: purple !important; }

Specificity 計算口訣

數「(a, b, c, d)」:

a = inline style 數量

b = ID selector 數量(#id)

c = class、attribute、pseudo-class 數量(.class, [type], :hover)

d = element、pseudo-element 數量(div, ::before)

比較時從左到右,數字大的優先;分數相同則後寫的覆蓋前寫的

6. RWD 響應式設計

響應式設計(Responsive Web Design)讓網頁在不同螢幕尺寸下都能正常顯示。 核心工具是 @media query

Mobile-First 設計原則
/* 1. Viewport meta tag(HTML head 必加) */
<meta name="viewport" content="width=device-width, initial-scale=1">

/* 2. Mobile-First:先寫手機版,再用 min-width 覆蓋 */
.container {
  padding: 16px;        /* 手機版(預設) */
  font-size: 14px;
}

@media (min-width: 768px) {    /* 768px 以上(平板) */
  .container {
    padding: 32px;
    font-size: 16px;
  }
}

@media (min-width: 1024px) {   /* 1024px 以上(桌機) */
  .container {
    padding: 48px;
    max-width: 1280px;
    margin: 0 auto;
  }
}
Breakpoint最小寬度裝置Tailwind Class 前綴
xs(預設)< 640px小手機無前綴(直接寫)
sm≥ 640px大手機 / 直式平板sm:
md≥ 768px橫式平板md:
lg≥ 1024px筆電lg:
xl≥ 1280px桌機xl:
2xl≥ 1536px大螢幕2xl:

7. CSS 定位(position)

position 控制元素在文件流中的定位方式。z-index 控制堆疊順序,只對非 static 元素有效。

文件流定位基準常見使用場景
static在流中預設值,正常排列
relative在流中自身原始位置微調位置、建立 absolute 的參考點
absolute脫離流最近的非 static 祖先懸浮標籤、Tooltip、下拉選單
fixed脫離流Viewport(視窗)Navbar、回到頂部按鈕、Cookie Banner
sticky混合滾動到閾值前:in flow;之後:fixed黏性標題、側欄目錄

z-index 堆疊規則

z-index 只對 position 不是 static 的元素有效。

• 數字越大,元素越靠近使用者(顯示在最上層)。

• 同一個 Stacking Context 內比較有效;父元素建立新的 Stacking Context 時,子元素的 z-index 只在該 Context 內排序。

• Tailwind 常用:z-10z-50(Modal 常設 100+)

8. 面試常考題 Q&A

以下是前端面試中關於 HTML / CSS 最常被問到的問題,附上可直接背誦的標準答案。

Q1

box-sizing: border-box 和 content-box 差在哪?

content-box(預設):width 只計算 content 區域,padding 和 border 會往外撐大元素。border-box:width 包含 content + padding + border,設定多少就是多少,不會意外撐大,是現代專案的標準選擇。

Q2

CSS 優先順序如何計算?

從高到低:inline style (1,0,0,0) > ID selector (0,1,0,0) > class/pseudo-class (0,0,1,0) > element (0,0,0,1)。相同分數時後寫的覆蓋前寫的。!important 可無視所有計算,但應避免濫用。

Q3

Flexbox vs Grid 什麼時候用哪個?

Flexbox 是一維排版(沿一條軸排列),適合 Navbar、按鈕群組、卡片水平/垂直排列。Grid 是二維排版(同時控制行列),適合整體頁面佈局、複雜的表格式結構。不互斥,可以外 Grid 內 Flex。

Q4

position: absolute 是相對於什麼定位的?

相對於最近的 position 不是 static 的祖先元素(通常設定 position: relative)。如果找不到這樣的祖先,就相對於 <html> 根元素定位。

Q5

如何讓一個元素水平垂直置中(至少 3 種)?

① Flexbox:父元素設 display:flex; justify-content:center; align-items:center。② Grid:父元素設 display:grid; place-items:center。③ 絕對定位:position:absolute; top:50%; left:50%; transform:translate(-50%,-50%)。

Q6

display: none vs visibility: hidden?

display:none 完全從文件流移除,不佔空間,會觸發 Reflow。visibility:hidden 隱藏元素但保留佔位空間,只觸發 Repaint。若要保持佈局穩定又隱藏元素,用 visibility:hidden;若要完全消失,用 display:none。

Q7

BFC(Block Formatting Context)是什麼?

BFC 是一個獨立的渲染區域,裡面的元素不會影響外部佈局。常見觸發方式:overflow 不為 visible、display:flex/grid/inline-block、position:absolute/fixed。BFC 的主要作用:① 清除浮動(內部 float 不溢出)② 防止 margin collapse(相鄰 block 的 margin 合併)。

HTML
CSS
Box Model
Flexbox
Grid
RWD
EP.10