HTML 基础 · 37/88
1. 微信小程序 bindtap 和 catchtap 的区别 2. Bootstrap 徽章 3. Bootstrap 按钮下拉菜单 4. Bootstrap 按钮组 5. Bootstrap 按钮激活与禁用 6. Bootstrap 文档类型声明 7. Bootstrap 下拉菜单 8. Bootstrap 表单帮助文本 9. Bootstrap 水平表单 10. Bootstrap 输入框组 11. Bootstrap 超大屏幕 12. Bootstrap 标签 13. Bootstrap 导航类型 14. Bootstrap 分页 15. Bootstrap 响应式表格 16. Bootstrap 垂直表单创建 17. 浏览器乱码问题及解决方案 18. Canvas 标签属性与 CSS 样式设置宽高的区别 19. Canvas、SVG、WebGL 对比 20. 网页验证码的作用 21. 前端跨页面通信方法 22. 圆形可点击区域实现 23. 浏览器多标签页通信方案 24. CSSOM 树和 DOM 树的解析时机 25. 设备的 DPR 是否可变 26. 禁用 a 标签的跳转和定位 27. DOM 和 BOM 的区别 28. DOM 发展历程 29. DOCTYPE 与文档模式 30. DNS 预解析优化网页加载速度 31. DOM 树的理解 32. Drag API 拖拽事件 33. 前端 SEO 优化要点 34. 标题与副标题的实现 35. HTML 元素分类 36. HTML 全局属性 37. HTML 页面渲染过程 38. HTML 语义化 39. HTML 语义化 40. HTML5 DOCTYPE 声明简化原因 41. HTML5 离线存储原理与使用 42. HTML5 新特性 43. HTML5 移除的元素 44. IconFont 字体图标 45. iframe 的优缺点与通信 46. 图片点击下载而非预览 47. HTML 和 CSS 中的图片加载与渲染规则 48. 浏览器预览待上传图片 49. img 标签 title 和 alt 的区别 50. input 标签触发拍照功能 51. 控制 input 输入框字数 52. img 的 srcset 属性 53. 禁止 input 显示历史记录 54. input 上传多个文件 55. JS 和 CSS 对 DOM 树构建的影响 56. label 标签的作用 57. link 和 @import 的区别 58. Meta 标签常用属性 59. Meta 标签自动刷新跳转 60. 小程序的双线程架构 61. 小程序页面间传递数据的方法 62. 小程序为什么没有 DOM API 63. 微信小程序的优劣势 64. Node 和 Element 的关系 65. 页面生命周期事件:DOMContentLoaded、load、beforeunload、unload 66. 渐进增强与优雅降级 67. 渐进式 JPEG 图片格式 68. PV 和 UV 的区别 69. Script 标签 defer 和 async 70. 实现点击回到顶部功能 71. script 标签能否使用自闭合语法 72. src 与 href 的区别 73. SSG 静态网站生成 74. style 标签位置对页面渲染的影响 75. 从输入 URL 到页面显示的过程 76. Web 标准与可访问性理解 77. 网页常用图片格式 78. 网页常用图片格式 79. Web 标准与 W3C 标准 80. WebSocket 低版本浏览器兼容方案 81. Web Worker 的作用与场景 82. 微信小程序事件传值 83. 微信小程序文件结构 84. 微信小程序的架构 85. 微信小程序原理 86. 页面白屏时间优化 87. 小程序 WXSS 与 CSS 的区别 88. XHTML 与 HTML 的区别

HTML 页面渲染过程

浏览器如何将 HTML、CSS 解析并渲染成可视化页面

问题

浏览器是如何将 HTML 页面渲染成可视化图像的?

解答

基本概念

渲染过程涉及几个关键组件:

HTML 解释器:将 HTML 文本解析成 DOM 树(文档对象模型)。

CSS 解释器:解析样式表,为 DOM 元素添加样式信息,为布局计算提供依据。

布局引擎:结合 DOM 和 CSS 样式信息,计算元素的大小、位置等布局信息,形成渲染树。

JavaScript 引擎:执行 JavaScript 代码,修改 DOM 和 CSS,影响最终的渲染结果。

渲染流程

1. 解析 HTML,创建 DOM 树

浏览器解析 HTML 源码,创建 DOM 树。每个 HTML 标签对应一个节点,文本内容也会生成文本节点。DOM 树的根节点是 documentElement(对应 <html> 标签)。同时并行请求 CSS、图片、JavaScript 等资源。

2. 解析 CSS,构建 CSSOM 树

浏览器解析 CSS 代码,构建 CSSOM 树。非法语法会被忽略。样式优先级顺序:

浏览器默认设置 < 用户设置 < 外链样式 < 内联样式 < HTML style 属性

3. 合并生成渲染树

将 DOM 树和 CSSOM 树合并,生成渲染树(Rendering Tree)。渲染树与 DOM 树的区别:

  • 忽略不需要渲染的元素(如 <head>display: none 的元素)
  • 文本的每一行都是独立节点
  • 每个节点存储对应的 CSS 属性

4. 布局和绘制

根据渲染树计算每个节点的几何信息(位置、大小),然后将页面绘制到屏幕上。

这四个步骤不是一次性完成的。当 DOM 或 CSSOM 被修改时,会重复执行相应步骤。

重绘与重排

Repaint(重绘)

当元素样式改变但不影响布局时(如 background-colorborder-colorvisibility),浏览器会重新绘制元素外观。重绘不会触发重排。

Reflow(重排)

当元素的位置、大小等布局信息改变时,需要重新计算布局。重排必然导致重绘,但重绘不一定需要重排。

渲染优化

合并样式操作:将多次样式修改合并成一次操作。

使用绝对定位:对需要频繁重排的元素(如动画元素)设置 position: absolutefixed,使其脱离文档流,避免影响其他元素。

先隐藏再操作:对需要复杂操作的元素,先设置 display: none,操作完成后再显示,只触发两次重排。

关键点

  • 渲染过程:HTML 解析 → DOM 树 → CSS 解析 → CSSOM 树 → 合并生成渲染树 → 布局 → 绘制
  • 渲染树会忽略不可见元素(display: none<head> 等),且每个节点包含完整的样式信息
  • 重排(布局改变)必然导致重绘,但重绘(样式改变)不一定触发重排
  • 优化方向:减少 DOM 操作次数、使用绝对定位隔离频繁变化的元素、批量修改样式