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';
});
……

时间: 2024-09-20 05:26:28

js防止DIV布局滚动时闪动的方法的相关文章

js防止DIV布局滚动时闪动的解决方法_javascript技巧

本文实例讲述了js防止DIV布局滚动时闪动的方法,分享给大家供大家参考.具体方法如下: 最近接触页面性能的东西,有很多细微又原始的内容,比如浏览器渲染.资料非常多,所以选一些做节译,备忘. JavaScript多次写.读DOM就会发生「布局颠簸」,引起文档重排(reflow – the process of constructing a render tree 复制代码 代码如下: from a DOM tree1). // 读 var h1 = element1.clientHeight; /

如何用js实现鼠标向上滚动时浮动导航_javascript技巧

为什么会有这个需求呢?有没有发现在国外的一些网站,当你向上滚动时,导航条浮动在顶部位置.用户如果是想看内容就可以直接点击到达,省去很多拖动的时间,当然返回顶部也是比较容易.但有时候返回顶部这个按钮往往被人忽略了.下面一起来看看代码和演示(引入jQuery 1.9). 判断鼠标向上滚动,或者向下滚动,可以通过对比用户的上一次滚动的坐标和下一次的坐标,当上一次小于下一次时,即用户在向下滚动,反之,则说明用户在向上滚动.滚动的坐标值可以取窗口的scrollTop. HTML代码示例 <div id=&qu

js实现鼠标悬停图片上时滚动文字说明的方法

 这篇文章主要介绍了js实现鼠标悬停图片上时滚动文字说明的方法,涉及js操作鼠标事件的使用技巧,需要的朋友可以参考下     本文实例讲述了js实现鼠标悬停图片上时滚动文字说明的方法.分享给大家供大家参考.具体实现方法如下:   代码如下: <html> <title>js实现鼠标悬停图片上时的滚动文字说明</title> <body> <SCRIPT LANGUAGE="JavaScript"> <!-- Begin

分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码_javascript技巧

复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <HTML xmlns="http://www.w3.org/1999/xhtml"> <HEAD> <TITLE>分别用marquee

js实现鼠标悬停图片上时滚动文字说明的方法_javascript技巧

本文实例讲述了js实现鼠标悬停图片上时滚动文字说明的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <html> <title>js实现鼠标悬停图片上时的滚动文字说明</title> <body> <SCRIPT LANGUAGE="JavaScript"> <!-- Begin function showtip2(current,e,text){   if (document.all&&a

js页面滚动时层智能浮动定位实现

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-

如何使js控制DIV层显示隐藏(页面可刷新)时,只能隐藏不能显示,

问题描述 这段代码中,是可以用JS控制cookies隐藏DIV层,并且刷新也可以始终隐藏,但是如何做到当DIV层隐藏后,页面中有显示DIV层的提示我的设想是:当DIV层显示时,选择隐藏,页面刷新依然隐藏(已经做到了)当DIV隐藏后,可以选择显示,页面刷新可以显示DIV层(没做到)也就是用Js控制DIV的显示与隐藏,并存入cookies,直到下一次操作JS依然有效控制<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"&q

CSS布局中DIV为空时在IE6的不同表现

css 在实际应用中为了特殊的需要而用到一个空的DIV,并定义一个较小的高度值.通常的想法见下面代码: HTML<div></div>CSSdiv{height:5px;} 以上代码在多数浏览器中都可正确显示,但我们在实际运用中,确不象理论上这么简单,特别的IE6中并非如你所想,好象有时可以定义高度,有时它就不知何原因失效了! 先给出我的测试代码,然后在详细说明: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi

jQuery插件fullPage.js实现全屏滚动效果_jquery

本文实例为大家分享了全屏滚动插件fullPage.js的具体使用方法,供大家参考,具体内容如下 0.01 基本演示  的HTML 布局 以及js 代码 //需要连接 连接的三个文件 <link rel="stylesheet" href="css/jquery.fullPage.css"> //css文件 <script src="js/jquery-1.8.3.min.js"></script> //jQue