浏览器的渲染机制以及JS运行机制

2019-02-05  本文已影响0人  翔阿翔阿翔

渲染机制

DOCTYPE的作用

DOCTYPE类型

浏览器渲染过程

DOC渲染过程

所以浏览器的渲染过程主要包括以下几步:

渲染阻塞

当浏览器遇到一个 script 标记时,DOM 构建将暂停,直至脚本完成执行,然后继续构建DOM。每次去执行JavaScript脚本都会严重地阻塞DOM树的构建,如果JavaScript脚本还操作了CSSOM,而正好这个CSSOM还没有下载和构建,浏览器甚至会延迟脚本执行和构建DOM,直至完成其CSSOM的下载和构建。

所以,script 标签的位置很重要。实际使用时,可以遵循下面两个原则:

重排reflow

定义

DOM结构中的每个元素都有自己的盒模型,这些都需要浏览器根据各种样式来计算并根据结果将元素放到它该出现的位置,这个过程叫做reflow

触发reflow

重绘repaint

定义

当各种盒子的位置、大小以及其他属性改动,例如字体大小颜色等都确定下来以后,浏览器就把这个元素按照各自的特性绘制了一遍,于是页面内容就出现了,这个过程叫做repaint

触发repaint

如何尽可能少的进行重绘

将DOM改动或者CSS改动尽可能的一次性改完,不要一次操作分多次进行
例子:

//多次重绘
dom1.style.backgroundColor = 'red'
dom1.style.width= '50px'
dom1.style.height= '50px'
//一次重绘
//CSS
.add{
  backgound-color: red;
  width: 50px;
  heiht: 50px;
}
//JS
dom2.className = 'add'

JS运行机制

JS是单线程的,不可以同时执行多个任务,但是同时也有异步操作。JS会优先执行同步操作,然后同步操作都完成以后再去执行异步操作。

console.log(1)
setTimeout(function() {
  console.log(3)
}, 0)
console.log(2)
//输出顺序为 1 2 3 因为setTimeout是一个异步函数
console.log(1)
setTimeout(function() {
  console.log(2)
}, 0)
while (true) {
  
}
//只输出1然后进入无线循环不输出2

验证了所有同步操作完成之前异步操作是不会被执行的。

Event Loop

for(var i = 0;i < 4;i++) {
  setTimeout(function() {
    console.log(i)
  },1000)
} 
//输出四个4

上面这段代码同时输出4个4.因为在循环的过程中遇到setTimeout会记住这个函数,但是不会去执行他,然后进入下一轮循环,等到循环结束,setTimeout被放入异步队列执行。

异步任务

总结

上一篇 下一篇

猜你喜欢

热点阅读