登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
47
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 帐号,请先登录后再操作。
立即登录
没有帐号,去注册