【发布时间】:2012-02-13 04:30:27
【问题描述】:
在 Chrome 中使用内置时间线记录器分析页面时,我看到重复的“重新计算样式”条目。它们没有明显的信息可以将它们链接到 DOM 元素或事件。
我怎样才能最好地确定这些条目的原因?
【问题讨论】:
标签: google-chrome profiling timeline
在 Chrome 中使用内置时间线记录器分析页面时,我看到重复的“重新计算样式”条目。它们没有明显的信息可以将它们链接到 DOM 元素或事件。
我怎样才能最好地确定这些条目的原因?
【问题讨论】:
标签: google-chrome profiling timeline
已发布的用于调查的 jQuery 版本的替代方法是控制台中的简单单行:
window.onanimationiteration = console.log;
这将在每次运行某些动画时打印一行,包括动画的名称和应用动画的元素。
【讨论】:
我对您的建议是使用 Chrome 的 Chrome Canary 版本。 Paul Irish 有一个在 Chrome 开发工具中使用时间轴的很好的演示 here
您可以简单地单击事件,例如“重新计算样式”,您应该会获得一个微型堆栈跟踪,指向事件在您的代码中发生的位置。
【讨论】:
我能够测试 CSS 过渡或动画是否在我的页面上触发了重新计算。我用 jQuery 来做这个,但是你可以使用任何你想要的:
$('*').css('transition', 'none');
$('*').css('animation', 'none');
这有效地禁用了页面每个元素上的过渡和动画。我一次运行一个,然后重新运行我的分析。就我而言,动画是罪魁祸首。
.css('animation') 会返回类似
"myCustomAnimation 15s linear 0s infinite normal none running"
或者如果没有动画,
"none 0s ease 0s 1 normal none running"
所以在刷新(重新启用动画)之后,下面的 sn-p 会记录每个定义了动画的元素:
$('*').each(function(){
if($(this).css('animation').split(' ')[0] != 'none'){ //you could also check for infinite here if you want
console.log(this);
}
});
通过单独禁用每个动画,我能够确定是哪一个导致了我的问题。
【讨论】:
animation-iteration: infinite 的动画始终使 CSS 和重绘无效,即使受影响的元素不在屏幕上。
我几乎可以肯定您的页面上有一些无限重复的动画。这就是导致重新计算样式的原因,但没有说明是什么原因造成的。
【讨论】:
我也遇到了同样的问题(这就是我发现你的问题的原因)。
我的问题是由 CSS3 转换所有属性引起的。当我需要的只是过渡填充时,我一直很懒惰。
实现单个更改就形成了循环
【讨论】:
它也可能是由某些扩展引起的。在我的情况下,由于外部第三方 chrome 扩展,样式是重新计算。当我删除扩展时 - Chrome 停止重新计算样式。
【讨论】: