当前位置: 首页 > 编程笔记 >

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

柳修平
2023-03-14
本文向大家介绍js防止DIV布局滚动时闪动的解决方法,包括了js防止DIV布局滚动时闪动的解决方法的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了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程序设计有所帮助。

 类似资料:
  • 问题内容: 我的页面布局看起来像这样: 您会注意到,当垂直滚动条出现时,content-wrapdiv会稍稍移动其位置。一种情况是浏览器开始逐渐呈现页面而不显示垂直滚动条,然后确定需要滚动条,因为内容比“折叠”高。这会将div向左移动约10像素。 在 不强制浏览器始终显示滚动条的情况下 解决此问题的最佳方法是什么 ? 问题答案: 恐怕解决此问题的最佳方法是使用强制滚动条始终可见。您遇到的问题是,出

  • 我正在用html制作一个应用程序,并且需要有一个滚动条。但是,每当我添加一个时,它都会移动所有内容,以便为滚动条提供必要的空间。这搞砸了应用程序的布局。 因此,我需要一种方法,使滚动条简单地覆盖在页面顶部,这意味着页面仍然在它后面。我已经知道如何设计滚动条以使背面透明,我只需要滚动条不占用任何空间。 提前感谢!

  • 本文向大家介绍防止SyntaxHighlighter.js的代码高亮时闪一下的解决方法,包括了防止SyntaxHighlighter.js的代码高亮时闪一下的解决方法的使用技巧和注意事项,需要的朋友参考一下 SyntaxHighlighter.js是一个代码高亮的JS插件,使用也很简单,但是由于是浏览器段执行JS代码来着色,会出现视觉上闪一下的效果。比如你的20行代码网页打开显示高度为100px,

  • 我有一个内部滚动条的div组件,我想防止向上/向下箭头键在元素聚焦时滚动(鼠标单击元素),因为它们用于其他事件(例如缩放)。 我找到的唯一解决方案是将事件侦听器附加到文档,但是,它禁用所有默认的箭头键事件,例如在输入字段中移动光标。 以下是一个示例(在React中):https://codesandbox.io/s/rsc-live-example-fze6z 如何复制: 用鼠标点击内部div(有

  • 问题内容: 我已经在SO上看到了几次这样的问题,并且给出了相同的答案,但这些答案在我的Chrome或Firefox中不起作用。 我想让一组左浮动div开始运行,水平放置一个带有水平滚动条的父div。 我可以在这里演示如何使用此糟糕的嵌入式CSS 但是,从SO *给出的答案来看,这应该可行,但对我而言却不可行。 有没有一种方法可以定义每个项目的绝对位置呢? eg [防止浮动的div包装到下一行 问题

  • 问题内容: 当我的网站上的Modal打开时,我希望我的身体在使用鼠标滚轮时停止滚动。 我试图在模式打开时调用下面的一段javascript,但没有成功 和 请注意,我们的网站已放弃了对IE6的支持,不过IE7 +需要兼容。 问题答案: 在显示模式对话框时,Bootstrap会自动将类添加到主体,而在对话框隐藏时将其删除。因此,您可以将以下内容添加到CSS中: 您可能会争辩说,上面的代码属于Boot