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 相关文章推荐
javascript的onchange事件与jQuery的change()方法比较
Sep 28 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
Jun 19 Javascript
网页整体变灰白色(兼容各浏览器)实例
Apr 21 Javascript
textarea 控制输入字符字节数(示例代码)
Dec 27 Javascript
js获取url中"?"后面的字串方法
May 15 Javascript
jQuery中:reset选择器用法实例
Jan 04 Javascript
7个去伪存真的JavaScript面试题
Jan 07 Javascript
jQuery树插件zTree使用方法详解
May 02 jQuery
详谈javascript精度问题与调整
Jul 08 Javascript
分析JS单线程异步io回调的特性
Dec 01 Javascript
在Swiper内如何制作CSS3动画效果示例代码
Dec 07 Javascript
vux uploader 图片上传组件的安装使用方法
May 15 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的慢速日志引起的Mysql错误问题分析
2014/05/13 PHP
php内存缓存实现方法
2015/01/24 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
学习ExtJS TextField常用方法
2009/10/07 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
js判断undefined类型示例代码
2014/02/10 Javascript
输入框过滤非数字的js代码
2014/09/18 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
Vue.js项目部署到服务器的详细步骤
2017/07/17 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
python制作小说爬虫实录
2017/08/14 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
python中wheel的用法整理
2020/06/15 Python
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
蛋白质世界:Protein World
2017/11/23 全球购物
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
汽车销售求职自荐信
2013/10/01 职场文书
工艺工程师工作职责
2013/11/23 职场文书
党员带头倡议书
2015/04/29 职场文书
庭外和解协议书
2016/03/23 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
使用feign服务调用添加Header参数
2021/06/23 Java/Android
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS