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新闻滚动插件 jquery.roller.js
Jun 27 Javascript
jquery在IE、FF浏览器的差别详细探讨
Apr 28 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
Jun 05 Javascript
node.js中的fs.fchmodSync方法使用说明
Dec 16 Javascript
jQuery中:radio选择器用法实例
Jan 03 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
Aug 20 Javascript
AngularJS基础 ng-keypress 指令简单示例
Aug 02 Javascript
微信小程序 自定义对话框实例详解
Jan 20 Javascript
xmlplus组件设计系列之图标(ICON)(1)
May 05 Javascript
vue v-for 使用问题整理小结
Aug 04 Javascript
jQuery实现鼠标拖拽登录框移动效果
Sep 13 jQuery
vue组件是如何解析及渲染的?
Jan 13 Vue.js
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在Web开发领域的优势
2006/10/09 PHP
php设置session值和cookies的学习示例
2014/03/21 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
json简单介绍
2008/06/10 Javascript
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
使用console进行性能测试
2015/04/27 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
面试常见的js算法题
2017/03/23 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
Python的迭代器和生成器
2015/07/29 Python
Python 12306抢火车票脚本
2018/02/07 Python
python数据封装json格式数据
2018/03/04 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
Python&&GDAL实现NDVI的计算方式
2020/01/09 Python
Pytorch maxpool的ceil_mode用法
2020/02/18 Python
python 实现单例模式的5种方法
2020/09/23 Python
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
会计岗位职责范本
2014/03/07 职场文书
演讲稿格式范文
2014/05/19 职场文书
表扬稿格式范文
2015/01/16 职场文书
撤诉申请怎么写
2015/05/19 职场文书