We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
今天, 来探讨一下, 浏览器是怎么工作, 包括获取文档, 到渲染html到界面上.
浏览器从一个url, 获取到显示到界面上,经过 DNS查找,缓存策略, 发送请求的三次握手, 接收数据包, 解析, 再请求link的css, 开始构建DOM tree, 同时还开始构建Css tree, 2课合并生成位图, 合并位图, 把内存中的位图数据发送给GPU/驱动.
.com
.cn
.gov
这个流程没有什么问题.
乍一看这个流程好像很清晰,但是仔细的一想, 这过程太模糊了, 主要看几个主要的资源.
注意的是link里面的css,的下载是并行的, 下载和解析都不会影响html的解析, 但是html的渲染, 也就是attachment 合成渲染树这一步, 需要等待所有的css加载完毕, 再去渲染.
总结:
渲染树的每一个节点直接关联一个盒模型, display:none的节点不会被构建. 和dom树不是一对一对应的, 因为一个dom的节点可能出现多个盒子的情况, 比如inline的元素的折行会产生多个行框盒子. 在渲染树上也就是多个渲染对象了.此外一些替换元素的渲染也会被特殊处理. 比如select框的渲染就不能简单用一个盒模型来渲染.
当渲染对象被创建并添加到树中,它们并没有位置和大小,计算这些值的过程称为layout或reflow, 或者叫重排, 而html的渲染遵循一般流模型进行渲染页面, 不存在后面的元素影响前面的元素的大小的情况.这个计算宽高的过程分为2种情况, 分别是
webkit 引入了 Dirty bit系统进行控制每个一节点是否需要重新layout的情况. 标记为dirty的情况, 和children are dirty的情况,
一个可以的优化的地方, 是如果只是位置的变化,大小没有变化 那么会重新去缓存里面去获取该节点及其子节点的layout的信息, 而不必重新生成.
首先, layout是一个不断递归的过程, 在这个过程中, parent节点的大小依赖于child的layout,parent的高度, 取决于child的排列高度叠加.
parent 高度
parent 宽度
clientW idth和clientHeight代 表一个对象内部的不包括border和滑动条的大小
以上即是最佳的宽度计算.也就是设置节点的宽度的过程, 概括来说包含了内容区域的宽度、自身的padding、border、 、定义的样式宽度总和.
这个时候其实是通过和父元素的通信的, 也就是说, 父元素在遇到内联元素着汗显示的情况下, 需要另外建立一个内联盒子, 渲染折行的部分.
绘制过程用到的方法是paint
绘制的内容和重排一样, 分为全局绘制和增量绘制, 全局绘制通常需要同时会子节点的内容, 增量绘制, 只改变一部分的渲染对象, 通过让这部分的设置为dirty区域,产生一个paint区域.
绘制的顺序:
这些顺序在文档中有明确的定义说明:https://www.w3.org/TR/CSS21/zindex.html
绘制前, 会把渲染对象对应的矩形区域进行生成位图,理论上一个盒子对应一张位图,生成位图的一个优化是合成有效部分,缩小位图可以有效的减少内存占用和渲染压力.
常见的一些css会排斥位图合并, 比如position属性部位static的, 带动画效果的等等.
浏览器的渲染过程,相关的知识其实很少, 网络上并详细却官方的资料查阅, 一个有效的了解的途径是阅读chromium的邮件组细节, 和项目的开源代码, 但一个英语不好, 一个开源代码太官方, 又是c的, 可能还是因为懒吧, 哈哈哈.
How Browsers Work: Behind the Scenes of Modern Web Browsers https://kb.cnblogs.com/page/129756/#chapter5 https://juejin.im/post/5b88ddca6fb9a019c7717096 https://blog.51cto.com/369369/812889
本文的github地址浏览器是怎么渲染一个页面的, 如果有版权或其他问题, 请issue留言.感谢
The text was updated successfully, but these errors were encountered:
No branches or pull requests
前言
今天, 来探讨一下, 浏览器是怎么工作, 包括获取文档, 到渲染html到界面上.
浏览器从一个url, 获取到显示到界面上,经过 DNS查找,缓存策略, 发送请求的三次握手, 接收数据包, 解析, 再请求link的css, 开始构建DOM tree, 同时还开始构建Css tree, 2课合并生成位图, 合并位图, 把内存中的位图数据发送给GPU/驱动.
1.DNS查找的过程
.com
,.cn
,.gov
,...等等顶级域名服务器的IP地址, 再由本地DNS服务器发送请求去顶级域名服务器, 如果顶级域名不能解析,则会返回一个二级的DNS服务器的IP地址, 本地DNS服务器则再去下一级的DNS服务器的地址查找, 这样不断的递归这个查找过程, 直到查找到目标的解析地址. 拿到目标的解析地址, 本地的DNS服务器会进行缓存一份.解析html文档
1. 解析html的文档, 生成dom tree.
2. 接着, 解析css的样式, 生成css tree.
这个流程没有什么问题.
乍一看这个流程好像很清晰,但是仔细的一想, 这过程太模糊了, 主要看几个主要的资源.
注意的是link里面的css,的下载是并行的, 下载和解析都不会影响html的解析, 但是html的渲染, 也就是attachment 合成渲染树这一步, 需要等待所有的css加载完毕, 再去渲染.
总结:
渲染树,重排和重绘
渲染树的每一个节点直接关联一个盒模型, display:none的节点不会被构建. 和dom树不是一对一对应的, 因为一个dom的节点可能出现多个盒子的情况, 比如inline的元素的折行会产生多个行框盒子. 在渲染树上也就是多个渲染对象了.此外一些替换元素的渲染也会被特殊处理. 比如select框的渲染就不能简单用一个盒模型来渲染.
重排
当渲染对象被创建并添加到树中,它们并没有位置和大小,计算这些值的过程称为layout或reflow, 或者叫重排, 而html的渲染遵循一般流模型进行渲染页面, 不存在后面的元素影响前面的元素的大小的情况.这个计算宽高的过程分为2种情况, 分别是
webkit 引入了 Dirty bit系统进行控制每个一节点是否需要重新layout的情况. 标记为dirty的情况, 和children are dirty的情况,
但是子节点至少需要一次layout.
一个可以的优化的地方, 是如果只是位置的变化,大小没有变化 那么会重新去缓存里面去获取该节点及其子节点的layout的信息, 而不必重新生成.
layout的过程
首先, layout是一个不断递归的过程, 在这个过程中, parent节点的大小依赖于child的layout,parent的高度, 取决于child的排列高度叠加.
parent 高度
parent 宽度
clientW idth和clientHeight代 表一个对象内部的不包括border和滑动条的大小
以上即是最佳的宽度计算.也就是设置节点的宽度的过程, 概括来说包含了内容区域的宽度、自身的padding、border、 、定义的样式宽度总和.
line breaking发生在内联元素上, 文字折行显示的时候,会存在多个行框盒子.
这个时候其实是通过和父元素的通信的, 也就是说, 父元素在遇到内联元素着汗显示的情况下, 需要另外建立一个内联盒子, 渲染折行的部分.
绘制
绘制过程用到的方法是paint
绘制的内容和重排一样, 分为全局绘制和增量绘制, 全局绘制通常需要同时会子节点的内容, 增量绘制, 只改变一部分的渲染对象, 通过让这部分的设置为dirty区域,产生一个paint区域.
绘制的顺序:
这些顺序在文档中有明确的定义说明:https://www.w3.org/TR/CSS21/zindex.html
绘制前, 会把渲染对象对应的矩形区域进行生成位图,理论上一个盒子对应一张位图,生成位图的一个优化是合成有效部分,缩小位图可以有效的减少内存占用和渲染压力.
常见的一些css会排斥位图合并, 比如position属性部位static的, 带动画效果的等等.
总结
浏览器的渲染过程,相关的知识其实很少, 网络上并详细却官方的资料查阅, 一个有效的了解的途径是阅读chromium的邮件组细节, 和项目的开源代码, 但一个英语不好, 一个开源代码太官方, 又是c的, 可能还是因为懒吧, 哈哈哈.
参考
The text was updated successfully, but these errors were encountered: