浏览器渲染原理与过程

一、浏览器如何渲染网页

要了解浏览器渲染页面的过程,首先得知道一个名词——关键路径渲染。关键渲染路径(Critical Rendering Path)是指与当前用户操作有关的内容。例如用户在浏览器中打开一个页面,其中页面所显示的东西就是当前用户操作相关的内容,也就是浏览器从服务器那收到的HTML,CSS,JavaScript等相关资源,然后经过一系列处理后渲染出来的web页面。

而浏览器渲染的过程主要包括以下五步:

  • 浏览器将获取的HTML文档并解析成DOM树。

  • 处理CSS标记,构成层叠样式表模型CSSOM(CSS Object Model)。

  • 将DOM和CSSOM合并为渲染树(rendering tree)将会被创建,代表一系列将被渲染的对象。

  • 渲染树的每个元素包含的内容都是计算过的,它被称之为布局layout。浏览器使用一种流式处理的方法,只需要一次pass绘制操作就可以布局所有的元素。

  • 将渲染树的各个节点绘制到屏幕上,这一步被称为绘制painting.

具体如下图过程如下图所示:

Webkit

需要注意的是,以上五个步骤并不一定一次性顺序完成,比如DOM或CSSOM被修改时,亦或是哪个过程会重复执行,这样才能计算出哪些像素需要在屏幕上进行重新渲染。而在实际情况中,JavaScript和CSS的某些操作往往会多次修改DOM或者CSSOM。

下面我们就来详细的了解一下这几个过程及需要注意的事项。

二、浏览器渲染网页的具体流程

2.1 构建DOM树

当浏览器客户端从服务器那接受到HTML文档后,就会遍历文档节点然后生成DOM树,DOM树结构和HTML标签一一对应。需要注意记下几点:

  1. DOM树在构建的过程中可能会被CSS和JS的加载而执行阻塞。(这在后面会详细介绍。)

  2. display:none 的元素也会在DOM树中。

  3. 注释也会在DOM树中

  4. script标签会在DOM树中

2.2 CSS解析

浏览器会解析CSS文件并生成CSS规则树,在过程中,每个CSS文件都会被分析成StyleSheet对象,每个对象都包括CSS规则,CSS规则对象包括对应的选择器和声明对象以及其他对象。
在这个过程需要注意的是:

  • CSS解析可以与DOM解析同进行。

  • CSS解析与script的执行互斥 。

  • 在Webkit内核中进行了script执行优化,只有在JS访问CSS时才会发生互斥。

2.3 构建渲染树(Rendr tree construction)

通过DOM树和CSS规则树,浏览器就可以通过它两构建渲染树了。浏览器会先从DOM树的根节点开始遍历每个可见节点,让后对每个可见节点找到适配的CSS样式规则并应用。具体的规则有以下几点需要注意:

  • Render Tree和DOM Tree不完全对应。

  • display: none的元素不在Render Tree中

  • visibility: hidden的元素在Render Tree中

2.4 渲染树布局(layout of the render tree)

布局阶段会从渲染树的更节点开始遍历,由于渲染树的每个节点都是一个Render Object对象,包含宽高,位置,背景色等样式信息。所以浏览器就可以通过这些样式信息来确定每个节点对象在页面上的确切大小和位置,布局阶段的输出就是我们常说的盒子模型,它会精确地捕获每个元素在屏幕内的确切位置与大小。需要注意的是:

  • float元素,absoulte元素,fixed元素会发生位置偏移。

  • 我们常说的脱离文档流,其实就是脱离Render Tree。

2.5 渲染树绘制(Painting the render tree)

在绘制阶段,浏览器会遍历渲染树,调用渲染器的paint()方法在屏幕上显示其内容。渲染树的绘制工作是由浏览器的UI后端组件完成的。

三、浏览器渲染网页的那些事儿

3.1 阻塞渲染

前面我们有提到这方面的问题,说到资源的阻塞我们清楚的是,现代浏览器总是并行加载自语言。例如当HTML解析器被脚本阻塞时,解析器虽然会停止构建DOM,但仍然会辨识该脚本后面的资源,并进行预加载。且由于以下两点。浏览器会延迟 JavaScript 的执行和 DOM 构建:

  • CSS 被默认被视为阻塞渲染的资源,因此浏览器将在 CSSOM 构建完毕前不会渲染任何已处理的内容。

  • JavaScript 不仅可以读取和修改 DOM 属性,还可以读取和修改 CSSOM 属性,因此CSS解析与script的执行互斥。

正是由于以上这些原因,script标签的位置很重要我们在实际开发中应该尽量坚持以下两个原则:

  • 在引入顺序上,CSS 资源先于 JavaScript 资源。

  • JavaScript 应尽量少的去影响 DOM 的构建。

3.2 回流和重绘(reflow和repaint)

我们都知道HTML默认是流式布局的,但CSS和JS会打破这种布局,改变DOM的外观样式以及大小和位置。因此我们就需要知道两个概念:

  • reflow(回流):当浏览器发现某个部分发生了变化从而影响了布局,这个时候就需要倒回去重新渲染,大家称这个回退的过程叫 reflow。 常见的reflow是一些会影响页面布局的操作,诸如Tab,隐藏等。reflow 会从 html 这个 root frame 开始递归往下,依次计算所有的结点几何尺寸和位置,以确认是渲染树的一部分发生变化还是整个渲染树。reflow几乎是无法避免的,因为只要用户进行交互操作,就势必会发生页面的一部分的重新渲染,且通常我们也无法预估浏览器到底会reflow哪一部分的代码,因为他们会相互影响。

  • repaint(重绘): repaint则是当我们改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画,但是元素的几何尺寸和位置没有发生改变。

需要注意的是,display:none 会触发 reflow,而visibility: hidden属性则并不算是不可见属性,它的语义是隐藏元素,但元素仍然占据着布局空间,它会被渲染成一个空框,这在我们上面有提到过。所以visibility:hidden 只会触发 repaint,因为没有发生位置变化。

我们不能避免reflow,但还是能通过一些操作来减少回流:

  1. 用transform做形变和位移.

  2. 通过绝对位移来脱离当前层叠上下文,形成新的Render Layer。

另外有些情况下,比如修改了元素的样式,浏览器并不会立刻reflow 或 repaint 一次,而是会把这样的操作积攒一批,然后做一次 reflow,这又叫异步 reflow 或增量异步 reflow。但是在有些情况下,比如resize 窗口,改变了页面默认的字体等。对于这些操作,浏览器会马上进行 reflow。

3.3 几条关于优化渲染效率的建议

结合上文和我看到的一些文章,有以下几点可以优化渲染效率

  1. 合法地去书写 HTML 和 CSS ,且不要忘了文档编码类型。

  2. 样式文件应当在 head 标签中,而脚本文件在 body 结束前,这样可以防止阻塞的方式。

  3. 简化并优化CSS选择器,尽量将嵌套层减少到最小。

  4. 尽量减少在 JavaScript 中进行DOM操作。

  5. 修改元素样式时,更改其class属性是性能最高的方法。

  6. 尽量用 transform 来做形变和位移

转载于:https://www.cnblogs.com/guchengnan/p/10755950.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解CSS盒模型 - 程序猿的程 - 博客园

深入理解CSS盒模型 本文是学习中传思客在慕课网开的课程《前端跳槽面试必备技巧》的学习笔记。课程地址:https://coding.imooc.com/class/evaluation/129.html#Anchor。 如果你在面试的时候面试官让你谈谈对盒模型的理解,你是不是不知从何谈起。这种看似…

线程死锁问题

1 package com.demo.bingfa;2 3 /**4 * java并发编程中,死锁的概念5 *6 * 我们启用了两个线程,分别抢占2个资源,但这两个资源又分别被不同的对象(字符串)锁住了。7 * 当第一个线程调用 resource1 方法,…

使用PM2搭建在线vue.js开发环境(以守护进程方式热启动)

项目以vue.jslayUI的作为前端开发技术栈,需要有一个在线的环境供项目成员实时查看效果,总不能每次都webpack打包发布后才能看到效果吧!刚开始就简单使用npm run dev命令热启动,但是shell命令窗口退出后,热启动也就失效…

zabbix实现mysql数据库的监控

先来介绍zabbix中几个常用的术语: 主机(host): 要监控的网络设备,可由ip或DNS名称指定。 主机组(host group): 主机的逻辑容器,可以包含主机和模板&#xff…

VSCode配合eslint进行JavaScript质量检查

写在开始前:如有不准确的地方希望大家提出,文章可以改知识不能错。 创建一个项目 这里已node项目为例 npm init 根据提示填写相关信息 安装eslint npm install eslint --save也可以全局安装 npm install eslint -g初始化 eslint文件 eslint --init执行命…

未找到导入的项目,请确认 Import 声明中的路径正确

VS2017打开以前vs版本开发的项目 <Import Project"$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project"$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" /> 修改V12…

bzoj [Usaco2009 Hol]Cattle Bruisers 杀手游戏

Description Input 第1行输入N&#xff0c;R&#xff0c;BX&#xff0c;BY, BVX&#xff0c;BVY&#xff0c;之后N行每行输入四个整数Xi&#xff0c;Yi&#xff0c;VXi&#xff0c;VYi&#xff0e; Output 一个整数&#xff0c;表示在逃脱过程中&#xff0c;某一个时刻最多有这…

Visual Studio Code 使用 ESLint 增强代码风格检查 - gyzhao - 博客园

前言 在团队协作开发中&#xff0c;为了统一代码风格&#xff0c;避免一些低级错误&#xff0c;应该设有团队成员统一遵守的编码规范。很多语言都提供了Lint工具来实现这样的功能&#xff0c;JavaScript也有类似的工具&#xff1a;ESLint。除了可以集成到构建工具中(如&#x…

eclipse下使用git插件上传代码至github

eclipse下使用git插件上传代码至github 1.eclipse下安装git 正常情况下&#xff0c;eclipse 是自带 git 插件的&#xff0c;那么即可跳至步骤1的最后一小步&#xff0c;配置 git 。 如果十分悲剧&#xff0c;你的 eclipse 中见不到 git 的身影&#xff0c;那么也没关系&#…

VS(C++)配置Halcon(一次配置,永久使用)

【说明】只需配置一次&#xff0c;以后新项目无需再次配置。 本教程是64位版本&#xff0c;32位可参考本教程。VS与Halcon无论哪个版本&#xff0c;都可参考本教程。 【步骤】以VS2015Halcon18.11为例 1、新建一个C|Win32控制台应用程序项目 2、视图|其他窗口|属性管理器 在 De…

(转)msys2使用教程

一、安装 官方下载地址 http://www.msys2.org/ 指定好安装路径&#xff08;一般D根目录即可&#xff09;&#xff0c;一路下一步就好。 二、配置国内镜像、设置窗体修改颜色 使用[清华大学开源软件镜像站]中的地址&#xff0c;修改\etc\pacman.d目录下的三个文件。 配置教程 ht…

简单使用Git和Github来管理自己的代码和读书笔记

简单使用Git和Github来管理自己的代码和读书笔记 以前不知道使用代码管理工具&#xff0c;最后写的一些东西都没有了&#xff0c;由于硬盘坏了或者不小心格式化了之类的&#xff0c;后来使用了Git 和Github来托管自己的代码和读书笔记方便了不少&#xff0c;到哪里只要有网就可…

android 资源

在进行APP开发的过程当中&#xff0c;会用到许多资源&#xff0c;比如&#xff1a;图片&#xff0c;字符串等。现对android资源知识进行简单记录。 具体的详细信息及用法&#xff0c;点击查看官方文档 分类 一般android资源分为可直接访问的系统资源和不可直接访问的原生资源 r…

ssh整合学习(1)

Hibernate框架 1 hibernate核心配置文件 &#xff08;0&#xff09;orm思想 -对象关系映射 &#xff08;1&#xff09;数据库信息 &#xff08;2&#xff09;hibernate信息 &#xff08;3&#xff09;映射配置 &#xff08;4&#xff09;hibernate核心配置文件 -如果单纯使用hi…

2018-2019-2 网络对抗技术 20165305 Exp6 信息搜集与漏洞扫描

1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法。 2.实践内容 &#xff08;1&#xff09;各种搜索技巧的应用 &#xff08;2&#xff09;DNS IP注册信息的查询 &#xff08;3&#xff09;基本的扫描技术&#xff1a;主机发现、端口扫描、OS及服务版本探测、具体服务…

Java 观察者模式

定义&#xff1a;定义了对象之间的一对多依赖&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;当主题对象发生变化时&#xff0c;它的依赖者&#xff08;观察者&#xff09;都会收到通知并更新 适用场景&#xff1a; 关联行为场景&#xff0c;建立一套触发机制…

苹果电脑快捷键有哪些?mac系统快捷键大全详细介绍(全部)_苹果MAC_操作系统_脚本之家

苹果电脑快捷键有哪些&#xff1f;mac系统快捷键大全详细介绍(全部) 电脑中的每对快捷键有对应了一种操作效果&#xff0c;对于使用苹果电脑的操作系统的新人来说&#xff0c;快捷键是个很麻烦的问题&#xff0c;要一个个的找到快捷键也不是很容易的问题&#xff0c;本文就为大…

Oracle数据库基础入门《一》Oracle服务器的构成

Oracle数据库基础入门《一》Oracle服务器的构成 Oracle 服务器是一个具有高性能和高可靠性面向对象关系型数据库管理系统&#xff0c;也是一 个高效的 SQL 语句执行环境。 Oracle 服务器具备以下的特点&#xff1a; ● 能够可靠的进行多用户环境下大量数据的处理&#xff0c;允…

虚拟机配置域名

1.虚拟机的hosts文件 2.本地电脑的hosts文件 转载于:https://www.cnblogs.com/xiaobiaomei/p/10790907.html

查看端口、关闭端口

1.在dos命令下查看tomcat占用的进程&#xff0c;首先在运行里输入cmd进入dos&#xff0c;输入命令“netstat -ano | findstr 8080”&#xff08;tomcat默认端口为8080&#xff09;。查出PID&#xff08;最后一列就是&#xff09;&#xff0c;假设PID为207340&#xff0c;输入命…