HTML页面呈现与优化详析
页面呈现主要由以下几个阶段组成,具体阐述如下:
字节→字符→标记→节点→对象模型
CSS树构建与DOM树构建过程大致相同,具体如下
CSS树产生的缘由
由于CSS中存在父子关系,即CSS中的继承特性,如font-size等样式会由子元素继承自父级,因此会生成与DOM树相对应的CSS树。
由上述页面呈现的介绍可知,重排指的是重新布局页面结构,计算节点位置,而重绘则是绘制页面,仅涉及一些样式如背景、颜色等变化,无需重新计算位置布局,因此重排必然导致重绘,但重绘不一定导致重排。
导致页面重排的主要因素有以下几点
上文中共触发了四次重排,通过上文介绍,offsetTop、scrollTop、clientTop等属性的修改会触发重排,当浏览器获取DOM样式时立刻会执行一次重排,因为需要计算浏览器位置坐标,不会再继续观察下文是否还有DOM操作,下文将介绍浏览器渲染机制。
这种情况看似会触发四次重排,但实际上只会触发一次重排,现代浏览器基本都有渲染机制,浏览器会批量将样式修改一次性执行,批量修改后再批量获取DOM位置,实际只触发一次。
等同于
通过上文,容易理解这种情况会触发两次重排,可以使用缓存(实际是分离读写)来优化。
这种情况会触发五次重排
避免设置大量的style属性,因为通过设置style属性改变节点样式的话,每一次设置都会触发一次reflow,所以最好是使用class属性实现元素的动画,设置position属性,最好是设为absolute或fixed,脱离文档流,这样不会影响其他元素的布局。
事件委托原理:利用事件冒泡的特性,子元素都会冒泡到父元素上,当子元素如(li)元素都绑定事件时,可以只需绑定父元素(ul)来达到相同的效果,这样不仅减少了对DOM的操作,减少重排或重绘,而且不用分配大量变量来保存DOM,减少了内存。
委托
不要使用table布局,因为table中某个元素一旦触发了reflow,那么整个table的元素都会触发reflow。那么在不得已使用table的场合,可以设置table-layout:auto;或者是table-layout:fixed这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围。
不要逐个修改属性,应通过一个class来修改
改为
参考文献
HTML如何提升加载效率
您提到的加载效率,我理解为页面的加载速度。要想提高页面的加载速度,主要可以从以下三个方面入手:
首先,减少页面的HTTP请求,页面上的图片文件、CSS文件、JS文件等,每加载一个这样的文件,浏览器就要向服务器发送一次请求,服务器同时也要处理请求,如果能够将HTTP请求数量减少,就能够加快页面的处理速度,具体做法就是合并CSS、JS文件,利用sprite技术合并一些小图标的图片文件等;
其次,减小页面的文件体积。页面体积减小,花费的传输时间自然也相应减少,页面加载就快了。最主要的还是图片文件,图片一定要压缩过,分辨率按照普通网页显示的要求即可。还有CSS、JS等一类文本文件也可以用一些软件进行压缩。服务端可以用gzip模块进行压缩传输。
最后,优化页面相关的HTML、CSS、JS代码,主要还是JS代码,这样能够加速浏览器的渲染速度,也能起到加快页面加载的作用。关于JS代码的优化,涉及的东西很多,有空可以多了解了解。