浏览器渲染页面的原理及流程
浏览器将域名通过网络通信从服务器拿到html文件后,如何渲染页面呢?
1.根据html文件构建DOM树和CSSOM树。构建DOM树期间,如果遇到JS,阻塞DOM树及CSSOM树的构建,优先加载JS文件,加载完毕,再继续构建DOM树及CSSOM树。
2.构建渲染树(Render Tree)。
3.页面的重绘(repaint)与重排(reflow,也有称回流)。页面渲染完成后,若JS操作了DOM节点,根据JS对DOM操作动作的大小,浏览器对页面进行重绘或是重排。一、构建DOM树及CSSOM树1.1构建DOM树
HTML 文档中的所有内容皆是节点,各节点之间拥有层级关系,如父子关系、兄弟关系等,彼此相连,构成DOM树。最常见的几种节点有:文档节点、元素节点、文本节点、属性节点、注释节点
DOM节点树中节点与HTML文档中内容一一对应,DOM树构建过程:读取html文档,将字节转换成字符,确定tokens(标签),再将tokens转换成节点,以节点构建 DOM 树。如下图所示:

1.2构建CSSOM树
CSS文档中,所有元素皆是节点,与HTML文件中的标签节点一一对应。CSS中各节点之间同样拥有层级关系,如父子关系、兄弟关系等,彼此相连,构成CSSOM树。
在构建DOM树的过程中,在 HTML 文档的 head 标签中遇到 link 标签,该标签引用了一个外部CSS样式表。由于预见到需要利用该CSS资源来渲染页面,浏览器会立即发出对该CSS资源的请求,并进行CSSDOM树的构建。
CSSOM树构建过程与DOM树构建流程一致:读取CSS文档,将字节转换成字符,确定tokens(标签),再将tokens转换成节点,以节点构建 CSSOM 树。如下图所示:

.CSS文件,又名层叠样式表。当CSSOM树生成节点时,每一个节点首先会继承其父节点的所有样式,层叠覆盖,然后再以"向下级联"的规则,为该节点应用更具体的样式,递归生成CSSOM树。譬如,上右图中第二层的p节点,有父节点body,因此该p将继承body节点的样式:"font-size: 16px;"。然后再应用该p节点自身的样式:"font-weight: bold;"。所以最终该p节点的样式为:"font-size: 16px;font-weight: bold;"。1.3加载JS
若在构建DOM树的过程中,当 HTML 解析器遇到一个 script 标记时,即遇到了js,将立即阻塞DOM树的构建,将控制权移交给 JavaScript 引擎,等到 JavaScript 引擎运行完毕,浏览器才会从中断的地方恢复DOM树的构建。
其根本原因在于,JS会对DOM节点进行操作,浏览器无法预测未来的DOM节点的具体内容,为了防止无效操作,节省资源,只能阻塞DOM树的构建。譬如,若不阻塞DOM树的构建,若JS删除了某个DOM节点A,那么浏览器为构建此节点A花费的资源就是无效的。
若在HTML头部加载JS文件,由于JS阻塞,会推迟页面的首绘。为了加快页面渲染,一般将JS文件放到HTML底部进行加载,或是对JS文件执行async或defer加载。二.构建渲染树
渲染树(Render Tree)由DOM树、CSSOM树合并而成,但并不是必须等DOM树及CSSOM树加载完成后才开始合并构建渲染树。三者的构建并无先后条件,亦非完全独立,而是会有交叉,并行构建。因此会形成一边加载,一边解析,一边渲染的工作现象。
构建渲染树,根据渲染树计算每个可见元素的布局,并输出到绘制流程,将像素渲染到屏幕上。三.页面的重绘(repaint)与重排(reflow) 3.1重绘(repaint):屏幕的一部分要重绘。渲染树节点发生改变,但不影响该节点在页面当中的空间位置及大小。譬如某个div标签节点的背景颜色、字体颜色等等发生改变,但是该div标签节点的宽、高、内外边距并不发生变化,此时触发浏览器重绘(repaint)。 3.2重排(reflow):也有称回流,当渲染树节点发生改变,影响了节点的几何属性(如宽、高、内边距、外边距、或是float、position、display:none;等等),导致节点位置发生变化,此时触发浏览器重排(reflow),需要重新生成渲染树。譬如JS为某个p标签节点添加新的样式:"display:none;"。导致该p标签被隐藏起来,该p标签之后的所有节点位置都会发生改变。此时浏览器需要重新生成渲染树,重新布局,即重排(reflow)。
注意:重排必将引起重绘,而重绘不一定会引起重排。
何时回引起重排?
当页面布局和几何属性改变时就需要重排。下述情况会发生浏览器重排:
1、添加或者删除可见的DOM元素;
2、元素位置改变——display、float、position、overflow等等;
3、元素尺寸改变——边距、填充、边框、宽度和高度
4、内容改变——比如文本改变或者图片大小改变而引起的计算值宽度和高度改变;
5、页面渲染初始化;
6、浏览器窗口尺寸改变——resize事件发生时;3.3如何减少和避免重排Reflow 的成本比 Repaint 的成本高得多的多。一个节点的 Reflow 很有可能导致子节点,甚至父节点以及兄弟节点的 Reflow 。在一些高性能的电脑上也许还没什么,但是如果 Reflow 发生在手机上,那么这个过程是延慢加载和耗电的。----浏览器的渲染原理简介
1. 直接改变className,如果动态改变样式,则使用cssText(考虑没有优化的浏览器);
2. 让要操作的元素进行”离线处理”,处理完后一起更新;
a) 使用DocumentFragment进行缓存操作,引发一次回流和重绘;
b) 使用display:none技术,只引发两次回流和重绘;
c) 使用cloneNode(true or false) 和 replaceChild 技术,引发一次回流和重绘;
3.不要经常访问会引起浏览器flush队列的属性,如果你确实要访问,利用缓存;
4. 让元素脱离动画流,减少回流的Render Tree的规模;

原文:浏览器渲染页面的原理及流程 - 陈由梅 - 博客园

div置于页面底部_浏览器渲染页面的原理及流程相关推荐

  1. 多个html页面拼接成一个页面_浏览器渲染页面机制以及如何减少DOM操作

    为了能更好.更快的为用户呈现出他们想要的页面,基于浏览器的渲染机制,我们在开发中应该了解浏览器,了解浏览器的运行机制,以及在开发中我们能更好的提高性能,虽然现在市面上流行的VUE和react,但也应该 ...

  2. file_get_contents js没有渲染数据_浏览器渲染页面那些事

    浏览器 浏览器是一种软件,它可以从远程服务器(或本地磁盘)中加载文件并显示文件,它可以允许用户和它交互. 浏览器的核心是浏览器引擎.在不同的浏览器中,根据浏览器引擎的不同,它们显示页面的内容或者顺序会 ...

  3. 页面布局让footer居页面底部_网站各页面该如何布局关键词优化提升排名?

    在网站优化中,最值得关注的一个事情就是关键词的布局,因为关键词的布局直接影响着网站的排名.那么怎样布局关键词才能提高页面和关键词的相关性,并提高网站排名呢?下面一起来看看. 一.利用HTML标签布局关 ...

  4. 浏览器渲染页面的原理及流程---------重绘与重排(回流)--优化

    浏览器渲染页面的原理及流程 浏览器将域名通过网络通信从服务器拿到html文件后,如何渲染页面呢? 1.根据html文件构建DOM树和CSSOM树.构建DOM树期间,如果遇到JS,阻塞DOM树及CSSO ...

  5. 浏览器渲染页面全流程

    上文对浏览器渲染页面的过程只是一笔带过,本文将展开讲述一下浏览器拿到html/css等文件资源后是如何对页面进行渲染的,总体可以分为以下几步: 解析HTML,构建DOM树. 解析CSS,生成CSSOM ...

  6. 如何用php直接渲染页面,总结浏览器渲染页面的方法

    转载自web fundamental 构建对象模型 浏览器渲染页面前需要先构建 DOM 和 CSSOM 树.因此,我们需要确保尽快将 HTML 和 CSS 都提供给浏览器.字节 → 字符 → 标记 → ...

  7. 浏览器渲染机制的原理和过程

    上一篇文章对浏览器Event Loop机制中Tsak以及MicroTask执行过程讲述中,对一个Event Loop结束后更新渲染(Update the rendering)的过程并没有说明,所以单独 ...

  8. div置于页面底部_网易内部PPT模板有点丑,如何花最少的时间提高页面颜值?

    经常有朋友或者同事跟我吐槽:公司的模板太丑了,导致做出来的 PPT 有点辣眼睛! 不知道是模板真丑,还是拼命想甩锅... (不接受你的白眼) 所以,我就暗自搓搓手,就拿网易内部PPT开刀,用两个屡试不 ...

  9. 提高浏览器渲染页面速度

    怎样尽可能的缩短浏览器上页面渲染的时间,可以从以下几方面着手: 写出高效的css代码 避免使用css表达式 把css文件放在页面顶部 指定页面图片的尺寸 页面头部标明文档编码 一,写出高效的css代码 ...

最新文章

  1. 分析2021年私有云市场的发展趋势
  2. JDK 环境变量设置参考
  3. POJ 3254 状态压缩DP
  4. 5位院士谈科研瓶颈:必须“逼着自己在精神上愿意吃苦”
  5. android之uniapp从0开始离线打包
  6. 教育局查询2021年高考成绩,关于广东省2021年普通高考英语听说考试成绩发布有关事宜的通知...
  7. Linux新建文件和目录的默认权限 - Umask
  8. oninput onpropertychange
  9. 借阅书籍python_pythonMongoDB爬取图书馆借阅记录
  10. 工欲善其事,必先利其器——Web开发的10大IDE
  11. 哈佛大学各学院成立发展历史沿革介绍及整体评价
  12. agc013e Placing Squares(模型转化+dp+矩阵优化)
  13. 赶时间发布 ChatGPT 竞品后,Google 遭员工反讽:太仓促、拙劣、非 Google Style
  14. 开源搜索引擎评估:lucene sphinx elasticsearch
  15. ai不同形状的拼版插件_Illustrator(AI)自动拼版脚本 V1.5下载(编组对象的复制位移)...
  16. “性冷淡”的企业聊天工具,里面的秘密比陌陌还多
  17. 模拟登录淘宝--Python
  18. 【教程】搜索引擎高级语法
  19. 使用shiro的会话管理和redis缓存管理来构建登录模块spring+struts+hibernate(SSH)
  20. POST请求返回:401 Unauthorized

热门文章

  1. js实现的简单模态对话框
  2. ehlib中dbgrideh的多选框设置
  3. C语言必知必会-strtok赞歌
  4. 【细说软件工程】《软件工程》Software Engineering
  5. 操作系统(十)进程通信
  6. lower_bound upper_bound
  7. 知识图谱实践篇(五):KBQA Demo
  8. 【译】Understanding Universal Composition Framework and Sprites State Channels
  9. aapt2 资源 compile 过程
  10. 如何基于IPFS建一个静态网站