CSS盒子模型 · 样式继承 · 用户代理样式

CSS 盒子模型 · 样式继承 · 用户代理样式 完整详解

这三个概念是 CSS 基础中的核心中的核心,理解它们能帮你彻底解决大多数样式问题和 bug。


1. CSS 盒子模型(Box Model)

每个 HTML 元素在页面上都是一个矩形盒子

1.1 标准盒模型(W3C) vs 怪异盒模型(IE)

类型box-sizing宽度计算公式现代推荐
标准盒模型content-box(默认)width = content(不包含 padding、border)推荐
怪异盒模型border-boxwidth = content + padding + border更实用

推荐写法(几乎所有现代项目都加上):

*,
*::before,
*::after {
    box-sizing: border-box;   /* 全局使用 border-box */
}

1.2 盒模型组成(由内到外)

margin(外边距)
   ↓
border(边框)
   ↓
padding(内边距)
   ↓
content(内容区域) ← width / height 作用于此(content-box 时)

可视化示例

.box {
    width: 200px;           /* content 宽度 */
    height: 100px;
    padding: 20px;          /* 上下左右各 20px */
    border: 5px solid #333;
    margin: 30px;           /* 外边距 */
}

实际占用空间(border-box 下):

  • 宽度 = 200px(包含 padding + border)
  • 高度 = 100px(包含 padding + border)

1.3 关键属性

  • margin:支持 auto(水平居中常用)
  • padding:不支持负值
  • border:可单独设置四边(border-top 等)
  • outline:不占用空间,常用于调试

2. 样式继承(Inheritance)

某些 CSS 属性会从父元素自动继承到子元素。

2.1 可继承属性(常用)

类型可继承属性示例
文字color, font-family, font-size, font-weight, line-height, text-align, letter-spacing
列表list-style, list-style-type
表格border-collapse, empty-cells
其他visibility, cursor, white-space

不可继承属性(大多数盒模型属性):
width, height, margin, padding, border, display, position, background 等。

2.2 继承控制关键字

.child {
    color: inherit;           /* 主动继承父元素 */
    color: initial;           /* 重置为浏览器默认值 */
    color: unset;             /* 如果可继承则继承,否则重置为 initial */
    color: revert;            /* 回滚到用户代理或用户样式 */
}

实战技巧

body {
    font-family: "Microsoft YaHei", system-ui;
    line-height: 1.6;
    color: #333;
}

/* 所有文字相关样式自动继承,无需重复书写 */

3. 用户代理样式(User Agent Styles)

用户代理样式 = 浏览器默认样式

每个浏览器都有自己的一套默认样式表(User Agent Stylesheet),这就是为什么 <h1> 很大、<ul> 有缩进、button 有边框的原因。

3.1 常见用户代理样式示例

  • <h1> ~ <h6> 有较大的 font-sizemargin
  • <p>ulol 有默认 margin
  • <a> 有下划线和蓝色
  • <button>input 有默认边框和背景
  • <table>border-collapse: separate

3.2 如何消除用户代理样式(Reset / Normalize)

现代推荐做法(2026 年):

/* 1. 简单 Reset(推荐新项目使用) */
*,
*::before,
*::after {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

/* 2. 更温和的 Normalize 方式 */
button,
input,
select,
textarea {
    font-family: inherit;
    font-size: inherit;
    line-height: inherit;
}

/* 移除列表默认样式 */
ul, ol {
    list-style: none;
}

热门方案

  • modern-normalize(推荐)
  • reset-css
  • tailwind 的 Preflight(基于 modern-normalize)

4. 三者之间的关系与层叠顺序

CSS 最终样式计算顺序(从低到高):

  1. 用户代理样式(浏览器默认)
  2. 用户样式(浏览器设置的样式,极少用)
  3. 作者样式(我们写的 CSS)
  • 按层叠规则:!important > 行内样式 > ID > 类 > 标签 > 通配符
  1. 继承样式

记忆口诀

浏览器默认最弱,我们写的更强,!important 最强;可继承的属性不写也会出现。


5. 实战建议总结

  1. 全局设置 box-sizing: border-box(强烈推荐)
  2. inherit 合理继承文字样式,减少重复代码
  3. 项目开始时务必处理用户代理样式(Reset/Normalize)
  4. 调试技巧
  • Chrome DevTools → Computed 面板查看最终样式来源
  • 查看 “User agent stylesheet” 即可看到浏览器默认样式

练习题(建议立即动手):

  1. 写一个卡片组件,分别用 content-boxborder-box 观察宽度差异
  2. 在不给子元素写 color 的情况下,让所有文字变成红色
  3. 制作一个符合现代审美的表单,去除所有用户代理默认样式

需要我继续深入以下任意部分吗?

  • 盒模型的 margin 合并与塌陷
  • 层叠上下文(Stacking Context)与 z-index
  • 自定义属性(CSS Variables)与继承
  • 2026 年最新的 CSS Reset 方案对比

随时告诉我!

文章已创建 5321

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部