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 相关文章推荐
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
Dec 14 Javascript
jquery $("#variable") 循环改变variable的值示例
Feb 23 Javascript
js实现延迟加载的方法
Jun 24 Javascript
JavaScript定时器和优化的取消定时器方法
Jul 03 Javascript
Javascript技术栈中的四种依赖注入详解
Feb 23 Javascript
ES6入门教程之Class和Module详解
May 17 Javascript
js Date()日期函数浏览器兼容问题解决方法
Sep 12 Javascript
基于JavaScript实现五子棋游戏
Aug 26 Javascript
JS 实现百度搜索功能
Feb 01 Javascript
微信小程序模板template简单用法示例
Dec 04 Javascript
layui table复选框禁止某几条勾选的实例
Sep 20 Javascript
Vue项目打包编译优化方案
Sep 16 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数组编码转换示例详解
2014/03/11 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
thinkphp分页集成实例
2017/07/24 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
js版本A*寻路算法
2006/12/22 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
js中的数组Array定义与sort方法使用示例
2013/08/29 Javascript
纯js实现遮罩层效果原理分析
2014/05/27 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
2016/01/26 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
element-ui 关于获取select 的label值方法
2018/08/24 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
[03:03]2014DOTA2国际邀请赛 EG战队专访
2014/07/12 DOTA
[01:01:18]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#2COL VS LGD
2016/03/03 DOTA
六个窍门助你提高Python运行效率
2015/06/09 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
python读取并定位excel数据坐标系详解
2019/06/26 Python
python 字符串格式化的示例
2020/09/21 Python
CSS3弹性盒模型开发笔记(二)
2016/04/26 HTML / CSS
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
如何强制垃圾回收
2015/10/06 面试题
西部世纪面试题
2014/12/05 面试题
Hibernate持久层技术
2013/12/16 面试题
大学生职业生涯规划书模板
2014/01/18 职场文书
委托书的格式
2014/08/01 职场文书
法人授权委托书
2014/09/16 职场文书
老兵退伍标语
2014/10/07 职场文书
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL