1.CSS和JS在网页中的放置顺序是怎样的?
- css的放置位置是在head中,这是由于浏览器的渲染过程决定的,这样可以防止在IE中出现白屏。
- js的放置位置一般是在body的闭合标签之前,因为js一般会涉及到一些DOM操作,所以要等全部的dom元素都加载完再加载js。还有一个原因是相对于页面中的图片或css来说js是阻塞的,css和图片是可以同步加载的,但是js要执行完之后才能加载后面的内容,如果把js放在前面可能会造成白屏的现象。
2.解释白屏和FOUC
- 白屏,其实是因为浏览器在渲染的时候请求时间过长导致的,比如Chrome的渲染流程大致是HTML-->Dom-->Css-->Cssom-->Render Tree-->进行计算-->painting最终才是我们看到的网页界面,但是如果你是在一些国外的网站,或者被墙的地方进行反问,浏览器就回一直现实它的加载动作而没有最终页面,也就网页响应时间过长而导致的白屏,另一种情况就是当我门使用@import(),属性的时候也可能导致浏览器渲染不及时,又或者我们把标签放在了body的底部位置,都可能导致不及时的现象.
- FOUC,其实是FireFox的渲染逻辑和Chrome的不太一样,一开始Chrome是等待渲染树和位置计算好才会出来网页的内容,但到了FireFox每加载一次dom树就会重绘一次网页样式,一直到所有内容完成为止,所以一般我们用link把css放在header内
3.async和defer的作用是什么?有什么区别
- 没有defer或async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该script标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。
- 区别:
async:加载和渲染后续文档元素的过程将和 该script的加载与执行并行进行(异步)
defer:加载后续文档元素的过程将和 该script的加载并行进行(异步),但该script的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。
4.简述网页的渲染机制
不同核心的浏览器虽然渲染机制稍有不同,但大体上相同。以webkit核心为例:
- 解析HTML标签,构建DOM树;
- 解析CSS标签,构建CSSOM树;
- 把DOM和CSSOM树组合成渲染树;
- 在渲染树的基础上进行布局、计算每个节点的几何结构;
- 把每个节点绘制到屏幕上。