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 相关文章推荐
用jquery统计子菜单的条数示例代码
Oct 18 Javascript
点击显示指定元素隐藏其他同辈元素的方法
Feb 19 Javascript
jQuery中:button选择器用法实例
Jan 04 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
Apr 30 Javascript
javascript伸缩菜单栏实现代码分享
Nov 12 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
Sep 17 Javascript
javascript实现无法关闭的弹框
Nov 27 Javascript
Web前端框架bootstrap实战【第一次接触使用】
Dec 28 Javascript
Javascript 实现全屏滚动实例代码
Dec 31 Javascript
Node.js数据库操作之连接MySQL数据库(一)
Mar 04 Javascript
原生js实现仿window10系统日历效果的实例
Oct 31 Javascript
vue实现日历表格(element-ui)
Sep 24 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
CI框架在CLI下执行占用内存过大问题的解决方法
2014/06/17 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
javascript innerText和innerHtml应用
2010/01/28 Javascript
jquery 插件学习(五)
2012/08/06 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
2015/08/01 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
View.post() 不靠谱的地方你知道多少
2017/08/29 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python创建进程fork用法
2015/06/04 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
Python之批量创建文件的实例讲解
2018/05/10 Python
python列表list保留顺序去重的实例
2018/12/14 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
python获取整个网页源码的方法
2020/08/03 Python
python 6行代码制作月历生成器
2020/09/18 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
J2EE包括哪些技术
2016/11/25 面试题
办公室前台岗位职责
2014/01/04 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
求职自我评价怎么写
2015/03/09 职场文书
在js中修改html body的样式
2021/11/11 Javascript
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL