Semantic HTML (語意化HTML)
Semantic HTML 是指使用能清楚描述內容意義的標籤,而不是僅為了排版或樣式而使用的標籤。
<!-- 非語意化 --> <div id="header"></div> <div id="nav"></div> <div id="main"></div> <div id="footer"></div> <!-- 語意化 --> <header></header> <nav></nav> <main></main> <footer></footer>
-
為甚麼要使用Semantic HTML?
- 可讀性高
- SEO友好
- 無障礙
- 好維護
-
常見tag
<header>、<main>、<footer>、<section>、<article>、<aside>、<nav>、 <h1>~<h6>、<p>、<blockquote>、<figure>、<figcaption>、<table>、<thead>、 <tbody>、<th>、<td>、<form>、<label>、<input>、<button>、<fieldset>
Doctype用途
doctype是「文件型別宣告」,主要作用是告訴瀏覽器,這份HTML檔案室依照哪個標準來寫的,以便瀏覽器選擇「正確的解析模式」來渲染畫面
<!DOCTYPE html>
- 渲染差異
| 模式 | 說明 | 特點 |
|---|---|---|
| 標準模式 | 按照最新的W3C/WHATWG標準解析 | 最嚴謹,排版一致性高 |
| 怪異模式(Quirks Mode) | 為了兼容老舊網站(IE4~6) | 使用舊的box-sizing與不一致的排版規則 |
| 接近標準模式(Almost Standards Mode) | 介於兩者之間 | 主要差在表格與圖片垂直對齊的渲染方式 |
| Doctype 寫法 | 模式 |
|---|---|
<!DOCTYPE html> | 標準模式(HTML5) |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | 標準模式 |
| (漏寫 Doctype) | 怪異模式 |
- HTML5不再依賴SGML因此無須DTD聲明。
HTML5 相比於 HTML4 有哪些優勢
| 面向 | HTML4 | HTML5 |
|---|---|---|
| 定位 | 網頁排版標準 | 網頁應用平台(Web App Platform) |
| 規範 | 基於 SGML | 不依附 SGML(語法更寬鬆) |
| 目標 | 結構化內容 | 支援互動、多媒體、離線能力 |
| 模式 | 嚴格模式 / 寬鬆模式 | 單一標準模式 |
| 制定組織 | W3C | WHATWG(長期維護版) |
-
語法上的改進
- 不依賴SGML,因此不需要DTD聲明、大小寫不敏感、不強制屬性引號與結尾斜線。
- 容錯能力增強:即使標籤未封閉也能自動修復(對瀏覽器更友善)。
<!-- HTML4 --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!-- HTML5 --> <!DOCTYPE html> -
新增許多語意化標籤
-
多媒體原生支援
<video src="movie.mp4" controls></video> <audio src="music.mp3" controls></audio> -
API與功能增加
類別 功能 範例 存儲 localStorage,sessionStorage用於離線資料保存 畫布 <canvas>2D/3D 繪圖與遊戲 圖形 <svg>,<canvas>可縮放向量圖與動態繪製 通訊 WebSocket, Fetch API 即時通訊、雙向連線 表單 新增 input type(如 email,date,range)改善 UX 地理定位 navigator.geolocation定位使用者位置 離線應用 Application Cache / Service Worker 離線支援(PWA 基礎) 安全 sandbox iframe, CORS 強化安全策略 -
性能與體驗優化
- 新增 控制響應式佈局。
- 更好地支援觸控事件(Touch Events)。
- 改進的表單驗證(內建 required, pattern, placeholder 等)。
-
簡化 DOM 結構
- 移除不再使用的元素(如 <font>, <center>, <big>)。
- 提倡使用 CSS 控制樣式而非 HTML 屬性(如 bgcolor)。
請描述 <script>、<script async> 和 <script defer> 的區別
| 寫法 | 是否阻塞 HTML 解析 | 是否保證執行順序 | 下載時機 | 執行時機 |
|---|---|---|---|---|
<script> | 阻塞 | 保證 | 立即下載 | 下載完成後立刻執行(阻塞 DOM) |
<script async> | 不阻塞 | 不保順序 | 與 DOM 同步下載 | 一旦下載完成立即執行 |
<script defer> | 不阻塞 | 保順序 | 與 DOM 同步下載 | DOM 完成後才執行(DOMContentLoaded 前) |
HTML5 的本地存儲類型有哪些?它們有什麼區別?
HTML5 提供了讓前端「在使用者瀏覽器中保存資料」的機制, 不需要後端資料庫,也不用每次都發請求。
主要用途:保存使用者設定、暫存資料、登入狀態、離線內容等。
-
localStorage
// 儲存 localStorage.setItem("theme", "dark"); // 讀取 localStorage.getItem("theme"); // 刪除 localStorage.removeItem("theme");-
永久保存(直到手動清除)
-
特點
- 永久保存(除非使用者清除)
- 約5MB
- 同源(domain+protocol+port)
- 不會隨HTTP請求傳送
- 適合保存設定或偏好
-
-
sessionStorage
// 儲存 sessionStorage.setItem("token", "12345"); // 讀取 sessionStorage.getItem("token");- 頁面關閉後消失
- 約5MB
- 同一個分頁或標籤頁有效
- 不會隨請求傳送
- 適合暫存表單輸入或當前操作狀態
-
cookie
document.cookie = "username=SIC; expires=Fri, 31 Dec 2025 23:59:59 GMT; path=/";- 特點
- 可設定過期時間
- 約4KB
- 會隨HTTP請求發送給伺服器
- 適合保存登入狀態、身分驗證資訊
- 效能低、容易被濫用、傳輸成本高
- 特點
| 特性 | cookie | localStorage | sessionStorage | IndexedDB |
|---|---|---|---|---|
| 是否 HTML5 新增 | 否 | 是 | 是 | 是 |
| 儲存方式 | 鍵值對(string) | 鍵值對(string) | 鍵值對(string) | 結構化物件 |
| 容量限制 | 約 4KB | 約 5MB | 約 5MB | 可達數百 MB |
| 有效期 | 可設定或會話期 | 永久保存 | 分頁關閉即刪除 | 永久保存 |
| 是否隨請求傳送 | 是 | 否 | 否 | 否 |
| 範圍 | 同源(domain + path) | 同源 | 同分頁同源 | 同源 |
| 適用場景 | 驗證、登入狀態 | 偏好設定、快取資料 | 暫存輸入、臨時狀態 | 離線應用、大量資料 |
-
補充
- localStorage與sessionStorage只能存字串,要存物件需要序列化。
- 他們的操作是synchronous
- 不同瀏覽器儲存大小上限有差異
請說明 <meta> 標籤的用途與常見屬性
放在 <head>的文件中繼資料
- 編碼 / 相容性 / 顯示
<!--字元編碼--> <meta charset="utf-8"> <!--視窗縮放(行動裝置必要)--> <meta name="viewport" content="width=device-width, initial-scale=1"> <!--可選:沉浸/瀏海全屏--> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> <!--深色/淺色主題宣告--> <meta name="color-scheme" content="light dark"> <meta name="theme-color" content="#0ea5e9" media="(prefers-color-scheme: light)"> <meta name="theme-color" content="#0b7285" media="(prefers-color-scheme: dark)"> <!-- 關閉 iOS Safari 自動把數字變電話連結 --> <meta name="format-detection" content="telephone=no">
- SEO與爬蟲
<meta name="description" content="頁面一句話摘要(~150字元內)"> <meta name="robots" content="index, follow"> <!-- 也可細分特定爬蟲 --> <meta name="googlebot" content="max-snippet:-1, max-image-preview:large, max-video-preview:-1">
- keywords幾乎不被主流搜尋引擎採用
- 社群分享(Open Graph/Twitter)
<!-- Open Graph (FB、LINE 等) --> <meta property="og:type" content="website"> <meta property="og:title" content="頁面標題"> <meta property="og:description" content="頁面摘要"> <meta property="og:url" content="https://example.com/page"> <meta property="og:image" content="https://example.com/og.jpg"> <meta property="og:image:alt" content="圖片替代文字"> <!-- Twitter Cards --> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:title" content="頁面標題"> <meta name="twitter:description" content="頁面摘要"> <meta name="twitter:image" content="https://example.com/og.jpg"> <!--圖片建議 1200×630(或 1.91:1),要可公開存取-->
-
安全 / 隱私(盡量用「HTTP 標頭」)
- CSP(內容安全策略)
<!-- 可用 <meta>,但**最好**用 HTTP 標頭,且某些指令(如 frame-ancestors)meta 版無效 --> <meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self' https: data:; script-src 'self' 'unsafe-inline' https://cdn.example.com">- Referrer-Policy
<meta name="referrer" content="strict-origin-when-cross-origin">
HTML5 新增了哪些表單功能?
- 新增的 <input> 型別
| 類型 | 功能 | 範例 |
|---|---|---|
email | 限制輸入格式為 Email | <input type="email"> |
url | 限制輸入為 URL 格式 | <input type="url"> |
number | 只能輸入數字,可用上下鍵調整 | <input type="number" min="0" max="10"> |
range | 可拖曳滑桿設定數值 | <input type="range" min="0" max="100"> |
color | 顯示顏色選擇器 | <input type="color"> |
date | 日期選擇器 | <input type="date"> |
time | 時間選擇器 | <input type="time"> |
datetime-local | 日期+時間(無時區) | <input type="datetime-local"> |
month | 年月選擇器 | <input type="month"> |
week | 週數選擇器 | <input type="week"> |
tel | 電話輸入(行動端會出現數字鍵盤) | <input type="tel"> |
search | 搜尋框(部分瀏覽器有清除按鈕) | <input type="search"> |
- 新增的表單屬性
| 屬性 | 說明 | 範例 |
|---|---|---|
placeholder | 顯示提示文字 | <input placeholder="輸入姓名"> |
required | 必填驗證 | <input required> |
pattern | 自訂正則驗證規則 | <input pattern="[A-Za-z0-9]{6,12}"> |
min / max | 最小/最大值限制 | <input type="number" min="1" max="100"> |
step | 輸入步進值 | <input type="number" step="5"> |
autofocus | 頁面載入時自動聚焦 | <input autofocus> |
autocomplete | 是否啟用自動完成 | <input autocomplete="off"> |
multiple | 可選多個檔案或值 | <input type="file" multiple> |
form | 指定所屬表單(可跨表單放置) | <input form="loginForm"> |
list + <datalist> | 自動完成建議 | <input list="cities"> + <datalist id="cities"><option value="台北"><option value="高雄"></datalist> |
-
新增的表單驗證與事件
- 瀏覽器內建驗證(不需 JS),若輸入不符型別(如 email 輸入錯誤),瀏覽器自動阻止提交。
- 可用 .checkValidity()、.reportValidity() 觸發驗證。
const form = document.querySelector("form"); if (!form.checkValidity()) { form.reportValidity(); } -
新增事件
- invalid:驗證失敗時觸發
- input:即時輸入時觸發(可用於動態提示)
HTML5 的 Application Cache / Service Worker
-
傳統網站如果沒網路就會出現「無法連線到伺服器」,但現代使用者希望「即使離線也能打開部分內容、圖片或頁面」。
-
HTML5 為了這個目的,一開始推出了Application Cache (AppCache)後來發現問題很多,因此用 Service Worker 完全取代它。
-
Application Cache(已淘汰),HTML5 最早期的離線方案,讓瀏覽器能快取整個網站的資源清單。
-
使用方式
- 在 HTML 標籤中指定 manifest 檔案:
<html manifest="app.manifest">- app.manifest 檔內容
CACHE MANIFEST # 版本號 # v1.0 CACHE: index.html style.css main.js images/logo.png NETWORK: api/ -
運作方式
- 第一次連線 → 下載 manifest 內所有檔案
- 之後離線時,會直接使用本地快取
- 若 manifest 改變,才會更新整個快取
-
缺點(這是它被淘汰的主因)
問題 說明 更新困難 一個檔案改變,就得重新下載全部 管理混亂 很容易被「鎖死舊版本」,使用者看到舊頁面 控制太死板 不能動態選擇要快取的內容 無法離線請求 API 只會快取靜態資源 已被棄用 2020 以後瀏覽器全面停用 -
-
Service Worker
- 一段在背景執行的JavaScript,可以攔截request、管理快取、實現離線瀏覽、背景同步
- 特性
功能 說明 離線快取(Cache API) 可動態控制哪些資源要快取 攔截請求(fetch 事件) 可判斷要走快取還是網路 背景同步(Background Sync) 使用者恢復網路後自動重新上傳資料 推播通知(Push Notification) 實現 Web 推播系統 多頁共享 同一域名下所有頁面可共用同一 Service Worker
DOM 與 Virtual DOM 的差別
DOM(Document Object Model)是瀏覽器將 HTML 文件解析後建立的「樹狀結構模型」。
-
HTML → 經瀏覽器解析 → 變成一棵可以被 JavaScript 操作的 樹(DOM Tree)。
<div id="app"> <p>Hello</p> </div># 瀏覽器內部 Document └── div#app └── p └── "Hello" -
用js操作DOM每次都會觸發Reflow、Repaint,操作成本很高
Virtual DOM 是一種在記憶體中以 JavaScript 物件 形式存在的 虛擬 DOM 樹。 它不直接操作瀏覽器 DOM,而是先在記憶體中計算出要改變的部分,最後再一次性更新真實 DOM。
-
操作Virtual DOM的時候,當狀態改變會先生成一個新的Virtual DOM,接著比較新舊的差異,把有變動的節點同步到真實DOM上。 如此一來可以減少實體DOM操作次數、提升渲染效能、保持UI狀態一致(可預測更新)。
-
比較表
| 項目 | 真實 DOM | 虛擬 DOM |
|---|---|---|
| 所在位置 | 瀏覽器中 | 記憶體中(JavaScript 物件) |
| 操作成本 | 高(需重排與重繪) | 低(批次比對後一次更新) |
| 更新方式 | 直接操作節點 | 透過 Diff 算法計算差異 |
| 效能 | 頻繁更新會變慢 | 適合高頻率 UI 更新 |
| 框架應用 | 傳統原生 JS、jQuery | React、Vue、Preact 等 |
| 優點 | 即時反映變化 | 結構可控、狀態可預測 |
| 缺點 | 操作頻繁會造成效能問題 | 需額外計算(Diff 有開銷) |
- 補充
-
Virtual DOM不一定比較快,少量的操作下DOM會比較快速,但大量的狀態更新Virtual DOM可以透過 批次更新優化效能。
-
為什麼框架不直接操作 DOM?
- DOM 是瀏覽器 API,操作成本高;
- Virtual DOM 讓 UI 更新流程更可預測;
- 可以跨平台(React Native、SSR)。
-
DOMContentLoaded 與 load 事件的差別?
| 事件 | 觸發時機 | 說明 |
|---|---|---|
DOMContentLoaded | HTML 結構解析完成(不含圖片/樣式) | 最早可以執行 DOM 操作 |
load | 所有資源載入完(含圖片、CSS) | 通常用於分析或動畫初始化 |