每周前端知识整理(15.09.13)
来源:互联网 发布:大班美工漂亮的烟花 编辑:程序博客网 时间:2024/05/16 17:18
接上篇博客,其实应该早就写完了。。但是犯懒了,但是还是要补上。
浏览器是智能的(2)
浏览器会把DOM操作放到一个队列中,并且按照顺序去一批批的执行
让我们再看一段代码
var foo = document.getElementById(‘foobar’);foo.style.color = ‘blue’;var margin = parseInt(foo.style.marginTop);foo.style.marginTop = (margin + 10) + ‘px’;上述的代码会触发几次重布局和重绘呢?可以和上周总结最后的代码对比来看
触发了几次呢?
上述代码中,我们修改了元素的color属性,这个操作会被放入操作队列中等待执行,下一句代码,我们访问了这个元素的另一个属性(marginTop)。此时,为了能够给出这个值(marginTop),浏览器会执行之前的操作队列。
所以说,如果我们代码按照上面的方式写的话,相当于过早的强制出发了一次页面的重绘
浏览器是如何工作的
当我们修改一个DOM的时候,这个元素就会被标记为脏元素,有时,这个脏元素也会有子元素标记为脏元素。也就是说,只要有一个子节点也是需要重布局的。
一旦时间到达了浏览器的刷新时间点,所有之前标记的脏元素就都会被重布局、重绘。
如果一个元素被标记成了脏元素,我们紧接着对他进行访问的话,会导致浏览器提前进行刷新,也就是提前进行重布局和重绘,就像上文的代码一样。
强制同步布局和布局废弃
在脚本中大量的交替读取和写入DOMui导致布局废弃的问题
那么如何避免这个问题呢?
- 把读取的命令和写入的命令分别分组
- Cache computed styles 没太懂怎么翻译
- 不要依次修改样式,直接修改class
- 在DOM外操作元素———使用document fragments能够实现
- 把动态元素的position设置成absolute或fixed
- 在必要的时候才显示相应的严肃
- 使用window.requestAnimationFrame()
- 使用虚拟DOM的类库(react?)
requestAnimationFrame
window.requestAnimationFrame()这个方法允许我们在下一次重布局中执行我们需要的代码。
这是一个非常有用的方法,通过它我们可以在一次重布局中同时执行读取和写入的操作。
普通写法:
function doubleHeight(element) {var currentHeight = element.clientHeight;element.style.height = (currentHeight * 2) + ‘px’;}all_my_elements.forEach(doubleHeight);
requestAnimationFrame写法
function doubleHeight(element) {var currentHeight = element.clientHeight;window.requestAnimationFrame(function () {element.style.height = (currentHeight * 2) + ‘px’;});}all_my_elements.forEach(doubleHeight);
下面是兼容性情况:
还有一个被开发者广泛使用的方法,能实现和requestAnimationFrame近似的效果
window.setTimeout(function () {...}, 0);设置时间参数为0的话通常能够在下一次重布局中执行相应的代码
虚拟 DOM 类库
虚拟DOM类库是近来越来越火的一个概念,这都要归功于Facebook的React那么它是如何工作的呢?
当开发者要对一个虚拟DOM执行操作的时候,接下来:
- 合并操作
- apply some heuristics 目前还不太了解react原理,翻译不上来
- 缓存数值
- 在合适的时机执行操作
完
0 0
- 每周前端知识整理(15.09.13)
- 每周前端知识整理(15.09.06)
- 每周前端知识整理(15.07.05)
- 每周前端知识整理(15.07.12)
- 每周前端知识整理(15.07.19)
- 每周前端知识整理(15.07.26)
- 每周前端知识整理(15.08.02)
- 每周前端知识整理(15.08.09)
- 每周前端知识整理(15.08.16)
- 每周前端知识整理(15.08.23)
- 每周前端知识整理(15.08.30)
- 每周前端知识整理(15.10.11)
- 每周前端知识整理(15.10.18)
- 每周前端知识整理(15.10.25)
- 工作知识盲点(每周整理)
- 前端知识整理
- 前端面试知识整理
- 前端知识整理
- 【线性代数公开课MIT Linear Algebra】 第三课 矩阵乘法和矩阵的逆
- 菜鸟路之hibernate
- Java的反射机制
- 零基础学python-18.10 函数式编程工具:filter和reduce
- 微信支付功能的实现过程
- 每周前端知识整理(15.09.13)
- C++ 单链表快速排序
- 前端开发常用组建
- Ubuntu下的8款流行的画图应用
- 数据流
- Eclipse开发Android应用时遇到的问题以及解决方法
- Linux命令(4):fg与bg命令
- 2015-09-21
- 反思-工作总结(20150706-0921)