【问题标题】:How to run a fadein effect halfway while a div is animating?(moving up)如何在 div 动画时中途运行淡入淡出效果?(向上移动)
【发布时间】:2015-07-01 09:29:00
【问题描述】:

我想要一个 divfadeIn,而它正在制作动画(向上移动),而 fadeIn 需要在动画完成时的最后 2 秒内出现。

请注意,我不希望它同时出现在 fadeInanimate 上,fadeIn 需要在动画中途出现,因为 div 向上移动。

    $('header').delay(1000).fadeIn(1000)

$('header').animate({ 
    'marginTop': '-=200px'
}, 2000);

动画只是一个接一个地排队,我无法让它们工作到一半。

【问题讨论】:

  • 写下你尝试过的代码

标签: jquery animation


【解决方案1】:

要确定动画何时播放到一半,可以使用.animate()-function 的 step-option。

为每个动画的每个动画属性调用的函数 元素。此功能提供了修改 Tween 的机会 对象在设置之前更改属性的值。

为了直接启动第二个动画(fadeIn),您必须手动将动画的queue-选项指定为falsedequeue不同的动画。

var marginTop = 200;
var flag = false;
$('header').animate({
    'marginTop': '-=' + marginTop  + 'px'
}, {
    queue: false,
    duration: 2000,
    step: function(now){
        if(now <= marginTop/2 && !flag){
            $(this).fadeIn();
            flag = true;
        }
    }
});

Demo

阅读有关 jQUery 动画队列的更多信息here

【讨论】:

  • 正是我想要的,尽管我必须对像素值和持续时间进行大量调整才能获得正确的效果。
  • 有我的支持,但我必须评论fadeIn() 触发了 100 多次。切换可能是个好主意。
  • @Shikkediel 谢谢,是的,你是对的,我没想到这一点,添加了一个变量来解决这个问题。
  • 我不明白...fadeIn() 怎么能触发 100 多次?
  • step 函数在动画的 步上触发(每秒多次),因此fadeIn() 也会被触发(至少在下半场)。但是添加一个用作开关的变量以使其仅触发一次就足够了。这绝对是最好的解决方案。
【解决方案2】:

我会运行一个动画函数两次,如下所示:

$('#header').animate({
    'marginTop': '-=100px'
}, 1000, function(){ 
    $('#header').animate({
        'marginTop': '-=100px',
        'opacity': 1
    }, 1000)
});

https://jsfiddle.net/o0w4vhb3/

【讨论】:

  • 两个 animate() 之间有一个中断,如果你通过在 css 中添加 opacity: 1 来保持它一直可见,你可以清楚地看到它。所以最后,它只是第二个 animate() 与 fadeIn() 同时运行,而第一个 animate() 运行隐藏。不是我想要的效果,抱歉:(
【解决方案3】:

您可以通过禁用第一个动画的队列来同时运行两个动画,如下所示:

$('.header').css('opacity', 0);
$('.header').show();

$('.header').animate({ 'marginTop': '-=200px' }, {queue: false, duration: 2000});
$('.header').animate({opacity: 1}, 3000 );
.header {
    background-color: red;
    padding: 20px;
    display: none;
    margin-top: 250px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="header">test</div>

根据需要调整持续时间。

参考:How do you fadeIn and animate at the same time?

【讨论】:

  • 两个 animate() 之间有一个中断,如果你通过在 css 中添加 opacity: 1 来保持它一直可见,你可以清楚地看到它。所以最后,它只是第二个 animate() 与 fadeIn() 同时运行,而第一个 animate() 运行隐藏。不是我想要的效果,抱歉:(
【解决方案4】:

找到了!!!

纯 jQuery -fadeIn() + animate()

如果你想使用display:none 元素并且仍然获得这两种效果,那么 只需使用jQuery 或内联样式将其隐藏即可。

要解决的问题:

  • .animate() 无法为 display 属性设置动画 - 所以我们使用 fadeIn
  • .animate() 被添加到动画队列中——所以我们设置了queue: false

$('div').hide();
$('div').fadeIn(3000).animate({ 'marginTop': '-=200px' }, { queue: false, duration: 2000 });
div { margin-top:200px; background-color:blue; height:50px; width:500px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div></div>

奖励 - 仅 CSS

使用opacity 并延迟动画:

CSS:jsFiddle Demo

#ifade  { 
   margin-top:50px; 
   opacity:0;
   -moz-transition : margin-top 2s linear 0s, opacity 1s linear .6s;   
    -webkit-transition : margin-top 2s linear 0s, opacity 1s linear .6s;   
     transition : margin-top 2s linear 0s, opacity 1s linear .6s;   
}

玩得开心!

【讨论】:

  • 问题中没有 CSS 标签。加上 OP 想在 中途 淡出。
  • css 只是一个奖励,第一种方法使用纯 jQuery
  • @Shikkediel - 你是认真的吗?只有 CSS 是额外的 + OP 可以将持续时间设置为任何他想要的 - 顺便说一句,它已经一半了。
  • 当然,奖金很好,但它从一开始就消失了。
  • 我不是问这个问题的人。 OP 已经描述了预期的效果。
【解决方案5】:

我将分两步完成,模仿 .fadeIn() 所做的:

http://codepen.io/anon/pen/wavmBw?editors=011

header {
opacity: 0;
}

$('header')
.animate({marginTop: '-=100'}, 1000, 'linear')
.animate({marginTop: '-=100', opacity: 1}, 1000, 'linear');

编辑 - @empiric 在 cmets 中有一个很好的观点,所以我将方法更改为最直接的选项。这与fadeIn() 的结果相同(但似乎不是很有必要):

http://codepen.io/anon/pen/wavmBw?editors=011

var header = $('header');

header.css({display: 'none', opacity: 0});

// other stuff may be going on first

header
.css('display', 'block')
.animate({marginTop: '-=100'}, 1000, 'linear')
.animate({marginTop: '-=100', opacity: 1}, 1000, 'linear');

编辑 - 如 cmets 中所述,动画需要为 linear 才能显得流畅。

【讨论】:

  • 注意:这将假设 header 通过 opacity: 0 隐藏。根据header 的隐藏方式,您必须在第二个动画之前设置显示。
  • 好点,我将添加一个实时示例来解决其中的一些问题。
  • @Shikkediel - 实际上它不是真的。 fadeIn() 不同步。您可以链接这些动画并同时运行它们。
  • 真的,你会在我还在编辑的时候对某个细节投反对票吗?
  • @Jeevan Elements with display:none 不会在文档中保留任何空间,而opacity:0 只会使元素不可见,但会使用空间。
猜你喜欢
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 2018-08-22
相关资源
最近更新 更多