还有另一个关于这个问题的线索,但可能因为我在我的问题上不是很清楚而没有得到解决。
我想再试一次,希望我能解决这个问题:
我最近的任务是创建一个单页网站,模仿基本的Flash动画,即滑入和淡出元素。
当我进行交互式模拟时,我遇到了一个大问题 - 乱七八糟的动画。这个问题出现在屏幕大于18英寸的Mac上,无论浏览器和低于18的Mac都只针对FF版本3及以下版本。在PC上,动画几乎完美无缺。
以下是我的jquery代码,受影响的元素标有ids#md1,#md2和#md3:
$(document).ready(function () {
$('#md1').animate({ top: "-60px" }, 500);
$('#md2').animate({ top: "60px" }, 800);
$('#md3').animate({ left: "60px" }, 1000);
$('.home').fadeTo(3000, 0.8);
$('#bg-img-4').fadeTo(1200, 1);
$('#menu').fadeTo(4000, 1);
$('#copyright').fadeTo(4000, 1);
});
我采用了各种优化方法,包括在索引页面上缓存受影响的div中存在的图像,然后将用户重定向到实际页面并排队动画,但没有任何效果。
这真的非常令人沮丧,因为我似乎已经用尽了我所知道的所有可用方法,而且我似乎无法让它在Mac上运行良好。
我有一种直觉,认为我正在编写太多关于文档准备的动画,这会导致缓慢 - 任何人都可以确认这是否是主要原因,如果还有其他方法可以解决这个问题?
非常感谢你的帮助。非常感谢=)
答案 0 :(得分:1)
最好的方法是使用CSS过渡/动画。 如果某些浏览器不支持它们,那么这样的浏览器在任何类型的动画上都不是很好。
CSS中的过渡和动画可以通过本机代码更好地优化,因此理论上可以表现出更加平滑(更高的FPS)行为。
截至上面的jquery动画:
opacity
或rgba()
的使用案例数量。总的来说:你拥有的DOM元素越少越好。
答案 1 :(得分:0)
使用jQuery动画时,如果您正在运行多个动画或重复相同的动画,则应在动画前加上dequeue()
和stop()
,否则它们可能会在彼此后面等待运行并产生结果无意中延迟。
$('#md1').dequeue().stop().animate({ top: "-60px" }, 500);
使用此功能的Here's a Codepen demo和a another slightly more complex demo。
您可以使用此处记录的jquery.fx.interval
来操纵jQuery处理动画的帧速率。
可以操纵此属性以调整动画运行的每秒帧数。默认值为13毫秒。将这个数字设置得更低可以使动画在更快的浏览器(例如Chrome)中运行更顺畅,但这样做可能会对性能和CPU产生影响。
由于jQuery使用一个全局间隔,因此不应运行任何动画,或者应停止所有动画以使此属性的更改生效。
您可以使用setInterval将动画分解为更小的位,这将更容易,更快速地处理。
例如,如果要在任何延伸距离上为div的位置设置动画,您可以将距离分成小部分,并将其设置为以恒定速度运行,因此看起来好像是单个平滑过渡。
间隔方法实际上只适用于简单的动画。但是对于更复杂的动画,您可以使用requestAnimationFrame
来控制浏览器选择何时是执行代码的最佳时刻。
function animLoop( render, element ) {
var running, lastFrame = +new Date;
function loop( now ) {
// stop the loop if render returned false
if ( running !== false ) {
requestAnimationFrame( loop, element );
running = render( now - lastFrame );
lastFrame = now;
}
}
loop( lastFrame );
}
// Usage
animLoop(function( deltaT ) {
elem.style.left = ( left += 10 * deltaT / 16 ) + "px";
if ( left > 400 ) {
return false;
}
// optional 2nd arg: elem containing the animation
}, animWrapper );