【问题标题】:jQuery Animation Speed?jQuery 动画速度?
【发布时间】:2011-03-12 14:32:14
【问题描述】:

最终编辑:下面的文字墙可以简单地总结为“我可以使用jQuery的animate()指定动画的速度吗?提供的只是duration。”

~~

jQuery 的animate() 似乎实现了缓动,尽管我使用了“线性”。我怎样才能让两个盒子保持在一起,直到第一个完成@ 250px?第二个动画更快,因为它有更长的距离。

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script type="text/javascript">
    $(function()
    {
        $('#a').animate({left: '250px'}, 1000, 'linear');
        $('#b').animate({left: '500px'}, 1000, 'linear');
    });
</script>

<div id="a" style="background-color: red; position: relative; width: 50px; height: 50px;"></div>
<br/><br/>
<div id="b" style="background-color: red; position: relative;width: 50px; height: 50px;"></div>

或者is there a jQuery carousel plugin that does this(鼠标移动取决于你的鼠标位置)所以我不必重写它?我花了大约 20 分钟在 Google 上寻找一个,但找不到任何我喜欢的东西。

ETA:我提供的示例非常简单,但我发现它的问题适用于更复杂的代码库。 (1) Go here. (2) 将鼠标放在 C. Viper 上,看速度。 (3) 将鼠标放在 Ryu 上,但在完成之前,将鼠标移动到 DIV 的中间(因此它停止)。 (4) 将鼠标放回左侧,看看它的移动速度有多慢。

在这里计算速度和距离的差异似乎是不可逾越的。我要做的就是重新创建我今天看到的网站使用的可爱效果 (this site)。但它是 Mootools,我在 jQuery 中。 =[

【问题讨论】:

  • 链接 (1) 不起作用

标签: jquery jquery-animate


【解决方案1】:

更新后的问题:
First, here's a working demo with the behavior you want。我们在这里所做的是根据移动所需的量来调整速度,因为speed 不是一个准确的描述,它是持续时间,在相同的持续时间内移动更短的距离意味着较慢的移动,因此我们需要根据需要移动的距离来缩放持续时间。对于向后移动,它看起来像这样:

var oldLeft = ul.offset().left;
ul.animate({left: 0}, -oldLeft * speed, 'linear');

由于&lt;ul&gt; 以负左位置滚动,我们需要移动那么多像素的倒数才能回到开头,所以我们使用-oldLeft(它是当前 left 位置)。

对于正向,一个非常相似的方法:

var newLeft = divWidth - ulWidth,
    oldLeft = ul.offset().left;
ul.animate({left: newLeft + 'px'}, (-newLeft + oldLeft) * speed, 'linear');

这将获得新的left 属性,末尾是&lt;ul&gt; 的宽度减去它所在的&lt;div&gt; 的宽度。然后我们从当前的left 位置减去(它是负数所以添加) (也是负数,所以反过来)。

这种方法为您的speed 变量赋予了全新的含义,它现在的意思是“每像素毫秒数”,而不是之前的持续时间,这似乎是你在追求什么。另一个优化是使用您已经拥有的缓存 &lt;ul&gt; 选择器,使事情变得更快/更干净。


对于原始问题:
保持简单,只需一半的时间,一半的距离,就像这样:

$(function() {
    $('#a').animate({left: '250px'}, 500, 'linear');
    $('#b').animate({left: '500px'}, 1000, 'linear');
});

You can try a demo here

【讨论】:

  • 说真的,这是必需的吗?我提供的示例非常简单,所以这个建议很好。但是我在一组更复杂的代码上遇到了这个问题,但是尝试将此计算添加到该代码中会比我已经编写的更复杂. =[
  • @Langdon - 我相信我们可以想出一些简单的解决方案来解决这个问题,实际代码有什么不同?你可以用一个动画来制作两个动画,然后在完整的回调中,开始只涉及元素子集的第二条腿,比如 #b 在这种情况下?像这样的东西:jsfiddle.net/BVN7n/2
  • 我更新了问题以显示我的真实意图。一个简单的例子更容易理解我的观点。感谢您迄今为止所做的努力。
  • 尼克 - 抱歉,看到你为 Reigel 留下评论后删除了我的评论。
  • @Langdon - 这是一个可以满足您需要的版本,可以调整速度以匹配要移动的像素数:jsfiddle.net/SF6yc
【解决方案2】:

我制作了一个完全符合您要求的插件。您可以使用Supremation 指定动画的速度而不是持续时间。

【讨论】:

  • 哇,这正是我想要的。我对此赞不绝口。我正在考虑自己编写这个插件,谢谢你节省了我的时间。 :)
  • 这是 GitHub (github.com/lukeshumard/supremation) 上的项目,因为我忘了更新域。哎呀。
  • 是否应该这样工作:div.supremate({ scrollTop: div.prop("scrollHeight")}, 1, "linear"); - 即垂直滚动以每秒 1 个像素的速度发生?我正在使用 jQuery 3.5.1,它似乎立即滚动到 div 的末尾(没有动画)。
【解决方案3】:

linear 仅指定动画应该以线性增量完成,并且在完成时不会加速或减速。如果你想让两个动画的速度相同,只需将两倍距离的动画所花费的时间加倍即可:

$('#a').animate({left: '250px'}, 1000, 'linear');
$('#b').animate({left: '500px'}, 2000, 'linear');

【讨论】:

  • 我更新了我的问题,展示了我真正在做什么。对于我的真实代码来说,计算速度/像素的差异似乎是不可能的。
【解决方案4】:

这样的??

demo

$('#a,#b').animate({left: '250px'}, 1000, 'linear',
    function(){
       $('#b').animate({left: '500px'}, 1000, 'linear');   
    }
);

【讨论】:

  • 这将在第一个完成之后 开始第二个动画...我相信 OP 希望他们在一起直到第一个完成,然后 #b 继续为剩余的 250 像素设置动画。
  • @nick - 我的演示和你的几乎一样...看看jsfiddle.net/BFhm6
  • 我完全错过了第一个选择器中的#b,是的,这会很好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 2014-11-09
相关资源
最近更新 更多