紀錄工作經驗、相關知識,解決技術相關問題。

CSS, HTML

CSS Reset 樣式初始化:Eric Meyer Reset 與 Modern CSS Reset 程式碼範本

CSS Reset 樣式初始化:Eric Meyer Reset 與 Modern CSS Reset 程式碼範本 特色圖片

在前端切版開工時,為了消除 Chrome、Safari 與 Firefox 各自的瀏覽器預設樣式(例如 body 預設的 8px 外距或 ul 清單圓點),最直接的做法就是引入一份 CSS Reset 樣式表,將所有 HTML 標籤的預設邊距與字級強制歸零。

快速複製與章節跳轉:


範本一:經典 Eric Meyer's Reset CSS(v2.0 完整程式碼)

一般說的 css reset meyerweb,指的就是 Eric A. Meyer 放在 meyerweb.com 的 Reset CSS,目前版本為 v2.0(2011-01-26),作者明確聲明為公開領域(Public Domain),可自由使用與修改。

下方程式碼與 meyerweb.com 官方 reset.css 原文一致(含原始註解)。你可以直接複製,儲存為專案中的 reset.css,並在 HTML 的 head 中放在所有自訂樣式表(如 style.css)的最前面載入:

/* http://meyerweb.com/eric/tools/css/reset/ 
   v2.0 | 20110126
   License: none (public domain)
*/

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
	margin: 0;
	padding: 0;
	border: 0;
	font-size: 100%;
	font: inherit;
	vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
	display: block;
}
body {
	line-height: 1;
}
ol, ul {
	list-style: none;
}
blockquote, q {
	quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
	content: '';
	content: none;
}
table {
	border-collapse: collapse;
	border-spacing: 0;
}

為什麼不直接寫 * { margin: 0; padding: 0; } 就好?

初學者常問:「為什麼 Eric Meyer 要把幾十個 HTML 標籤一個一個列出來,而不直接用萬用選擇器 * { margin: 0; padding: 0; }?」主要原因有三點:

  1. 避免破壞表單元件預設內距:Eric Meyer 的清單沒有列入 input、button、select、textarea 等表單控制項。如果直接對 * 強制歸零 padding 與 border,會導致原生輸入框與按鈕變得扁平難看且難以點擊。
  2. 單靠 margin: 0 無法清除清單黑點與表格間距:清單的圓點需要 list-style: none,表格雙線邊框需要 border-collapse: collapse,這些都必須針對特定標籤設定。
  3. 統一標題字級與基線對齊:透過 font-size: 100%; font: inherit;,能讓 h1 ~ h6 全部退回基礎文字大小,完全交由開發者依照設計稿重新定義。

使用 Eric Meyer Reset 的 3 個注意事項

注意項目發生原因實務處理建議
strong 與 em 失去粗體與斜體font: inherit 重置了 font-weight 與 font-style在自訂 CSS 補回 strong, b { font-weight: 700; } 與 em, i { font-style: italic; }
文字行高變得過於緊密body { line-height: 1; } 將行高壓縮至 1 倍字高在自訂 body 樣式中重新設定舒適的閱讀行高(例如 line-height: 1.5; 或 1.6)
未包含 box-sizing: border-boxv2.0 發布於 2011 年 1 月,內容沒有任何 box-sizing 設定務必在 reset.css 最下方自行補上全域 box-sizing: border-box(見下方範本二)

範本二:現代專案推薦的 Modern CSS Reset 完整範本

隨著舊版 IE 瀏覽器退場,以及 CSS 新增了 @layer(層疊層)與 text-wrap: balance 等現代特性,「Modern CSS Reset」通常指 Josh W. Comeau 的〈A Modern CSS Reset〉與 Andy Bell 的〈A (more) Modern CSS Reset〉這兩份公開範本。

下方是本文綜合兩者整理的版本,不是任何一位作者的原版,主要差異如下,想用原版請直接到文末參考資料複製作者最新內容:

  • 取自 Josh W. Comeau 版:box-sizing、-webkit-font-smoothing、媒體元素 display: block、表單 font: inherit、overflow-wrap、標題 text-wrap: balance。
  • 取自 Andy Bell 版:text-size-adjust: none、body 的 min-height 與 line-height: 1.5。
  • 本文自行加入:外層 @layer reset、* 一併歸零 padding、min-height 改用 100dvh、媒體元素加上 height: auto、ul, ol 無條件移除圓點(Andy Bell 原版只針對帶有 role="list" 的清單)。
  • Josh W. Comeau 原版另有 *:not(dialog) 排除 dialog、interpolate-size、p { text-wrap: pretty; } 與 #root, #__next { isolation: isolate; },本範本未收錄。
/* 使用 @layer reset 將重置規則放在最低優先級,確保自訂樣式永遠能輕鬆覆寫 */
@layer reset {
  /* 1. 全站統一採用直覺的 border-box 盒模型,防止 padding 與 border 撐破寬度 */
  *,
  *::before,
  *::after {
    box-sizing: border-box;
  }

  /* 2. 移除所有預設外距與內距 */
  * {
    margin: 0;
    padding: 0;
  }

  /* 3. 防止行動瀏覽器自動放大字級(font size inflation) */
  html {
    -webkit-text-size-adjust: none;
    text-size-adjust: none;
  }

  /* 4. 設定基礎行高;-webkit-font-smoothing 只在 macOS 生效 */
  body {
    min-height: 100dvh;
    line-height: 1.5;
    -webkit-font-smoothing: antialiased;
  }

  /* 5. 媒體元素預設改為區塊顯示並限制最大寬度,防止手機版圖片撐破畫面 */
  img,
  picture,
  video,
  canvas,
  svg {
    display: block;
    max-width: 100%;
    height: auto;
  }

  /* 6. 讓表單元件自動繼承父層的 font-family 與 font-size */
  input,
  button,
  textarea,
  select {
    font: inherit;
  }

  /* 7. 防止長單字或長網址刺穿容器邊界(搭配標題折行平衡) */
  p,
  h1,
  h2,
  h3,
  h4,
  h5,
  h6 {
    overflow-wrap: break-word;
  }

  h1,
  h2,
  h3,
  h4,
  h5,
  h6 {
    text-wrap: balance;
  }

  /* 8. 移除清單預設圓點 */
  ul,
  ol {
    list-style: none;
  }
}

Modern CSS Reset 解決了哪些現代切版痛點?

  1. 利用 @layer reset 解決權重衝突:將 Reset 包在 @layer reset 內,代表它的優先權低於任何未分層的自訂 CSS(關於選擇器優先權計算,可參考 CSS 權重與優先順序:!important、ID 與 Class 選擇器比較)。
  2. 內建 box-sizing: border-box:徹底解決寫了 width: 100% 再加 padding 就出現橫向捲軸破版的問題(詳細計算公式可參考 CSS box-sizing 用法:border-box 與 content-box 寬高計算差別)。
  3. 解決 img 底部莫名的幾 px 縫隙:圖片預設為 inline 行內元素,會對齊文字基線(Baseline)而在下方留白;設為 display: block; max-width: 100%; 可同時消除底部縫隙並完成 RWD 圖片自適應。
  4. 修復 button 與 input 字體不一致:瀏覽器預設不會讓表單元件繼承 body 的字體,加上 font: inherit 後即可全站統一字型。

參考資料與延伸閱讀

發佈留言