浏览器是如何一步步把代码变成网页的? - Web前端
作者:98wpeu发布时间:2026-10-22分类:网页前端技术浏览:16

打开浏览器输入网址,敲下回车,几秒钟后色彩丰富的网页就出现在眼前,这个过程中,浏览器到底做了什么?从一行行html、CSS、JS代码到可交互的页面,中间经历了哪些关键步骤?今天我们就来拆解浏览器渲染的全流程,揭开“代码变网页”的神秘面纱。
第一步:HTML如何变成DOM树?
要理解渲染过程,得先从“解析”说起,当浏览器拿到服务器返回的HTML文件后,第一件事就是启动“HTML解析器”,逐行读取代码并构建“文档对象模型”(dom树),这个过程有点像搭积木——每个标签(比如<div>、<p>)都是一块积木,解析器会识别标签类型、属性,然后按照嵌套关系把它们组装成树状结构。
但解析过程并非一帆风顺,如果遇到<script>标签,解析器会暂时停下脚步,因为js可能会修改DOM结构(比如用document.createElement),为了避免解析错误,浏览器默认会阻塞HTML解析,优先下载并执行JS代码,这也是为什么“JS放在页面底部”是常见优化建议——如果JS放在头部,可能会延迟DOM树的构建,导致页面加载变慢。
不过现代浏览器也聪明了许多,比如Chrome有个“预加载扫描器”,在解析HTML的同时,会扫描后续的资源标签(如<link>、<img>),提前下载css、图片等文件,减少等待时间。
第二步:CSS如何生成CSSOM树?
DOM树是网页的“骨架”,但要让页面有颜色、布局,还需要“皮肤”——这就需要CSS的参与,浏览器在下载CSS文件后,会启动“CSS解析器”,将CSS规则(选择器、属性、值)解析成“层叠样式表对象模型”(CSSOM树)。
CSSOM的构建比DOM复杂,因为需要处理“层叠”和“继承”,比如一个元素可能同时被多个选择器影响(类选择器、ID选择器),浏览器需要根据优先级(!important > 行内样式 > ID选择器 > 类选择器 > 标签选择器)计算最终样式,像font-size这种可继承的属性,子元素会默认继承父元素的值,除非自己特别声明。
特别要注意“媒体查询”(@media)的处理,如果CSS规则属于某个媒体查询(比如@media (max-width: 768px)),浏览器会先判断当前设备是否符合条件,符合的才会加入CSSOM,不符合的会被跳过,这也是为什么响应式设计能根据屏幕尺寸展示不同样式——本质上是CSSOM树在动态调整。
第三步:DOM和CSSOM如何“合体”成渲染树?
有了DOM树和CSSOM树,浏览器还不能直接渲染页面,因为两者都是独立的结构,这时候需要“渲染树”(Render Tree)来连接它们,渲染树的作用是告诉浏览器“哪些元素需要显示,以及它们的样式是什么”。
渲染树的构建逻辑是“过滤+合并”:首先过滤掉不可见的元素(比如display: none的元素、注释、<head>),然后将Dom节点与对应的CSSOM规则匹配,生成包含颜色、尺寸、位置等信息的渲染节点。
举个例子,一个<p class="title">你好</p>的标签,在渲染树中会对应一个节点,这个节点的样式是.title类定义的(比如color: red; font-size: 16px),而文字内容“你好”会作为子节点存在,但如果这个<p>标签被设置为display: none,它就不会出现在渲染树中,浏览器也不会为它分配渲染资源。
第四步:布局(重排):计算元素的位置和尺寸
渲染树生成后,每个节点还只是“有样式的盒子”,但具体放在页面哪个位置、占多大空间,需要“布局”(Layout,也叫重排)来确定,布局阶段的核心任务是根据渲染树,计算每个元素的几何信息(坐标、宽度、高度)。
布局过程是“从根节点开始递归计算”的,比如根节点是<html>,它的宽度通常是视口宽度(比如1920px),高度由内容决定,然后遍历子节点,比如<body>,它的宽度继承自<html>,边距可能由CSS的margin属性决定,再往下是<div>,如果设置了width: 50%,它的实际宽度就是父元素宽度的50%(比如960px)。
需要注意的是,布局是一个“牵一发而动全身”的过程,如果某个元素的尺寸或位置改变(比如窗口resize、修改width属性),浏览器需要重新计算整个受影响区域的布局,这就是“重排”,重排是比较耗时的操作,因为需要重新遍历渲染树,所以优化页面时要尽量减少重排次数。
第五步:绘制(重绘):给元素“上色”
布局完成后,每个元素的位置和尺寸已经确定,接下来需要“绘制”(Paint,也叫重绘)——把每个元素的视觉特性(颜色、背景、阴影、边框)转换成屏幕上的像素。
绘制同样是递归进行的,遵循“层叠上下文”规则,比如一个元素有z-index: 2,另一个有z-index: 1,绘制时会先画z-index小的元素,再覆盖z-index大的元素,如果元素有透明效果(比如opacity: 0.5),还需要计算与下层元素的混合色。
绘制的结果是生成“位图”(像素矩阵),但这个过程可能很耗时,尤其是复杂的元素(比如有大量阴影的卡片、渐变背景),所以浏览器会把页面分成多个“层”(Layers),每个层独立绘制,最后再合并到一起,这就是“合成”(Compositing)。
第六步:合成:GPU加速的“终极操作”
合成是渲染流程的最后一步,由GPU(图形处理器)主导,浏览器会为某些元素创建“合成层”,比如使用transform、opacity动画的元素,或者position: fixed的元素,这些层的绘制结果会被存储为“纹理”(texture),GPU通过“复合”(Compose)这些纹理,快速生成最终的屏幕图像。
合成的优势在于“局部更新”,比如一个动画元素在合成层中,它的位置变化只会触发该层的重新复合,而不需要重新布局或绘制其他层,这也是为什么“用CSS的transFORM代替top/left做动画”更流畅——前者触发合成,后者触发重排(需要重新计算布局)。
常见问题:为什么页面会卡顿?
了解了渲染流程,就能理解页面卡顿的常见原因:
JS执行时间过长:JS阻塞HTML解析,如果一段JS执行了500ms,DOM树构建就会延迟500ms,导致页面空白时间变长。
频繁重排/重绘:比如在循环中修改元素的
width属性,每次修改都会触发重排,浏览器需要反复计算布局,导致掉帧。层叠过多或合成层滥用:虽然合成层能加速渲染,但每个合成层都需要占用GPU内存,如果页面有上百个合成层,GPU内存不足时,反而会导致渲染变慢。
优化建议:让页面更快更流畅
知道了渲染流程,优化方向就清晰了:
减少关键资源阻塞:CSS放在
<head>中尽早下载,JS放在<body>底部或用async/defer属性,避免阻塞HTML解析。避免不必要的重排:批量修改元素样式(比如先隐藏元素,修改完再显示),使用
requestAnimationFrame同步动画,避免在循环中读取会触发重排的属性(如offsetWidth)。合理使用合成层:对需要动画的元素(如轮播图、提示框),用
will-change: transform提示浏览器创建合成层,但不要滥用,避免内存溢出。
从代码到网页,浏览器的渲染过程就像一场精密的“流水线作业”,每个步骤环环相扣,理解这些步骤不仅能帮我们定位页面性能问题,更能让我们写出“更懂浏览器”的代码,下次打开网页时,不妨想想:此刻屏幕上的每一个像素,都是浏览器经过DOM构建、CSSOM生成、布局、绘制、合成后,为你呈现的“数字艺术品”。
相关推荐
- JavaScript 怎么检测数据类型?常用方法全解析 - Web前端
- 模块化封装,把逻辑打包成可复用的小工具 - Web前端
- 先搞懂「防抖(debounce)是啥? - Web前端
- 为啥处理大文件得用Stream,普通读写有啥问题? - Web前端
- JavaScript为啥是单线程运行? - Web前端
- 若需代码格式检查,再装eslint、prettier(已有可跳过) - Web前端
- JS基础知识:先搞懂浅拷贝和深拷贝的核心区别 - Web前端
- 网页端OCR识别功能集成要注意哪些关键点? - Web前端
- 网页端脑图工具总卡顿?这6个性能优化技巧必须掌握 - Web前端
- 询问SEO:如何从现场迁移中恢复30%的有机流量下降? - Web前端
- 网页前端技术排行
-
- 1[Web前端]用javascript实现默认图片替代未显示的图片 - Web前端
- 2分析Iconfont-阿里巴巴矢量常用图标库 - Web前端
- 3jQuery实例教程:制作网页中可折叠的面板 - Web前端
- 4【第六章】Foundation之按钮和下拉功能 - Web前端
- 5基于jquery的滚动条滚动固定div(附演示下载) - Web前端
- 6分享精心挑选的12款优秀jQuery Ajax分页插件和教程 - Web前端
- 7jQuery实现鼠标移到元素上动态提示消息框效果 - Web前端
- 8jQuery编写widget的一些技巧分享 - Web前端
- 9在Mac/PC上远程调试iPhone/iPad上的网页 - Web前端
- 最近发表
-
- WordPress随机显示特色图片插件:Random Post Thumbnails
- KeePass实现Chrome浏览器自动填充密码方法一
- LNMP一键包nginx 301强制跳转到https教程
- KeePass实现Chrome浏览器自动填充密码方法二
- #建站# 免费的VPS管理软件Xshell8/Xftp8中文版下载
- 使用Xshell 8连接VPS教程_电脑登录vps的方法
- WordPress评论界面添加烟花????效果
- 不同浏览器书签同步方案:坚果云+Floccus_详细使用教程
- iOS端KeePassXC客户端APP:Strongbox Password Safe
- 给WordPress评论中的Gravatar头像图片添加ALT属性


