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 相关文章推荐
document节点对象的获取方式示例介绍
Dec 24 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
Jan 02 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
Dec 03 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
Dec 13 Javascript
Vue filters过滤器的使用方法
Jul 14 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
Dec 07 Javascript
vue-cli项目中使用Mockjs详解
May 14 Javascript
JavaScript继承的特性与实践应用深入详解
Dec 30 Javascript
elementUI select组件默认选中效果实现的方法
Mar 25 Javascript
vue项目开启Gzip压缩和性能优化操作
Oct 26 Javascript
JavaScript实现HTML导航栏下拉菜单
Nov 25 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
Jan 06 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 编写的日历
2006/10/09 PHP
PHP中include()与require()的区别说明
2010/03/10 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
java script编程起步(第三课)
2007/01/10 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
js实现大转盘抽奖游戏实例
2015/06/24 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
基于python中pygame模块的Linux下安装过程(详解)
2017/11/09 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
python可视化实现KNN算法
2019/10/16 Python
python标准库OS模块详解
2020/03/10 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
python中wheel的用法整理
2020/06/15 Python
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
DBA的职责都有哪些
2012/05/16 面试题
党校培训自我鉴定
2014/02/01 职场文书
浪费资源的建议书
2014/03/12 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
安全宣传标语口号
2014/06/06 职场文书
学校节水倡议书
2015/04/29 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
项目中Nginx多级代理是如何获取客户端的真实IP地址
2022/05/30 Servers
Spring boot实现上传文件到本地服务器
2022/08/14 Java/Android