页面渲染主要经过过程,具体介绍如下:
字节 → 字符 → 令牌 → 节点 → 对象模型
CSS树的生成和DOM树的生成基本是相同,如下
为什么会有CSS树
因为CSS关系也会有父子关系,就是css中常说的继承,一些样式如font-size等子元素会继承父级,所以会生成一套对应的CSS树和DOM树相对应。
通过上面的页面渲染介绍,很容易理解,重排就是重新布局页面结构,计算节点位置,而重绘就是绘制页面,只是一些样式如背景,颜色的变化等,不需要重新计算位置布局,所以 重排一定会导致重绘,但是重绘不一定导致重排。
导致页面重排主要有以下几点
上文中触发了四次重排,通过上文介绍,offsetTop,scrollTop,clientTop等属性的修改会触发重排,当浏览器获取DOM样式的时候立刻会执行一次重排,因为需要计算浏览器位置坐标,不会再继续观察下文是否还有DOM的 *** 作,下文介绍浏览器渲染机制。
这种情况看似会触发四次重排,实际只会触发一次重排,现代浏览器基本都有渲染机制,浏览器会批量将样式修改一次性执行,批量修改完后再批量获取DOM位置,实际只触发一次。
等价于
通过上文,容易理解这种情况会触发两次重排,可以使用缓存(实际是分离读写)来优化。
这种情况会触发五次重排
避免设置大量的style属性,因为通过设置style属性改变结点样式的话,每一次设置都会触发一次reflow,所以最好是使用class属性实现元素的动画,设置position属性,最好是设为absoulte或fixed,脱离文档流,这样不会影响其他元素的布局。
事件委托原理:利用事件冒泡的特性,子元素都会冒泡到父元素上,当子元素如(li)元素都绑定事件时,可以只需绑定父元素(ul)来达到相同的效果,这样不仅减少了对dom的 *** 作,减少重排或重绘,而且不用分配大量变量来保存dom,减少了内存。
委托
不要使用table布局,因为table中某个元素一旦触发了reflow,那么整个table的元素都会触发reflow。那么在不得已使用table的场合,可以设置table-layout:auto或者是table-layout:fixed这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围。
不要一个个修改属性,应通过一个class来修改
改为
参考文献
https://blog.csdn.net/b954960630/article/details/82317999
在我们项目中会使用freemark 生成 html,然后用 html 转 pdf。那么美化是必不可少的程序。
可以在style中设置如下属性修改页面大小。可以通过size 设置任意大小的page(不能是百分比),也可以设置标准的页面大小,如 a4, a5, a3, b3, b4, letter, legal,ledger
理论上来说,可以在一个文档中设置不同的页面尺寸。但这个解析器仅仅取第一页的page 的宽度作为 html 中body 的宽度,所以实际上,宽度只能设置一个,高度可以是设置多个。
可以在 @page 属性中设置的当前页的页边距,内边距、背景颜色等。和一般的 html 设置类似。
不过当我这里设置所有边框都为0 时候发现生成的pdf 仍然有边界。其实那是 body 的边距。可以通过下面的方法设置
和页面大小设置相似,这样所有的边距都就没了。这是一个需要注意的地方
这里就不多说了,看我另一篇文章即可。 分页优化
清除HTML页面冗余的注释和重复的空白符。阿里云CDN提供了页面优化功能,当开启页面优化功能时,CDN可以自动清除HTML页面冗余的注释和重复的空白符,缩小文件体积,提升页面可阅读性。
CDN是阿里云飞天生态系统基于阿里巴巴优质网络基础设施向用户提供的互联网内容投递服务,提供低成本、高性能、可扩展的CDN服务将海量内容高效的投递给互联网终端消费用户。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)