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 相关文章推荐
xml 与javascript结合的问题解决方法
Mar 24 Javascript
javascript 写类方式之一
Jul 05 Javascript
通过百度地图获取公交线路的站点坐标的js代码
May 11 Javascript
js限制文本框只能输入数字(正则表达式)
Jul 15 Javascript
jquery获取元素索引值index()示例
Feb 13 Javascript
javascript中获取class的简单实现
Jul 12 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
Sep 05 Javascript
详解vuex的简单使用
Mar 12 Javascript
详解PHP后期静态绑定分析与应用
Mar 21 Javascript
使用FileReader API创建Vue文件阅读器组件
Apr 03 Javascript
jQuery使用动画队列自定义动画操作示例
Jun 16 jQuery
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
Jun 19 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
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
PDO::rollBack讲解
2019/01/29 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
jQuery中first()方法用法实例
2015/01/06 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
python查看FTP是否能连接成功的方法
2015/07/30 Python
python安装与使用redis的方法
2016/04/19 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
2017/11/08 Python
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
详解python中的Turtle函数库
2018/11/19 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
pytorch 预训练层的使用方法
2019/08/20 Python
python绘制雪景图
2019/12/16 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
购买大码女装:Lane Bryant
2016/09/07 全球购物
2014工程部年度工作总结
2014/12/17 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
六五普法心得体会2016
2016/01/21 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL