当前位置: 首页 > 科技观察

网页图片资源的加载和渲染时序

时间:2023-03-20 22:22:26 科技观察

本文研究页面上图片资源的加载和渲染时序,以便我们更好地管理图片资源,避免不必要的流量,提升用户体验。浏览器的工作流程要研究图片资源的加载和渲染,首先要了解浏览器的工作原理。以Webkit引擎的工作流程为例:从上图可以看出,浏览器加载一个HTML页面后,会进行如下操作:解析HTML—>构建DOM树并加载样式—>解析样式—>构建样式规则树并加载javascript—>执行javascript代码,将DOM树与样式规则树进行匹配,构建渲染树,计算元素位置,进行布局绘制。从上图中,我们不能直观的看出图片资源是什么时候开始加载的。下图是图片加载渲染的时序:解析HTML【遇到标签加载图片】—>构建DOM树加载样式—>解析样式【遇到背景图片链接加载不上】—>构建样式规则treeandloadjavascript—>执行javascript代码结合DOM树和styleruletree匹配构建渲染树【加载渲染树上的背景图片】计算布局绘制的元素位置【开始渲染图片】不是所有将加载图像加载和渲染规则页面中的标记图像和样式表背景图像。显示:无

图片资源请求如下:对于设置了display:none属性的元素,图片不会被渲染,但是会被加载。原理在匹配DOM树和样式规则树构建渲染树时,会将可渲染元素上的所有属性(如display:none属性和background-image属性)组合起来输出到渲染树。解析渲染树时,会加载标签元素上的图片,找到元素上的background-image属性时会加载背景图片。当绘制时发现元素上有display:none属性,则不会计算元素的位置,也就不会绘制元素。
图片资源请求如下:如果设置了display:none属性元素的子元素,则样式表中的背景图片不会berenderedorloaded;标签的图片不会被渲染,但是会被加载。原理就是上面说的,在构建渲染树的时候,只有可渲染的元素才会输出到渲染树中,也就是说还有不可渲染的元素。在匹配DOM树和样式规则树时,如果发现一个元素有display:none,浏览器会认为这个元素的子元素是不可渲染的,所以不会输出这个元素的子元素到渲染树。解析渲染树时,渲染树上没有设置display:none属性的元素的子元素,所以不会加载该元素中子元素的背景图。绘制时,由于渲染树上没有设置display:none属性元素的子元素,所以不会渲染该元素中子元素的背景图。重复Image.img-blue{background-image:url(../image/blue.png);}
图片资源请求如下:页面中的多个标签或样式表中的背景图片图片路径相同,图片只加载一次。原理当浏览器请求资源时,首先会判断是否有缓存。如果有缓存并且还没有过期,就会从缓存中读取,不会再次请求。先加载的图片会保存在浏览器缓存中,以后再次请求相同路径的图片时会直接读取缓存中的图片。没有元素的背景图片.img-blue{background-image:url(../image/blue.png);}.img-orange{background-image:url(../image/orange.png);}资源请求如下:不加载不存在的元素的背景图片。原理不存在的元素不会输出到DOM树中,所以渲染树上不会有不存在的元素。解析渲染树时,无法解析不存在的元素,不存在的元素上的图片自然不会加载。也不会渲染。伪类背景image.img-green{background-image:url(../image/green.png);}.img-green:hover{background-image:url(../image/red.png);}hover触发前的图片资源请求如下:hover触发后的图片资源请求如下:触发伪类时,会加载伪类样式上的背景图片。原理hover触发前,DOM树和样式规则树匹配非hover状态选择器的样式.img-green,所以rendering树上background-image属性的值为url(../image/green.png),parse渲染树时会加载green.png,绘制时也会渲染green.png。hover触发后,由于.img-green:hover的优先级比较高,DOM树匹配样式规则树与hover状态选择器.img-green:hover的样式,以及background-的值渲染树上的image属性是url(../image/red.png),解析渲染树的时候会加载red.png,绘制的时候也会渲染red.png。应用占位图片在样式表中使用背景图片作为占位图片时,必须将背景图片转换为base64格式。这是因为背景图片的加载顺序在标签后面,可能会在标签图片加载完成后才开始加载背景图片,达不到预期的效果。在很多预加载场景中,图片只有在状态改变或触发后才会显示。比如点击一个Tab后,一个隐藏的带有display:none的父元素就会显示出来,这个父元素中的子元素图片就会显示在父元素中。鼠标悬停在图标上更改图标图片后,悬停后图片会开始加载,导致闪退体验不友好。在这种情况下,我们需要预加载图像。预加载的方式有很多种:如果是小图标,可以合并成一个sprite图片,所有的图标一起加载,然后再改变状态。使用上面提到的元素,设置display:none属性,图像不会被渲染,但会被加载。将要预加载的图像添加到设置了display:none的元素的背景图像或标签中。在javascript中创建一个img对象,并将图片url设置为img对象的src属性。