更平滑的Jquery动画
关于这一点,我有另一条线索,但没有解决,可能是因为我的问题不太清楚 我只是想再试一次,希望我能解决这个问题: 我最近的任务是创建一个单页网站,模拟基本的Flash动画,即滑入和淡出元素 当我得到一个交互式模型时,我遇到了一个大问题——动画的起伏。问题出现在屏幕大于18英寸的Mac电脑上,而不考虑浏览器,18英寸以下的Mac电脑仅适用于FF版本3及以下。在个人电脑上,动画几乎完美无缺 以下是我的jquery代码,受影响的元素用id#md1、#md2和#md3标记: 我求助于各种优化方法,包括缓存索引页上受影响div中的图像,稍后将用户重定向到实际页面,并对动画进行排队,但没有任何效果 这真的很令人沮丧,因为我似乎已经用尽了我所知道的所有可用方法,而且我似乎无法让它在Mac上正常工作 我有一种直觉,我在准备文档的时候编译了太多的动画,这导致了迟钝——有人能确认这是否是主要原因,是否有其他方法可以解决这个问题吗更平滑的Jquery动画,jquery,html,jquery-animate,Jquery,Html,Jquery Animate,关于这一点,我有另一条线索,但没有解决,可能是因为我的问题不太清楚 我只是想再试一次,希望我能解决这个问题: 我最近的任务是创建一个单页网站,模拟基本的Flash动画,即滑入和淡出元素 当我得到一个交互式模型时,我遇到了一个大问题——动画的起伏。问题出现在屏幕大于18英寸的Mac电脑上,而不考虑浏览器,18英寸以下的Mac电脑仅适用于FF版本3及以下。在个人电脑上,动画几乎完美无缺 以下是我的jquery代码,受影响的元素用id#md1、#md2和#md3标记: 我求助于各种优化方法,包括缓存索
非常感谢你们的帮助。非常感谢=)最好的方法是使用CSS转换/动画。 如果某些浏览器不支持它们,那么这种浏览器对任何类型的动画都不好 CSS中的过渡和动画可以通过本机代码进行更好的优化,因此理论上可以表现出更平滑(更高的FPS)的行为 从上面的jquery动画开始:
opacity
或rgba()
dequeue()
和stop()
,否则它们可能会在等待运行时相互堆积,导致意外延迟
$('#md1').dequeue().stop().animate({ top: "-60px" }, 500);
那就用这个
帧速率 您可以使用
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 );
- 进一步阅读:
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 );