1 浏览器渲染的工作流程

浏览器的工作原理。以Webkit引擎的工作流程为例,浏览器加载一个HTML页面后进行如下操作

解析HTML【遇到标签加载图片】 —> 构建DOM树

加载样式 —> 解析样式【遇到背景图片链接不加载】 —> 构建样式规则树

加载javascript —> 执行javascript代码

把DOM树和样式规则树匹配构建渲染树【加载渲染树上的背景图片】

计算元素位置进行布局

绘制【开始渲染图片】

2 图片加载与渲染规则

页面中不是所有的标签图片和样式表背景图片都会加载。设置了display:none属性的元素,图片不会渲染出来,但会加载。

.img-purple {

background-image:url(../image/purple.png);

}

图片资源请求如下:

原理

把DOM树和样式规则树匹配构建渲染树时,会把可渲染元素上的所有属性(如display:none属性和background-image属性)结合一起产出到渲染树。

当解析渲染树时会加载标签元素上的图片,发现元素上有background-image属性时会加载背景图片。

当绘制时发现元素上有display:none属性,则不计算该元素位置,也不会绘制该元素。

.img-yellow {

background-image:url(../image/yellow.png);

}

图片资源请求如下:

设置了display:none属性元素的子元素,样式表中的背景图片不会渲染出来,也不会加载;而标签的图片不会渲染出来,但会加载。

原理

正如上面所说的,构建渲染树时,只会把可渲染元素产出到渲染树,这就意味有不可渲染元素,当匹配DOM树和样式规则树时,若发现一个元素的属性上有display:none,浏览器会认为该元素的子元素是不可渲染的,因此不会把该元素的子元素产出到渲染树上。

当解析渲染树时渲染树上没有设置了display:none属性元素的子元素,因此不会加载该元素中子元素的背景图片。

当绘制时也因为渲染树上没有设置了display:none属性元素的子元素,因此该元素中子元素的背景图片不会渲染出来。

重复图片

.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树上,因此渲染树上也不会有不存在的元素,当解析渲染树时无法解析不存在的元素,不存在的元素上的图片自然不会加载也不会渲染。

伪类的背景图片

.img-green{

background-image: url(../image/green.png);

}

.img-green:hover{

background-image: url(../image/red.png);

}

触发hover前的图片资源请求如下:

触发hover后的图片资源请求如下:

当触发伪类的时候,伪类样式上的背景图片才会加载。

原理

触发hover前,DOM树与样式规则树匹配的是无hover状态选择器.img-green的样式,因此渲染树上background-image属性的值是url(../image/green.png),解析渲染树时加载的是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隐藏的父元素变为显示,这个父元素里的子元素图片会在父元素显示后才开始加载;又如当鼠标hover到图标后,改变图标图片,图片会在hover上去后才开始加载,导致出现闪一下这种不友好的体验。

在这种场景下,我们就需要把图片预加载,预加载有很多种方式:

若是小图标,可以合并成雪碧图,在改变状态前就把所有图标都一起加载了。

使用上文讲到的,设置了display:none属性的元素,图片不会渲染出来,但会加载。把要预加载的图片加到设置了display:none的元素背景图或标签里。

在javascript创建img对象,把图片url设置到img对象的src属性里。

原文:http://www.cnblogs.com/LO-ME/p/7291138.html

浏览器渲染html的流程,浏览器渲染的工作流程和图片加载与渲染规则相关推荐

  1. android 浏览器对图片加载高度渲染问题

    今天在开发有道汉语词典移动版的时候遇到了一个很奇怪的问题. 在android设备上访问的时候,总是发现有底部背景色不能完全渲染出来的情况(有时候又是正常的,一会儿出现一会儿不出现,iphone设备也是 ...

  2. WeChat报错微信小程序图片加载失败渲染层网络层错误Failed to load image /pages/index/image/index.jpg:用绝对路径不用相对路径

  3. 微信小程序报错图片加载失败渲染层网络层错误Failed to load image

    这个错误找了很久,原来是这样的: <u-image v-if="baseListItem.img.length>0" :src="baseListItem.i ...

  4. 浏览器加载和渲染html的顺序

    1.浏览器加载和渲染html的顺序 浏览器加载和渲染html的顺序 IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的. 在渲染到页面的某一部分时,其上面的所有部分都已经下载完成 ...

  5. 加载如下html 写出输出顺序,浏览器加载和渲染html的顺序-结论篇

    我只转载觉得可以使用的. 1.浏览器加载和渲染html的顺序 1.IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的. 2.在渲染到页面的某一部分时,其上面的所有部分都已经下载完 ...

  6. 浏览器加载解析渲染机制的全面解析

    (注1:如果有问题欢迎留言探讨,一起学习!本文首发于我的简书,转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录.) 1. 简介 在前面一篇文章中,讲到了用户从输入url到看到页面的 ...

  7. 理解浏览器是如何加载及渲染网页的

    先上图,我们再慢慢解释,这图就是浏览器加载网页的一个过程 当我们在浏览器输入一个地址(比如:http://toadw.cn),那么点击回车后,浏览器是如何加载网页的呢? 加载过程 一开始浏览器是不知道 ...

  8. 页面加载完毕_【前端面试】dom 的解析,加载,渲染

    本文会把 dom 的解析,加载,渲染结合 window.performance 一起讲. dom 的解析 解析:HTMl 解析器把 HTML 构建成 HTML 树形数据结构,也就是 DOM 树. 注意 ...

  9. 页面的加载与渲染顺序

    页面的加载与渲染顺序: 1.一个页面的加载顺序是从上到下顺序加载的,并且加载与渲染同时进行. 2.引用外部js文件时,当在加载过程中遇到标签时,浏览器会向服务器发送一个reques并等待该reques ...

最新文章

  1. Oracle回应用户锁定,自治数据库是更好选择
  2. 面试lua笔试题各种坑
  3. php开启openssl的方法
  4. 软工Hello World!团队第二周博客汇总
  5. 不提拔你,就是因为你只想把工作做好
  6. sql 删除数据_从零开始学SQL:是什么、如何安装、基本语法、表格(创建、删除、更新)、数据(插入、删除、更新)...
  7. 7月送书中奖名单,快看!
  8. hadoop使用mapreduce统计词频_hadoop利用mapreduce运行词频统计(非例程)
  9. 麦迪逊大学计算机科学咋样,威斯康星大学麦迪逊分校
  10. 翻译: 4.3. 多层感知器的简明实现MLP pytorch
  11. mysql事物超时回滚_查询超时和事务回滚的处理办法
  12. 字符集本地化(locale)与输入法系列讲座-----(1) UTF-8 and Unicode FAQ
  13. spfa算法(c++)
  14. XJTU-SY滚动轴承加速寿命试验数据集
  15. php kindeditor远程图片上传,kindeditor 远程图片本地化,远程图片下载到本地自动更换图片路径...
  16. Scratch3.0创意编程(基础篇):第10课 接苹果
  17. Graph U-Nets [gPool gUnpool] 图分类 节点分类 图池化 ICML 2019
  18. ECCV 2020 best paper: RAFT算法解析
  19. 小米全面对标iPhone
  20. mysql添加表或字段注释

热门文章

  1. node.js实现阿里云配置发送短信验证码
  2. javajson转数组,2021最新版!
  3. 仿京东滑动页面搜索框背景渐变
  4. java开发小结:(2006.10.12-future)
  5. codePointAt()方法
  6. 在linux增加路由
  7. 回购国内股份,改回中国国籍,93岁的李嘉诚葫芦里卖的什么药?
  8. 移植OSS SDK到TI3354 ARM平台记录
  9. JavaSE面向对象学习笔记
  10. OD学习笔记(Push绕过登录框)