美文网首页
浏览器渲染页面步骤

浏览器渲染页面步骤

作者: Vampire丶_L | 来源:发表于2018-05-07 22:10 被阅读0次

一,页面渲染就是浏览器将 HTML 代码根据 CSS 定义的规则显示在浏览器窗口中的这个过程,理解了原理就更会容易理解前端优化的一些准则。

主要过程:

  1. 用户输入网址(假设是个 HTML 页面,第一次访问,无缓存情况),浏览器向服务器发出HTTP请求,服务器返回 HTML 文件;

  2. 浏览器载入 HTML 代码,发现 <head> 内有一个 <link> 引用外部 CSS 文件,则浏览器立即发送CSS文件请求,获取浏览器返回的CSS文件;

  3. 浏览器继续载入 HTML 中 <body> 部分的代码,并且 CSS 文件已经拿到手了,可以开始渲染页面了;

  4. 浏览器在代码中发现一个 <img> 标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;

  5. 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;

  6. 浏览器发现了一个包含一行 JavaScript 代码的 <script> 标签,会立即运行该js代码;

  7. js脚本执行了语句,它令浏览器隐藏掉代码中的某个 <div>,突然就少了一个元素,浏览器不得不重新渲染这部分代码;

  8. 终于等到了 </html> 的到来,浏览器泪流满面……

  9. 等等,还没完,用户点了一下界面中的“换肤”按钮,JavaScript 让浏览器换了一下 <link> 标签的 CSS 路径;

  10. 浏览器召集了在座的各位 <div><span><ul><li> 们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。

二,影响页面渲染速度主要有:reflow(回流)和repaint(重绘)

(1)reflow:当浏览器发现某个部分发生了点变化影响了布局,需要倒回去重新渲染, 该过程称为reflow。(说的通俗一点就是:当页面中的一部分元素需要改变规模尺寸、布局、显示隐藏等,页面重新构建,此时就是回流)

  • 关于回流 :几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显 示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲染。

(2) repaint:如果只是改变某个元素的背景色、文 字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器repaint(重绘),repaint 的速度明显快于 reflow。

三,尽量避免reflow(回流)

reflow(回流)是导致DOM脚本执行低效的关键因素之一。页面上任何一个结点触发reflow,都会导致它的子结点及祖先结点重新渲染。

在哪些情况下会导致reflow发生:

1.  改变窗囗大小
2.  改变文字大小
3.  添加/删除样式表
4.  内容的改变,如用户在输入框中敲字
5.  激活伪类,如:hover (IE里是一个兄弟结点的伪类被激活)
6.  操作class属性
7.  脚本操作DOM
8.  计算offsetWidth和offsetHeight
9.  设置style属性

尽管reflow是不可避免的,我们要做的是将reflow对性能的影响减到最小。

  • 尽可能限制reflow的影响范围。需要改变元素的样式,不要通过父级元素影响子元素。最好直接加在子元素上。

  • 通过设置style属性改变结点样式的话,每设置一次都会导致一次reflow。所以最好通过设置class的方式。

  • 实现元素的动画,它的position属性应当设为fixed或absolute,这样不会影响其它元素的布局。

  • 权衡速度的平滑。比如实现一个动画,以1个像素为单位移动这样最平滑,但reflow就会过于频繁,CPU很快就会被完全占用。如果以3个像素为单位移动就会好很多。

  • 不要用tables布局的另一个原因就是tables中某个元素一旦触发reflow就会导致table里所有的其它元素reflow。在适合用table的场合,可以设置table-layout为auto或fixed,这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围。

  • 很多情况下都会触发reflow,如果css里有expression,每次都会重新计算一遍。

  • 减少不必要的 DOM 层级(DOM depth)。改变 DOM 树中的一级会导致所有层级的改变,上至根部,下至被改变节点的子节点。这导致大量时间耗费在执行 reflow 上面。

  • 避免不必要的复杂的 CSS 选择器,尤其是后代选择器(descendant selectors),因为为了匹配选择器将耗费更多的 CPU。

四,举个栗子

display:nonevisibility:hidden的区别

display:none是彻底消失,在切换显示时(页面重新构建),页面就会产生回流
visibility:hidden是视觉上消失了,可以理解为透明度为0的效果,在文档流中占位,浏览器会解析该元素,所以不会产生回流
so 后一个的性能会比第一个好很多

相关文章

  • 前端工程师必备:从浏览器的渲染到性能优化

    浏览器渲染 1.浏览器渲染图解 [来自google开发者文档] 浏览器渲染页面主要经历了下面的步骤: 1.处理 H...

  • 浏览器渲染页面步骤

    一,页面渲染就是浏览器将 HTML 代码根据 CSS 定义的规则显示在浏览器窗口中的这个过程,理解了原理就更会容易...

  • 浏览器渲染机制

    关键渲染路径 浏览器从接收到页面开始到页面显示,这整个过程中的所有步骤,称为关键渲染路径。用户看到页面实际上可以分...

  • 前端必读-浏览器加载页面时都做了什么

    当一个浏览器接收到从服务器发来的html页面,在渲染并呈现到屏幕上之前,有很多步骤要做。浏览器渲染页面需要做的一系...

  • 浏览器是如何渲染页面的?

    浏览器页面渲染流程 浏览器从HTTP服务器获取html文档,到呈现页面给用户,会经过以下几个步骤: 1、解析文档构...

  • (译)理解浏览器的关键渲染路径

    当浏览器接收到从服务器发送过来的HTML页面信息,在将其绘画渲染到屏幕上之前会有许多的步骤要做。浏览器绘制页面需要...

  • 珍爱网笔试总结

    load和DOMContentLoad的区别 浏览器渲染页面DOM文档加载的步骤:1.解析HTML结构。2.加载外...

  • 浏览器渲染那些事

    WEB 页面运行在各种各样的浏览器当中,浏览器载入、渲染页面的速度直接影响着用户体验,简单地说,页面渲染就是浏览器...

  • 浏览器渲染页面过程

    浏览器渲染页面过程 1. 构建DOM和CSSOM树 浏览器渲染页面前需要构建DOM和CSSOM树 浏览器解析过程大...

  • 【浏览器】浏览器的渲染原理

    Web页面运行在各种各样的浏览器当中,浏览器载入、渲染页面的速度直接影响着用户体验简单地说,页面渲染就是浏览器将h...

网友评论

      本文标题:浏览器渲染页面步骤

      本文链接:https://www.haomeiwen.com/subject/mnhbrftx.html