js阻塞dom的构建 && CSS通过js来阻塞DOM的构建
-
JavaScript脚本由于可能会修改DOM,因此会阻塞DOM的构建,这一点我们都知道;而CSS并不会操作或者改变DOM,因此通常我们认为CSS不会影响DOM的构建,只会影响后续的布局、绘制等过程,即会影响DOM的渲染。但其实CSS可以通过JavaScript来阻塞DOM的构建。
因为JavaScript是可以改变样式的,也就是具有修改CSS规则树的能力,而JavaScript脚本里是否有改变样式的操作,这一点在执行JavaScript之前是不可知的。因此,为保证JavaScript脚本的正确执行,在执行JavaScript之前,CSS规则树必须要先准备好(不然万一有修改CSS的操作呢)。
也就是说,若在构建DOM的中途存在阻塞DOM构建的JavaScript脚本,而此页面中还包含了外部 CSS 文件的引用,那么此时就需要等目前的CSS规则树(基于目前生成完的部分DOM树)构建完毕后,再开始JavaScript脚本的执行,等一切结束了,再继续DOM的构建。 -
UI线程与JS线程是互斥的,因为JS运行结果会影响到UI线程的结果,当JS线程运行的时候,UI线程处于冻结状态。(现在浏览器可能对某些事件做了特殊处理,比如监听了scroll事件,在滚动时还是能够流畅的播放动画)。
DOM与CSS
- 没有js的理想情况下,html与css会并行解析,分别生成DOM与CSSOM