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将数组插入到另一个数组中的代码
Jan 10 Javascript
JavaScript 实现类的多种方法实例
May 01 Javascript
jQuery中click事件用法实例
Dec 26 Javascript
JavaScript实现N皇后问题算法谜题解答
Dec 29 Javascript
AngualrJS中的Directive制作一个菜单
Jan 26 Javascript
常用原生js自定义函数总结
Nov 20 Javascript
为什么我们要做三份 Webpack 配置文件
Sep 18 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
Oct 27 Javascript
Element Table的row-class-name无效与动态高亮显示选中行背景色
Nov 30 Javascript
详解微信小程序文件下载--视频和图片
Apr 24 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
Dec 09 Javascript
基于vue-draggable 实现三级拖动排序效果
Jan 10 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下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
JS脚本实现动态给标签控件添加事件的方法
2016/06/02 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
D3.js实现简洁实用的动态仪表盘的示例
2018/04/04 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
Python yield 小结和实例
2014/04/25 Python
详细解析Python中的变量的数据类型
2015/05/13 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
python交易记录链的实现过程详解
2019/07/03 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
Python如何获取文件指定行的内容
2020/05/27 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
马来西亚在线药房:RoyalePharma
2019/12/01 全球购物
经典大学生求职信范文
2014/01/06 职场文书
草船借箭教学反思
2014/02/03 职场文书
工作求职信
2014/07/04 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
食堂管理制度范本
2015/08/04 职场文书
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL