第一部分:shell外壳:菜单,工具栏等;
第二部分:内核
浏览器的组件:
渲染引擎:
基本主流程:
请求html ->解析html--加载外部样式及外部脚本-> 构建DOM树->构建render树(dom+cssom树)->绘制render树;
(外部样式会阻塞内部脚本的执行。
外部样式与外部脚本并行加载,但外部样式会阻塞外部脚本执行。)
不同的内核渲染的流程不一样,webkit:
编译流程:
源码->解析->解析树->转换->机器码
解析原理:
转换成一定意义的结构:编码可以理解和使用的东西。
解析的结果通常是表达文档结构的节点树,解析书或语法树。
解析两个子过程:
解析树=词法解析+语法解析+…的过程。
转换:把解析书转换为机器码;
那么,html解析原理:
特殊性:
html解析算法两个阶段:
第一:符号化;
第二:构件树;
css解析:selector: p p-txt , declaration: 3px margn…
脚本解析<script>:
所以render树渲染后再调<script>,放在htmlz最后;
预解析:
渲染树的构建(rendertree):渲染对象RenderObject ;
渲染树和dom树的关系:
具体详情:
css优先顺序,从低到高有:
1. 浏览器默认样式
2. 用户个性化浏览器设置
3. HTML开发者定义的一般样式
4. HTML开发者定义的!important样式
5. 用户个性化浏览器设置!important样式
渲染对象和对应的DOM节点也可能不在相同的位置。例如,浮动和绝对定位的元素在文本流之外。
共享样式;
进化匹配过程;
以正确的级联顺序;
逐步处理。
布局layout
当渲染对象被创建并添加到树中,他们斌更没有位置和大小,计算这些值得过程称为layout或reflow。每一个渲染对象都有一个layout或reflow方法,出发布局时调用。
layout过程:
Dirty bit系统:一个渲染对象发生变化时就标记它和它的children为dirty,表示需要layout。目的:不因每个小变化就全部重新布局。
绘制painting
遍历渲染树并调用渲染对象的pain方法将他们的内容显示到屏幕上;
绘制顺序:
一个块渲染对象的堆栈顺序为:
动态变化:浏览器总是试着以最小的动作响应一个变化,所以就存在有些属性只改变单个渲染对象就:字体、颜色、等;但也有些属性修改会导致大面积的重绘:位置。
线程和事件:
浏览器是多线程的,渲染引擎和js是单线程的。其中渲染引擎则是浏览器的主线程;
浏览器的主线程是一个事件循环,他被设计为无限循环以保持执行过程的可用:等待时间并执行他们。
浏览器执行的是多线程,js引擎解释器的执行时单线程。所以说浏览器是单线程的说法不对。