用户界面- 包括地址栏
、后退/前进
按钮、书签目录
等,也就是除了用来显示所请求页面的主窗口以外的其余部分css
浏览器引擎- 用来查询及操做渲染引擎的接口html
渲染引擎(浏览器内核)- 用来显示请求的内容,例如,若是请求内容为html,它负责解析html及css
,并将解析后的结果显示出来node
网络- 用来完成网络调用,例如http请求,它具备平台无关的接口,能够在不一样平台上工做css3
UI 后端- 用来绘制相似组合选择框及对话框等基本组件,具备不特定于某个平台的通用接口,底层使用操做系统的用户接口web
JS解释器- 用来解释执行JS代码面试
数据存储- 属于持久层,浏览器须要在硬盘中保存相似cookie的各类数据,HTML5定义了Storage技术,这是一种轻量级完整的客户端存储技术编程
浏览器的渲染引擎也叫排版引擎,或者是浏览器内核windows
主流的 渲染引擎 有后端
渲染引擎解析的基本流程:浏览器
1. 解析HTML构建Dom树,DOM 是W3C组织推荐的处理可扩展置标语言的标准编程接口。 2. 构建渲染树,渲染树并不等同于Dom树,由于像`head`标签 或 `display: none`这样的元素就没在渲染树中了,可是它们在Dom树中。 3. 对渲染树进行布局,定位坐标和大小、肯定是否换行、肯定position、overflow、z-index等等,这个过程叫`layout` 或 `reflow`。 4. 绘制渲染树,调用操做系统底层API(UI Backend)进行绘图操做。
webkit内核工做流程
gecko内核工做流程
回流(reflow)与重绘(repaint),在性能优化的时候十分重要,面试也常常被说起。
回流(reflow)
:当渲染树(render tree)中一部分(或所有)元素的规模尺寸,布局,隐藏等改变而须要从新构建。
重绘(repaint)
:当渲染树(render tree)中的一些元素须要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,好比background-color。
小结: 影响布局的操做会发生回流;不影响布局而只是修改颜色等属性则发生重绘;
每一个页面至少须要一次回流+重绘
回流必将引发重绘
一、添加或者删除可见的DOM元素;
二、元素位置改变;
三、元素尺寸改变——边距、填充、边框、宽度和高度
四、内容改变——好比文本改变或者图片大小改变而引发的计算值宽度和高度改变;
五、页面渲染初始化;
六、浏览器窗口尺寸改变——resize事件发生时;
【重排和重绘案例.html】
var s = document.body.style; s.padding = "2px"; // 回流+重绘 s.border = "1px solid red"; // 再一次 回流+重绘 s.color = "blue"; // 再一次重绘 s.backgroundColor = "#ccc"; // 再一次 重绘 s.fontSize = "14px"; // 再一次 回流+重绘 // 添加node,再一次 回流+重绘 document.body.appendChild(document.createTextNode('abc!'));
原理:尽可能减小重绘与回流的次数
直接使用className修改样式,少用style设置样式.
div.classList.add('test'); //一次重排 重绘
把要频繁操做的元素从渲染树中去除;好比使用display:none;
div.style.display = 'none';//第一次 重排 重绘 div.style.width = 200px; div.style.heigt= 200px; div.style.color = 'red'; div.style.margin = 20px; div.style.display = 'block';//第二次 重排 重绘 这里总共发生两次重绘和重排
布局常常改变的盒子进行定位脱标, 好比动画 先定位 ,建议使用css3动画和变换 transform
使用DocumentFragment(虚拟dom
)进行缓存操做,引起一次回流和重绘
var pNode,fragment = document.createDocumentFragment(); //动态建立20个p标签,先用DocumentFragment 对象来缓存 for(var i=0; i<20; i++){ pNode = document.createElement('p'); pNode.innerHTML = i; fragment.appendChild(pNode); } document.body.appendChild(fragment);