js防止DIV布局滚动时闪动的解决方法


Posted in Javascript onOctober 30, 2014

本文实例讲述了js防止DIV布局滚动时闪动的方法,分享给大家供大家参考。具体方法如下:

最近接触页面性能的东西,有很多细微又原始的内容,比如浏览器渲染。资料非常多,所以选一些做节译,备忘。
JavaScript多次写、读DOM就会发生「布局颠簸」,引起文档重排(reflow ? the process of constructing a render tree

from a DOM tree1)。

// 读

var h1 = element1.clientHeight;

// 写 (布局作废)

element1.style.height = (h1 * 2) + 'px';

// 读 (触发布局)

var h2 = element2.clientHeight;

// 写 (布局作废)

element2.style.height = (h2 * 2) + 'px';

// 读 (触发布局)

var h3 = element3.clientHeight;

// 写 (布局作废)

element3.style.height = (h3 * 2) + 'px';

DOM被写时,布局就作废了,需要在某个时间点重排。但浏览器很懒,它想等到当前操作(或说帧)结束前再来重排。
不过,如果我们在当前操作(或说帧)结束前从DOM中读取几何数值,那么我们就强制浏览器提前重排布局,这就是所谓的「强制同步布局」(forced synchonous layout),它会要了性能的命。
在现代的桌面浏览器上,布局颠簸的副作用可能并不明显;但放到低端移动设备上,问题就很严重了。

快速解决办法

在一个理想世界里,我们只要简单地重新排列代码执行顺序,就可以批量读DOM、批量写DOM。这意味着,文档只需一次重排。

// 读

var h1 = element1.clientHeight;

var h2 = element2.clientHeight;

var h3 = element3.clientHeight;

// 写 (布局作废)

element1.style.height = (h1 * 2) + 'px';

element2.style.height = (h2 * 2) + 'px';

element3.style.height = (h3 * 2) + 'px';

// 文档在帧末重排

现实世界又如何?

现实中可就没那么简单。大型程序中,代码散播各处,个个都存在这类危险的DOM。我们没法轻松(显然也不应该)把我们漂亮的、解藕的代码揉合一块,就只是为了控制住执行顺序。那么为了优化性能,我们怎样把读和写做批量处理?

来认识requestAnimationFrame

window.requestAnimationFrame安排一个函数在下一帧执行,类似于setTimout(fn, 0)。这非常有用,因为我们可以用它来排定所有的DOM写操作在下一帧一同执行,DOM读操作就按现在的顺序同步执行。

// 读

var h1 = element1.clientHeight;

// 写

requestAnimationFrame(function() {

  element1.style.height = (h1 * 2) + 'px';

});

// 读

var h2 = element2.clientHeight;

// 写

requestAnimationFrame(function() {

  element2.style.height = (h2 * 2) + 'px';

});

……

希望本文所述对大家基于javascript的web程序设计有所帮助。

Javascript 相关文章推荐
Extjs学习笔记之八 继承和事件基础
Jan 08 Javascript
JavaScript的单例模式 (singleton in Javascript)
Jun 11 Javascript
jQuery.fn和jQuery.prototype区别介绍
Oct 05 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
Dec 14 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
Apr 16 Javascript
javascript的replace方法结合正则使用实例总结
Jun 16 Javascript
Bootstrap基本组件学习笔记之列表组(11)
Dec 07 Javascript
js实现产品缩略图效果
Mar 10 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
Jul 12 Javascript
微信小程序实现自上而下字幕滚动
Jul 14 Javascript
Angular封装表单控件及思想总结
Dec 11 Javascript
vue中对象数组去重的实现
Feb 06 Javascript
js实现window.open不被拦截的解决方法汇总
Oct 30 #Javascript
一个JavaScript获取元素当前高度的实例
Oct 29 #Javascript
JS 实现列表与多选框选择附预览动画
Oct 29 #Javascript
一个JavaScript操作元素定位元素的实例
Oct 29 #Javascript
js实现ArrayList功能附实例代码
Oct 29 #Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
Oct 29 #Javascript
js中的json对象详细介绍
Oct 29 #Javascript
You might like
php foreach、while性能比较
2009/10/15 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
2015/03/26 PHP
php 浮点数比较方法详解
2017/05/05 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
PHP迭代器和迭代的实现与使用方法分析
2018/04/19 PHP
基于jquery.Jcrop的头像编辑器
2010/03/01 Javascript
javascript 数组学习资料收集
2010/04/11 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
javascript实现别踩白块儿小游戏程序
2015/11/22 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python数组条件过滤filter函数使用示例
2014/07/22 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
python实现登录与注册系统
2020/11/30 Python
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
Yahoo的PHP面试题
2014/05/26 面试题
家长给小学生的评语
2014/01/30 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
导游词之平津战役纪念馆
2019/11/04 职场文书
带你了解Java中的ForkJoin
2022/04/28 Java/Android