登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
Gitee 年度开源项目评选中~
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
45
Fork
21
DreamCoders
/
CoderGuide
代码
Issues
1169
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
html和css中的图片加载与渲染规则是什么样的?
待办的
#IAG9PZ
陌生人
拥有者
创建于
2024-07-29 16:07
<p>Web浏览器先会把获取到的HTML代码解析成一个DOM树,HTML中的每个标签都是DOM树中的一个节点,包括<code>display: none</code>隐藏的标签,还有JavaScript动态添加的元素等。</p> <p>浏览器会获取到所有样式,并会把所有样式解析成样式规则,在解析的过程中会去掉浏览器不能识别的样式。</p> <p>浏览器将会把DOM树和样式规则组合在一起(DOM元素和样式规则匹配)后将会合建一个渲染树(Render Tree),渲染树类似于DOM树,但两者别还是很大的:</p> <p>渲染树能识别样式,渲染树中每个节点(NODE)都有自己的样式,而且渲染树不包含隐藏的节点(比如display:none的节点,还有<code></head></code>内的一些节点),因为这些节点不会用于渲染,也不会影响节点的渲染,因此不会包含到渲染树中。一旦渲染树构建完毕后,浏览器就可以根据渲染树来绘制页面了。</p> <p>简单的归纳就是浏览器渲染Web页面大约会经过六个过程:</p> <ul> <li>解析HTML,构成DOM树</li> <li>解析加载的样式,构建样式规则树</li> <li>加载JavaScript,执行JavaScript代码</li> <li>DOM树和样式规则树进行匹配,构成渲染树</li> <li>计算元素位置进行页面布局</li> <li>绘制页面,最终在浏览器中呈现</li> </ul> <p>是不是会感觉这个和我们图像加载渲染没啥关系一样,事实并非如此,因为img、picture或者background-image都是DOM树或样式规则中的一部分,那么咱们套用进来,图片加载和渲染的时机有可能是下面这样:</p> <ul> <li>解析HTML时,如果遇到img或picture标签,将会加载图片</li> <li>解析加载的样式,遇到background-image时,并不会加载图片,而会构建样式规则树</li> <li>加载JavaScript,执行JavaScript代码,如果代码中有创建img元素之类,会添加到DOM树中;如查有添加background-image规则,将会添加到样式规则树中</li> <li>DOM树和样式规则匹配时构建渲染树,如果DOM树节点匹配到样式规则中的backgorund-image,则会加载背景图片</li> <li>计算元素(图片)位置进行布局</li> <li>开始渲染图片,浏览器将呈现渲染出来的图片</li> </ul> <p>上面套用浏览器渲染页面的机制,但图片加载与渲染还是有一定的规则。因为,页面中不是所有的<code><img></code>(或picture)元素引入的图片和background-image引入的背景图片都会加载的。那么就引发出新问题了,什么时候会真正的加载,加载规则又是什么?</p> <p>先概括一点:</p> <blockquote> <p>Web页面中不是所有的图片都会加载和渲染!</p> </blockquote> <p>我们可以归纳为:</p> <ul> <li><code><img></code>、<code><picture></code>和设置background-image的元素遇到display:none时,图片会加载,但不会渲染。</li> <li><code><img></code>、<code><picture></code>和设置background-image的元素祖先元素设置display:none时,background-image不会渲染也不会加载,而img和picture引入的图片不会渲染但会加载</li> <li><code><img></code>、<code><picture></code>和background-image引入相同路径相同图片文件名时,图片只会加载一次</li> <li>样式文件中background-image引入的图片,如果匹配不到DOM元素,图片不会加载</li> <li>伪类引入的background-image,比如:hover,只有当伪类被触发时,图片才会加载</li> </ul>
<p>Web浏览器先会把获取到的HTML代码解析成一个DOM树,HTML中的每个标签都是DOM树中的一个节点,包括<code>display: none</code>隐藏的标签,还有JavaScript动态添加的元素等。</p> <p>浏览器会获取到所有样式,并会把所有样式解析成样式规则,在解析的过程中会去掉浏览器不能识别的样式。</p> <p>浏览器将会把DOM树和样式规则组合在一起(DOM元素和样式规则匹配)后将会合建一个渲染树(Render Tree),渲染树类似于DOM树,但两者别还是很大的:</p> <p>渲染树能识别样式,渲染树中每个节点(NODE)都有自己的样式,而且渲染树不包含隐藏的节点(比如display:none的节点,还有<code></head></code>内的一些节点),因为这些节点不会用于渲染,也不会影响节点的渲染,因此不会包含到渲染树中。一旦渲染树构建完毕后,浏览器就可以根据渲染树来绘制页面了。</p> <p>简单的归纳就是浏览器渲染Web页面大约会经过六个过程:</p> <ul> <li>解析HTML,构成DOM树</li> <li>解析加载的样式,构建样式规则树</li> <li>加载JavaScript,执行JavaScript代码</li> <li>DOM树和样式规则树进行匹配,构成渲染树</li> <li>计算元素位置进行页面布局</li> <li>绘制页面,最终在浏览器中呈现</li> </ul> <p>是不是会感觉这个和我们图像加载渲染没啥关系一样,事实并非如此,因为img、picture或者background-image都是DOM树或样式规则中的一部分,那么咱们套用进来,图片加载和渲染的时机有可能是下面这样:</p> <ul> <li>解析HTML时,如果遇到img或picture标签,将会加载图片</li> <li>解析加载的样式,遇到background-image时,并不会加载图片,而会构建样式规则树</li> <li>加载JavaScript,执行JavaScript代码,如果代码中有创建img元素之类,会添加到DOM树中;如查有添加background-image规则,将会添加到样式规则树中</li> <li>DOM树和样式规则匹配时构建渲染树,如果DOM树节点匹配到样式规则中的backgorund-image,则会加载背景图片</li> <li>计算元素(图片)位置进行布局</li> <li>开始渲染图片,浏览器将呈现渲染出来的图片</li> </ul> <p>上面套用浏览器渲染页面的机制,但图片加载与渲染还是有一定的规则。因为,页面中不是所有的<code><img></code>(或picture)元素引入的图片和background-image引入的背景图片都会加载的。那么就引发出新问题了,什么时候会真正的加载,加载规则又是什么?</p> <p>先概括一点:</p> <blockquote> <p>Web页面中不是所有的图片都会加载和渲染!</p> </blockquote> <p>我们可以归纳为:</p> <ul> <li><code><img></code>、<code><picture></code>和设置background-image的元素遇到display:none时,图片会加载,但不会渲染。</li> <li><code><img></code>、<code><picture></code>和设置background-image的元素祖先元素设置display:none时,background-image不会渲染也不会加载,而img和picture引入的图片不会渲染但会加载</li> <li><code><img></code>、<code><picture></code>和background-image引入相同路径相同图片文件名时,图片只会加载一次</li> <li>样式文件中background-image引入的图片,如果匹配不到DOM元素,图片不会加载</li> <li>伪类引入的background-image,比如:hover,只有当伪类被触发时,图片才会加载</li> </ul>
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
Html/JS/CSS
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册