Skip to content

HTML/CSS 核心知识

HTML 渲染流程详解

DOM树结构示意图DOM 树与 CSSOM 树合并生成渲染树示意图

1. DOM 树构建

  • 浏览器解析 HTML 文档,将标签转换为树形结构的DOM 节点
  • 每个 HTML 元素对应一个节点,包含属性和子节点关系

2. CSSOM 树构建

  • 解析 CSS 规则,构建样式对象模型(CSSOM)
  • 包含样式继承关系和层叠规则

3. 渲染树生成(Render Tree)

  • 合并 DOM 和 CSSOM,仅保留可见节点
  • 隐藏元素(display:none)不会出现在渲染树中

4. 布局阶段(Layout/Reflow)

  • 计算节点几何属性:位置、尺寸
  • 处理 CSS 盒模型、浮动、定位等布局规则

5. 绘制阶段(Paint)

  • 将节点转换为屏幕像素
  • 涉及文字渲染、背景绘制、边框绘制等操作

6. 合成与显示

  • 通过 GPU 加速进行图层合成
  • 触发硬件加速的属性:transformopacityfilter

7. JavaScript 执行

  • 解析执行脚本可能修改 DOM/CSSOM
  • 异步脚本通过defer/async优化加载

8. 资源加载

  • 解析过程中可能触发额外资源请求(CSS/JS/图片)

CSS 渲染阻塞机制

  • 🔄 并行构建:DOM 解析与 CSSOM 构建同时进行
  • ⏸ 渲染阻塞:CSSOM 未完成时,渲染树生成被阻塞
  • 📌 关键路径:优化 CSS 加载顺序可提升首屏渲染速度

显示控制对比表

属性占位情况触发行为性能影响
display: none❌ 不占位回流(Reflow)
visibility:hidden✅ 占位重绘(Repaint)

盒模型深度解析

css
/* 盒模型设置示例 */
.box {
  box-sizing: content-box; /* 默认W3C标准模型 */
  /* box-sizing: border-box; IE传统模型 */
}

盒模型分类

模型类型宽度计算规则
content-boxwidth = 内容宽度
border-boxwidth = 内容宽度 + padding + border
padding-boxwidth = 内容宽度 + padding
margin-box包含外边距的特殊模型(实验性)

响应式等高布局方案

css
/* 现代Flexbox方案 */
.container {
  display: flex;
  align-items: stretch; /* 默认值,可省略 */
}

居中布局全攻略

水平居中方案

元素类型实现方式
行内元素text-align: center (父容器)
块级元素margin: 0 auto
绝对定位元素left:50% + transform:translateX(-50%)
Flex 布局justify-content: center

垂直居中方案

场景实现方式
单行文本line-height: 容器高度
绝对定位元素top:50% + transform:translateY(-50%)
Flex 布局align-items: center
表格布局display: table-cell + vertical-align: middle

完美居中方案

css
/* Flex终极方案 */
.container {
  display: flex;
  justify-content: center;
  align-items: center;
}

选择器优先级矩阵

优先级顺序示例权重值
!important 声明color: red !important∞(最高)
内联样式<div style="...">1000
ID 选择器#header0100
类/属性/伪类选择器.nav, :hover0010
元素/伪元素选择器div, ::before0001
继承样式父元素属性继承0000(最低)

⚠️ 注意:选择器解析采用从右向左规则,优先匹配最右选择器

元素类型特性表

特性行内元素块级元素
宽度设置❌ 无效✅ 有效
上下外边距❌ 无效✅ 有效
水平排列✅ 自动❌ 独占一行
典型元素<span>, <a>, <img><div>, <p>, <ul>

BFC 深度解析

核心特性

  1. 🛡 隔离浮动:包含浮动元素,防止父容器高度塌陷
  2. 🚫 阻止外边距合并:解决相邻块级元素 margin 重叠问题
  3. 🔀 创建独立渲染区域:避免浮动元素覆盖

触发条件(满足其一即可)

css
/* 常见触发方式 */
.bfc-container {
  float: left; /* 浮动元素 */
  position: absolute; /* 绝对定位 */
  display: inline-block; /* 行内块元素 */
  overflow: hidden; /* 非visible的overflow */
}

浮动清除方案对比

方法实现方式优点缺点
空 div 法<div style="clear:both"></div>简单直观产生冗余 HTML
父容器 overflowoverflow: auto/hidden代码简洁可能影响绝对定位元素
伪元素法::after { content:""; clear:both }语义化好需处理 IE6/7 兼容
创建 BFCoverflow: hidden现代规范方案可能隐藏溢出内容
固定高度height: 200px简单直接缺乏响应式灵活性

⚠️ 最佳实践:推荐伪元素法 + BFC 组合方案,兼顾现代浏览器与兼容性

css
.clearfix::after {
  content: "";
  display: table;
  clear: both;
}
/* 触发BFC */
.parent {
  overflow: hidden;
}