了解浏览器
了解浏览器
一、浏览器的Layout Tree和DOM Tree
- layout布局阶段:主线程通过遍历DOM 和计算好的样式来生成Layout Tree。
- Layout Tree 上的每个结点都记录了x,y坐标和边框尺寸。
- DOM Tree和Layout Tree并不是一一对应的,使用伪类控制的元素不会出现在DOM Tree结点中,只会出现在Layout Tree 结点中。这也是JS无法控制伪类的原因。设置了display:none的元素不会出现在Layout Tree中,只会出现在DOM Tree中。
- Layout Tree和最后显示在屏幕上的结点是一致的
二、浏览器渲染流程
- 主线程,合成线程,栅格线程
- 主线程:DOM,style,layout,paint,layer
- 合成器线程:tiles , frame
- 栅格线程:raster, draw quads
- 重排和重绘
- 布局绘制和JS都是在主线程运行的,当在一的时间内布局和绘制结束后还有剩余时间,JS就可以获得主线程控制权,若JS执行时间过长会导致没有及时归还主线程,主线程无法及时渲染下一帧动画,从而造成页面卡顿。
- 优化动画:
requestAnimationFrame()
,这个方法会在每一帧被调用。把JS运行任务分成更小的任务快,在每一帧的时间用完前暂停JS执行,归还主线程。在下一帧开始时主线程就可以按时执行布局和绘制。 - Transform实现的动画不会经过布局和绘制,而是直接运行在合成器线程和栅格化线程中。
- 优化动画:
三、持续补充中……
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Another Dimension!
评论
ValineDisqus