【问题标题】:jQuery: reducing repaintsjQuery:减少重绘
【发布时间】:2010-09-16 06:01:52
【问题描述】:

我需要优化图片库滑块,因为很多浏览器都很难处理动画。

请考虑以下示例:

var $div1 = $('#div1'),
$div2 = $('#div2'),
$div3 = $('#div3'),
left = 0;

function animate() {
  left -= 10;
  $div1.css({
    left: left + 'px',
    width: 1000 - left + 'px'
  });
  $div2.css( 'left', left - 10 + 'px' );
  $div3.css( 'left', left - 40 + 'px' );
}

setInterval( animate, 20 );

当然,这给很多浏览器带来了巨大的压力,它需要每 20 毫秒重绘 3 次!

有什么方法可以克隆三个 div,离线处理它们,然后它们一次替换所有它们,从而将重绘数量减少到一个?

如果您有其他建议,随时分享。

谢谢!

【问题讨论】:

  • Erm... jQuery 自己的 animate() 有什么问题?
  • 我要不要给它们每个设置动画并让它们运行 20 毫秒?
  • 我刚刚转换为动画。它仍然波涛汹涌,所以不幸的是我没有得到任何东西。
  • 你的代码可能和jQuery内部的速度差不多,最大的问题是Chrome以外的浏览器的JS引擎很糟糕。
  • 请给出一个带有标记的示例页面,最好在jsfiddle.comjsbin.com

标签: jquery css animation clone repaint


【解决方案1】:

有几种方法可以让这个过程更加节省资源。

想法 1:20 毫秒可以达到 50 FPS。您的好莱坞电影平均以 24-30 FPS 的速度运行(我忘记了确切的帧速率)。尝试 33 - 40 毫秒的间隔。

想法 2:尽可能使用绝对定位,以尽量减少文档其余部分所需的重排量。

想法 3:将所有动画整合到一个计时器中。我想大多数优秀的框架都会为你解决这个问题。

最终,您或您的框架将为每个选择器迭代设置 CSS 属性,所以我认为您将通过寻找其他地方来实现您的收益。

【讨论】:

  • 谢谢。 Idea1:我可以提高速度,但在大多数浏览器中仍然不稳定。 Idea2:我忘了说所有的div都是绝对定位的。想法3:单定时器?我不确定我是否跟随。你能详细说明一下吗?
  • 这是 MozAfterPaint 的输出:pastebin.com/K3N0MZCW 进行幻灯片时。
  • 对不起,如果我不清楚 - 我想我误解了你的部分问题。在想法 1 中,我实际上打算将重绘速度从每秒 50 次减慢到 25-30 次。但是您的 MozAfterPaint 输出表明您仍然可以跑得比这更快。
  • 这是 SpeedTracer 的截图。单击 DOM 后(动画开始的位置),您可以看到 100 % 的重绘耗时超过 20 毫秒。我想这就是问题所在。重绘花费的时间比间隔本身更长。 img412.imageshack.us/img412/7067/screenshot20100916at085.png
  • 也许这可以解释潜在的瓶颈? img20.imageshack.us/img20/4701/screenshot20100916at090.png
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 2011-10-04
  • 2019-12-12
  • 2013-01-28
相关资源
最近更新 更多