浏览器渲染过程

有时候想要进行性能优化时了解浏览器的渲染过程无疑是十分重要的。下面来看

首先介绍一下主流浏览器的渲染引擎:

IE:Trident

chrome:Blink

Safire:webkit

Firefox:Gecko

Opera:Blink

QQ浏览器/微信webview:X5/Blink

可能有很多会感到疑惑:chrome不是webkit么?其实Blink也算是webkit的一种升级吧,前缀还是不变的。 

然后介绍一下渲染过程

1、DOM解析(与CSS解析同时进行):

  把HTML文档解析成DOM树的过程;

  在这之中:

  *注意event:DOMContentLoaded完成的时间:它是在页面初始的HTMNL页面加载和解析之后,这这之前是没有样式表,图片,和子帧(subframes)完成加载的。注意和load的区别。这里可以参考原文档:

  The DOMContentLoaded event is fired when the initial HTML document has been completely loaded and parsed, without waiting for stylesheets, images, and subframes to finish loading. A very different event load should be used only to detect a fully-loaded page. It is an incredibly popular mistake to use load where DOMContentLoaded would be much more appropriate, so be cautious.

  其实去看渲染的时间线就会发现:load总是在pages show之前。DOMContentLoaded就很多情况了。不过在外联script时除了属性为async时都在js解析之后。

2、CSS 解析(与DOM解析同时进行):

  把css代码解析为css规则的过程

  *与script的执行互斥;在解析script时会直接停止DOM的解析(外联),内联时是在DOM解析的过程中编译script脚本。

3、DOM Tree:

  这个就很明显了,由DOM解析之后形成的文档对象模型。

  *注意display:none、<script></script>标签、注释都在DOM Tree中

4、Render Tree:

  DOM Tree + CSS Rules = Render Tree

  *每一个节点叫Render Object对象,包含了对象的宽高、位置、背景色、等样式信息。

  *宽高和位置通过Layout计算的。

  *display:none的元素不在Render Tree中,因为它在页面布局中是不存在的。visibility:hidden的元素只是隐藏所以在布局中是要有的,所以它存在于Render Tree中。

  *float、absolute、fixed元素会脱离文档流也就是脱离当前的Render Tree,重新布局。

5、重排(Layout)/回流(reflow)

  我觉得重拍就是重新布局的过程,计算宽高和位置啊,如何排列啊这种。

  *当修改元素的位置、大小时可能会引起父集元素的位置和大小,或者影响周围元素的位置,从而导致重排。也就是重新进行页面的布局。

  那如何避免重排呢:

  *用transform做形变和位移。

  *或通过绝对定位,脱离当前层叠上下文(即形成新的Render Layer)

6、Render Layer:

   在某些条件下Render Tree中的节点会提升为Render Layer。生成Render Layer是将Render Tree上的某些节点提升到同一个Layer的过程。

  *方便浏览器进行处理定位、页內滚动、裁剪、CSS Transform/OpCity/Animation/Filter、z-index排序

  *生成Redner Layers之后会合并成一颗Layer Tree

  *浏览器基于Layer Tree进行Paint

  *有时可通过obsolete来避免重排

生成Render Layer的条件:

  *根元素(HTML)

  *有明确的定位属性(relative、fixed、static、absolute)

  *透明的(opacity小于1)

  *有CSS滤镜(filter)

  *有CSS mask属性

  *有CSS mi x-blend-mode属性(不为normal)

  *有CSS transform属性(不为none)

  *backface-visibility属性为hidden

  *有CSS reflection属性

  *有CSS column-count属性(不为auto)或者有CSS column-width属性(不为auto)

  *当前有对于opacity、transform、filter、backdrop-filter 应用动画

  *overflow 不为 hidden(在我们有需要时可以修改overflow = hidden来提升)

  *不需要 paint 的 PaintLayer,比如说一个没有视觉属性(背景、颜色、阴影等)的空div

7、Graphics Layer

  将Layer Tree上的某些节点进一步提升与合并

 优势:

  *通过GPU直接渲染,快于CPU(也即是通常所说的硬件加速)

  *当需要repaint时,只需要 repaint 本身,不会影响其它层。

  *对于 transform 和 opacity 效果,不会触发 layout 和 paint

生成 Graphics Layer:

  *video、canvas元素、flash插件

  *拥有perspective、CSS3D 变形的元素

  *backface-visiblity 为 hidden

  *对 opacity、 transform、 filter、 backdropfilter 应用了 animation 或者 transition

  *设置了will-change属性的元素

  *层之间的层叠遮盖

时间: 2024-10-26 05:49:59

浏览器渲染过程的相关文章

从浏览器渲染过程看重绘回流

渲染过程 浏览器渲染过程如下: 解析 HTML,生成 DOM 树,解析 CSS,生成 CSSOM 树. 将 DOM 树和 CSSOM 树结合,生成渲染树(Render Tree). Layout(回流): 根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小). Painting(重绘): 根据渲染树以及回流得到的几何信息,得到节点的绝对像素. Display: 将像素渲染到屏幕上. 阻塞问题: 构建 CSSOM 会阻塞浏览器渲染,但不会阻塞解析 HTML 构建 DOM树.

读书笔记(二)—— 浅析浏览器渲染过程和html中的文件加载

在构建页面时,我们会在html中载入一个或多个css和js文件.或许大家都已经习惯了"最佳实践"中,css文件应该放在<head>标签中引入,而js文件则是放在</body>关闭标签前引入的原则,但其中的原因,很多人可能像我之前一样,不是了解得很清楚.在查阅了书籍和资料后,稍微了解的其中的原由. 让我们先看一看浏览器中的渲染流程: 主流程: 详细流程: 当浏览器获得一个html文件时,会"自上而下"加载,并在加载过程中进行解析渲染.     

通过浏览器渲染过程来进行前端优化

介绍 做web开发,我个人觉得必须要弄清楚浏览器的渲染过程,否则我们很难进行前端优化. 我今天就简单说一下页面加载和前端优化. 页面加载 我按照最简单的方式进行描述,实际上更复杂,不管是在浏览器端还是服务端,比如dns解析,代理服务器,负载均衡器等等. 1.用户访问网页,发送一个http请求到网络服务器. 2.网络服务器(应用服务器)解析请求,发送请求给数据库服务器. 3.数据服务器返回数据给网络服务器,网络服务器解析数据,并生成html文件内容放入http response中,返回给浏览器.

浏览器工作原理(二):浏览器渲染过程概述

参考:https://segmentfault.com/a/1190000012925872#articleHeader4 浏览器器内核拿到内容后,渲染大概可以划分成以下几个步骤: 解析html建立dom树 解析css构建render树(将CSS代码解析成树形的数据结构,然后结合DOM合并成render树) 布局render树(Layout/reflow),负责各元素尺寸.位置的计算 绘制render树(paint),绘制页面像素信息 浏览器会将各层的信息发送给GPU,GPU会将各层合成(com

浏览器渲染机制

1. 什么是DOCTYPE及其作用 DTD(document type definition,文档类型定义)是一系列的语法规则,用来定义XML或(X)HTML的文件类型.浏览器会使用它来判断文档类型,决定使用何种协议来解析及切换浏览器模式 DOCTYPE是用来声明文档类型和DTD规范的,一个主要的用途便是文件的合法性验证.如果文件代码不合法,那么浏览器解析便会出现一些差错. HTML5 <!DOCTYPE html> HTML4.01 Strict 该DTD包含所有的HTML元素和属性,但不包

浏览器渲染原理解析

作者:贝程学院 浏览器内核分为两部分:渲染引擎(Layout Engine 或者 Rendering Engine)和 JS 引擎.早期渲染引擎和 JS 引擎并没有明显区分,随着 JS 引擎越来越独立,内核逐渐变成了渲染引擎的代名词.渲染引擎包括: HTML 解释器 CSS 解释器 布局 网络 存储 图形 音视频 图片解码器 等等 渲染引擎简介 浏览器——Firefox.Chrome和Safari是基于两种渲染引擎构建的,Firefox使用Geoko——Mozilla自主研发的渲染引擎,Safa

浅谈浏览器解析 URL+DNS 域名解析+TCP 三次握手与四次挥手+浏览器渲染页面

(1)浏览器解析 URL 为了能让我们的知识层面看起来更有深度,我们应该考虑下面两个问题了: 从浏览器输入 URL 到渲染成功的过程中,究竟发生了什么? 浏览器渲染过程中,发生了什么,是不是也有重绘与回流? OK,兴致来了,我们就先从 浏览器解析 URL 看起,先来看看当用户输入 URL,到浏览器呈现给用户页面,经历了以下过程: 版本 A: 用户输入 URL 地址. 对 URL 地址进行 DNS 域名解析. 建立 TCP 连接(三次握手). 浏览器发起 HTTP 请求报文. 服务器返回 HTTP

前端必备的浏览器知识(渲染过程、回流和重绘等)

常用哪几种浏览器测试?有哪些浏览器内核(Rendering Engine)? (Q1)浏览器:Chrome,IE,FireFox,Safari,Opera. (Q2)对应内核:Webkit,Trident,Gecko,Webkit,Presto.(国内的浏览器,除了傲游是直接基于Webkit开发的,其他基本都是基于谷歌在webkit上开发的Chromium,当然谷歌自己也是用的Chromium.另外值得的一提的是手机的系统(安卓.苹果)默认浏览器都是基于webkit内核的) 如何理解浏览器内核?

浏览器渲染页面的过程,以及重排和重绘(转)

前言 写得比我的文字好,有逻辑! 浏览器的渲染过程 1,浏览器解析html源码,然后创建一个 DOM树.在DOM树中,每一个HTML标签都有一个对应的节点,并且每一个文本也都会有一个对应的文本节点.DOM树的根节点就是 documentElement,对应的是html标签. 2,浏览器解析CSS代码,计算出最终的样式数据.对CSS代码中非法的语法她会直接忽略掉.解析CSS的时候会按照如下顺序来定义优先级:浏览器默认设置,用户设置,外链样式,内联样式,html中的style. 3,构建出DOM树,