网页性能管理是一个很大的话题,最近在复习相关的知识,小结一下。css
网页生成的过程大体以下:html
HTML
代码转化成DOM
CSS
代码转化成CSSOM
(CSS Object Model
)DOM
和CSSOM
,生成一棵渲染树(包含每一个节点的视觉信息)layout
),即将全部渲染树的全部节点进行平面合成paint
)在屏幕上DOM
树的解析和渲染由上面的过程咱们能够看出,在渲染以前,
CSSOM
和DOM
已经生成。web
css
的加载不会阻塞DOM
树解析,可是会阻塞DOM
树渲染。要在样式加载好了以后,才开始渲染页面。这是合理的。JS
执行会阻塞DOM
树的解析和渲染。当引用了JS
的时候,浏览器发送1个JS request
就会一直等待该request
的返回。由于浏览器须要1个稳定的DOM
树结构,而JS
中颇有可能有代码直接改变了DOM
树结构,好比使用 document.write
或 appendChild
,甚至是直接使用的location.href
进行跳转,浏览器为了防止出现JS
修改DOM
树,须要从新构建DOM
树的状况,因此,JS
执行会阻塞DOM
树的解析和渲染。这两个规则的实质都是提升页面的性能,避免发生没必要要的从新渲染。浏览器
重排和重绘会不断触发,这是不可避免的。可是,它们很是耗费资源,是致使网页性能低下的根本缘由。缓存
从新渲染,就须要从新生成布局和从新绘制。前者叫作"重排"(reflow),后者叫作"重绘"(repaint)须要注意的是,"重绘"不必定须要"重排",好比改变某个网页元素的颜色,就只会触发"重绘",不会触发"重排",由于布局没有改变。可是,"重排"必然致使"重绘",好比改变一个网页元素的位置,就会同时触发"重排"和"重绘",由于布局改变了性能优化
DOM
的多个读操做(或多个写操做),应该放在一块儿。不要两个读操做之间,加入一个写操做。class
,或者csstext
属性,一次性地改变样式。display: none
(须要1次重排和重绘),而后对这个节点进行100次操做,最后再恢复显示(须要1次重排和重绘)。这样一来,你就用两次从新渲染,取代了可能高达100次的从新渲染。position
属性为absolute
或fixed
的元素,重排的开销会比较小,由于不用考虑它对其余元素的影响。display
属性为可见,由于不可见的元素不影响重排和重绘。另外,visibility : hidden
的元素只对重绘有影响,不影响重排.offsetTop
、offsetLeft
、offsetWidth
、offsetHeight
、scrollTop
、scrollLeft
、scrollWidth
、scrollHeight
、clientTop
、clientLeft
、clientWidth
、clientHeight
、getComputedStyle()
(currentStyle in IE)。因此,在屡次使用这些值时应进行缓存。参看文献app