「HTML 決定了什麼東西存在,CSS 決定了它長什麼樣子。這兩件事分清楚,前端就通了一半。」
很多人把 HTML 和 CSS 當成「入門就會」的東西,結果面試的時候才發現 Box Model 說不清楚、 Flexbox 和 Grid 搞混、Specificity 計算錯誤。這篇把面試必考的核心概念整理成速查格式, 附上視覺化圖解,讓你隨時複習。
1. HTML 語意化標籤
語意化(Semantic HTML)的核心概念:用有意義的標籤取代萬用的 div。 好處是提升 SEO、無障礙性(Accessibility),讓程式碼更易讀。
| 標籤 | 語意 | 使用場景 |
|---|---|---|
| <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 }
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-direction | row / column / row-reverse | 主軸方向 |
| justify-content | flex-start / center / space-between / space-around | 主軸對齊 |
| align-items | stretch / center / flex-start / flex-end | 交叉軸對齊 |
| flex-wrap | nowrap / wrap | 子元素是否換行 |
| gap | 8px / 1rem | 子元素間距(取代 margin hack) |
| flex: 1 | — | 子元素平均分配剩餘空間 |
4. Grid 速查
Grid 是二維排版工具,同時控制列(rows)與欄(columns)。適合整體頁面佈局或複雜的表格式排列。
| 面向 | Flexbox | Grid |
|---|---|---|
| 維度 | 一維(單行或單列) | 二維(同時控制行與列) |
| 適合場景 | Navbar、按鈕群組、卡片水平排列 | 整體頁面佈局、複雜表格 |
| 對齊方式 | 主軸 + 交叉軸 | 行軸 + 列軸(更精細) |
| 子元素控制 | flex-grow / shrink / basis | grid-column / row / span |
| Tailwind 寫法 | flex gap-4 justify-between | grid 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 計算口訣
數「(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。
| 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-10、z-50(Modal 常設 100+)
8. 面試常考題 Q&A
以下是前端面試中關於 HTML / CSS 最常被問到的問題,附上可直接背誦的標準答案。
box-sizing: border-box 和 content-box 差在哪?
content-box(預設):width 只計算 content 區域,padding 和 border 會往外撐大元素。border-box:width 包含 content + padding + border,設定多少就是多少,不會意外撐大,是現代專案的標準選擇。
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 可無視所有計算,但應避免濫用。
Flexbox vs Grid 什麼時候用哪個?
Flexbox 是一維排版(沿一條軸排列),適合 Navbar、按鈕群組、卡片水平/垂直排列。Grid 是二維排版(同時控制行列),適合整體頁面佈局、複雜的表格式結構。不互斥,可以外 Grid 內 Flex。
position: absolute 是相對於什麼定位的?
相對於最近的 position 不是 static 的祖先元素(通常設定 position: relative)。如果找不到這樣的祖先,就相對於 <html> 根元素定位。
如何讓一個元素水平垂直置中(至少 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%)。
display: none vs visibility: hidden?
display:none 完全從文件流移除,不佔空間,會觸發 Reflow。visibility:hidden 隱藏元素但保留佔位空間,只觸發 Repaint。若要保持佈局穩定又隱藏元素,用 visibility:hidden;若要完全消失,用 display:none。
BFC(Block Formatting Context)是什麼?
BFC 是一個獨立的渲染區域,裡面的元素不會影響外部佈局。常見觸發方式:overflow 不為 visible、display:flex/grid/inline-block、position:absolute/fixed。BFC 的主要作用:① 清除浮動(內部 float 不溢出)② 防止 margin collapse(相鄰 block 的 margin 合併)。