HTML页面渲染及优化详解

html-css09

HTML页面渲染及优化详解,第1张

页面渲染主要经过过程,具体介绍如下:

字节 → 字符 → 令牌 → 节点 → 对象模型

CSS树的生成和DOM树的生成基本是相同,如下

为什么会有CSS树

因为CSS关系也会有父子关系,就是css中常说的继承,一些样式如font-size等子元素会继承父级,所以会生成一套对应的CSS树和DOM树相对应。

通过上面的页面渲染介绍,很容易理解,重排就是重新布局页面结构,计算节点位置,而重绘就是绘制页面,只是一些样式如背景,颜色的变化等,不需要重新计算位置布局,所以 重排一定会导致重绘,但是重绘不一定导致重排。

导致页面重排主要有以下几点

上文中触发了四次重排,通过上文介绍,offsetTop,scrollTop,clientTop等属性的修改会触发重排,当浏览器获取DOM样式的时候立刻会执行一次重排,因为需要计算浏览器位置坐标,不会再继续观察下文是否还有DOM的操作,下文介绍浏览器渲染机制。

这种情况看似会触发四次重排,实际只会触发一次重排,现代浏览器基本都有渲染机制,浏览器会批量将样式修改一次性执行,批量修改完后再批量获取DOM位置,实际只触发一次。

等价于

通过上文,容易理解这种情况会触发两次重排,可以使用缓存(实际是分离读写)来优化。

这种情况会触发五次重排

避免设置大量的style属性,因为通过设置style属性改变结点样式的话,每一次设置都会触发一次reflow,所以最好是使用class属性实现元素的动画,设置position属性,最好是设为absoulte或fixed,脱离文档流,这样不会影响其他元素的布局。

事件委托原理:利用事件冒泡的特性,子元素都会冒泡到父元素上,当子元素如(li)元素都绑定事件时,可以只需绑定父元素(ul)来达到相同的效果,这样不仅减少了对dom的操作,减少重排或重绘,而且不用分配大量变量来保存dom,减少了内存。

委托

不要使用table布局,因为table中某个元素一旦触发了reflow,那么整个table的元素都会触发reflow。那么在不得已使用table的场合,可以设置table-layout:auto或者是table-layout:fixed这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围。

不要一个个修改属性,应通过一个class来修改

改为

参考文献

https://blog.csdn.net/b954960630/article/details/82317999

需要准备的材料分别有:电脑、html编辑器、浏览器。

1、首先,打开html编辑器,新建html文件,例如:index.html。

2、在index.html中的<script>标签,输入js代码:var a = '<input type="text" value="test" />'document.body.innerText = a。

3、浏览器运行index.html页面,此时html代码被当成字符串渲染到了页面上。

当浏览器从服务器接收到页面的HTML响应时,在屏幕上绘制像素之前需要采取许多步骤。浏览器为页面的初始绘制需要执行的顺序称为“ 关键渲染路径 ” (CRP)。

CRP知识对于了解如何改善站点性能非常有用。CRP分为6个阶段-

DOM( 文档对象模型 )树是完全解析的HTML页面的对象表示。从根元素开始, <html>将为页面上的每个元素/文本创建节点。嵌套在其他元素中的元素表示为子节点,每个节点都包含该元素的完整属性。例如, <a>元素将具有 href 与其节点关联的属性。

以这个样本文件为例-

这将创建以下DOM树-

关于HTML的一件好事是它可以部分执行。无需加载完整的文档即可使内容开始出现在页面上。但是,其他资源(CSS和JavaScript)可能会阻止页面的呈现。

CSSOM( CSS对象模型 )是与DOM关联的样式的对象表示。它以与DOM相似的方式表示,但包括每个节点的关联样式,无论它们是显式声明的还是隐式继承的。

在上述 style.css 文档的文件中,我们具有以下样式-

这将创建以下CSSOM树-

CSS被视为 “渲染阻止资源” 。这意味着如果不首先完全解析资源,则无法构建 渲染树 。与HTML不同,由于CSS具有继承级联性质,因此不能部分使用。稍后在文档中定义的样式可以覆盖和更改先前定义的样式。因此,如果我们在解析整个样式表之前开始使用样式表中较早定义的CSS样式,则可能会遇到应用了错误CSS的情况。这意味着,在我们进入下一阶段之前,必须对CSS进行完全解析。

CSS文件仅适用于当前设备,才被视为渲染阻止。该 <link rel="stylesheet">标签可以接受一个 media 属性,我们可以在其中指定任何媒体查询其内的样式应用到。例如,如果我们有一个样式表,其media属性为 orientation:landscape ,并且我们正在以纵向模式查看页面,则该资源将不被视为渲染阻止。

CSS也可以是 “脚本阻止” 。这是因为JavaScript文件必须等待CSSOM构造完成后才能运行。

JavaScript被视为 “解析器阻止资源” 。这意味着HTML文档本身的解析已被JavaScript阻止。

当解析器到达一个 <script>标签时,无论是内部标签还是外部标签,它都会停止获取(如果是外部标签)并运行它。这就是为什么,如果我们有一个JavaScript文件引用了文档中的元素,则必须将其放在该文档的外观之后。

为了避免JavaScript被解析器阻止,可以通过应用 async 属性异步加载它。

渲染树是DOM和CSSOM的组合。它是一棵树,代表最终将在页面上呈现的内容。这意味着它仅捕获可见的内容,并且不包括例如使用CSS被CSS隐藏的元素 display: none 。

使用上面的示例DOM和CSSOM,将创建以下渲染树-

布局是决定视口大小的要素,它为依赖于它的CSS样式(例如百分比或视口单位)提供了上下文。视口大小由文档头中提供的meta视口标签确定,或者,如果未提供标签,则使用默认视口宽度980px。

例如,最常见的元视口值是将视口大小设置为与设备宽度相对应-

如果用户在宽度为例如1000px的设备上访问网页,则尺寸将基于该单位。视口的一半将是500px,10vw将是100px,依此类推。

最后,在“绘画”步骤中,页面的可见内容可以转换为要在屏幕上显示的像素。

绘制步骤需要花费多少时间取决于DOM的大小以及所应用的样式。某些样式比其他样式需要执行更多工作。例如,复杂的渐变背景图像比简单的纯色背景需要更多的时间。

要查看正在处理的关键渲染路径,我们可以在DevTools中对其进行检查。在Chrome浏览器中,它位于“ 时间轴” 标签下(在Canary中,不久后成为Chrome稳定版,它已重命名为 Performance )。

举例来说,我们上面的示例HTML(带有添加的 <script>标记)-

如果我们查看页面加载的事件日志,就会得到以下信息:

基于此信息,我们可以决定如何优化“关键渲染路径”。

Understanding the Critical Rendering Path