【问题标题】:JQuery FadeOut, Load and FadeInJQuery FadeOut、Load和FadeIn
【发布时间】:2016-10-09 08:18:34
【问题描述】:

我有一个fadeOut的以下代码,加载另一个内容和fadeIn,但我有一个问题,有时,当加载函数非常快时,它甚至在时间轴完全fadeOut之前切换加载的内容,所以在这种情况下效果有点奇怪。我怎样才能防止这种情况?

注意 我想在点击后立即加载内容,所以将加载函数放入第一个fadeTo回调函数不是解决方案。谢谢!

$(".switches li").click(function(evn) {
        $(".switches li").removeClass("active");
        $(evn.target).addClass("active");
        $(".timeline").fadeTo(400, 0, function(){
           $(this).css("visibility", "hidden");
        }); 
        $(".timeline").load("inc-timeline/"+evn.target.id+".html", function() {
            $(this).fadeTo(400, 100, function() {
                $(this).css("visibility", "visible");
                if(evn.target.id === "data-girls") {
                    $(".data-girls-powered").fadeIn(400);
                } else {
                    $(".data-girls-powered").fadeOut(400);
                }
            });
        });  
    });

【问题讨论】:

  • 将加载逻辑移到fadeTo回调中(或者使用更多回调,或者使用promise)
  • 请阅读注释,我不想将加载逻辑移到第一个 fadeTo 回调中,因为那样有时会花费很多时间:-(

标签: javascript jquery fadein fadeout jquery-effects


【解决方案1】:

使用.animate().finish()start选项

  // call `.load()` when `.fadeTo(400, 0)` starts 
  $(".timeline").finish().animate({opacity:0},{
    start: function() {
      // do asynchronous stuff; e.g., `.load()`
      $(this).load("inc-timeline/"+evn.target.id+".html", function() {
        // stop `.fadeTo(400, 0)` animation,
        // start animating to `opacity:1`
        $(this).finish().fadeTo(400, 1, function() {
          // do stuff
        });
      });
    },
    duration: 400        
  });

$("button").click(function() {
  // call `.load()` when `.fadeTo(400, 0)` starts 
  $(".timeline").finish().animate({opacity:0},{
    start: function() {
      var el = $(this);
      // do asynchronous stuff; e.g., `.load()`
      $.Deferred(function(dfd) {
        setTimeout(function() {
          dfd.resolveWith(el)
        }, Math.floor(Math.random() * 3500))
      }).promise().then(function() {
        // stop `.fadeTo(400, 0)` animation,
        // start animating to `opacity:1`
        $(this).finish().fadeTo(400, 1, function() {
        });
      });
    },
    duration: 400        
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>click</button>
<div class="timeline">abc</div>

【讨论】:

  • 请阅读注意事项,我不想在 400 毫秒后开始加载内容,我想在点击后立即加载它
  • @user3216673 “我不想在400ms后开始加载内容,我想在点击后立即加载”你可以start选项.fadeTo().fadeTo() 启动时调用.load();当.load() 完成时调用.stop() 停止.fadeTo(400, 0) 动画,开始.fadeTo(400, 1) 动画
  • fadeTo 持续时间不起作用,我现在没有效果,它立即隐藏:(
  • @user3216673 查看更新后的帖子。替换 .animate() ,它确实有一个 start 选项,用于 .fadeTo() .fadeTo(400, 0)
  • 好吧,这似乎是所有解决方案中最好的,但如果我想执行“消失”的 fadeTo,即使内容已加载怎么办?现在它停止了效果 (stop())
【解决方案2】:

如果将加载的持续时间更改为超过 400 毫秒,会有所帮助吗?

【讨论】:

  • 我不认为加载有持续时间选项,我错了吗?
猜你喜欢
  • 2010-11-20
  • 2013-11-28
  • 1970-01-01
  • 2011-10-01
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多