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 继承详解(一)
Jul 13 Javascript
一个js拖拽的效果类和dom-drag.js浅析
Jul 17 Javascript
jquery select多选框的左右移动 具体实现代码
Jul 03 Javascript
jQuery简单实现图片预加载
Apr 20 Javascript
JavaScript判断对象是否为数组
Dec 22 Javascript
分享我对JS插件开发的一些感想和心得
Feb 04 Javascript
完善的jquery处理机制
Feb 21 Javascript
ES6中class类用法实例浅析
Apr 06 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
Jan 30 Javascript
jQuery实现的简单手风琴效果示例
Aug 29 jQuery
Javascript ParentNode和ChildNode接口原理解析
Mar 16 Javascript
Vue使用轮询定时发送请求代码
Aug 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
一个简单的MySQL数据浏览器
2006/10/09 PHP
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
JS数学函数Exp使用说明
2012/08/09 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
JS实现的一个简单的Autocomplete自动完成例子
2014/04/16 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
python实现查询IP地址所在地
2015/03/29 Python
python直接访问私有属性的简单方法
2016/07/25 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
Python yield 使用方法浅析
2017/05/20 Python
pandas带有重复索引操作方法
2018/06/08 Python
python仿抖音表白神器
2019/04/08 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
英国经典球衣网站:Classic Football Shirts
2017/05/20 全球购物
Pam & Gela官网:美国性感前卫女装品牌
2018/07/19 全球购物
泰国的头号网上婴儿用品店:Motherhood.co.th
2019/04/09 全球购物
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
初三新学期计划书
2014/05/03 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
2014年乡镇安全生产工作总结
2014/12/02 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
老龙头导游词
2015/02/11 职场文书
护士辞职信怎么写
2015/02/27 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
python爬虫selenium模块详解
2021/03/30 Python
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python