【问题标题】:jQuery fade in/out and delay, cancelling previous animationjQuery淡入/淡出和延迟,取消之前的动画
【发布时间】:2017-03-03 20:08:46
【问题描述】:

我想完成这项工作并且可以被打断。应该有 1 秒的淡入,1 秒的淡出,中间有 3 秒的延迟,但是在这 3 秒或 1 秒的淡入/淡出期间,可能会发生另一个应该发生的动作——停止之前的动作并且永远不会完成它。 例如,在显示图像的 3 秒期间,用户想要转到下一个/下一个/下一个/下一个,因此动画应该立即停止并转到下一个/下一个/下一个/下一个(多次用户点击),而无需完成在此之前开始的动画.

外部调用:SlideShow(1);或幻灯片(-1);等

function SlideShow(action) {
      slideCount = (slideCount+action) % totalSlides; 

      slides.eq(slideCount).fadeIn(fadeInAmount);

      // add 3 second delay/SetTimeout/etc here
      // how should setTimeout be involved here so that it, and the fadein/fadeout are stoppable (without ever continuing)

      slides.eq(slideCount).fadeOut(fadeOutAmount,function() {

      slideCount = (slideCount+increment) % totalSlides;
      SlideShow(0);
    });

  }

这是1s淡入,3s延迟,1s淡出的起点

slides.eq(slideCount).fadeIn(fadeInAmount).delay(fadeDelay).addClass('jqImage').fadeOut(fadeOutAmount,function() {
      slideCount = (slideCount+increment) % totalSlides;
      SlideShow(0);
});

这是使用 setTimeout 的一次无效尝试:

  function timerStop() {
        if (runningTimer) {
            clearTimeout(runningTimer);
            runningTimer = 0;
        }
  }


  var runningTimer;

  function SlideShow(action) {

    //    $('body').stop(); slides.eq(slideCount).dequeue(); slides.eq(slideCount).stop();


    slideCount=(slideCount+action) % totalSlides;

    $('#slideControls').html(
      (slideCount+1) + "/" + totalSlides
      + "<br>" + "Delay: " + fadeDelay/1000
      + "<br>" + "Skip: " + increment
    );

    $('#slideStatusbar').html( slides.eq(slideCount).find('img').attr('src').replace(/^.*[\\\/]/, '') ); // Filename only
    //slides.eq(slideCount).fadeIn(fadeInAmount).delay(fadeDelay).addClass('jqImage').fadeOut(fadeOutAmount,function() {
    //      slideCount < totalSlides-1 ? slideCount+=increment : slideCount=0;
    //  slideCount = (slideCount+increment) % totalSlides;
    //  SlideShow(0);


//    slides.eq(slideCount).addClass('jqImage');
    slides.eq(slideCount).fadeIn(fadeInAmount);


    runningTimer=setTimeout(function(){

      slides.eq(slideCount).fadeOut(fadeOutAmount,function() {
        slideCount = (slideCount + increment) % totalSlides;   //slideCount = (slideCount + (action ? action : increment)) % totalSlides; 
        SlideShow(0);
      });

    }, 1000);




  }

【问题讨论】:

  • "increment" 是一个全局变量,设置为 50,50 张图像会自动跳过,无需用户交互,但如果用户按下 Next/Previous,则丢弃所有内容,执行 Next/Previous,然后继续用户的下一张/上一张图像淡入、延迟、淡出后增加 50。
  • 有人可以帮忙吗?
  • 仍在为此苦苦挣扎
  • 你能发布一个 HTML 样本来帮助我重现这个吗?
  • 也许提供一个实时链接会更容易......我会确切地看到你在哪里。

标签: jquery settimeout fadein


【解决方案1】:

这不是一件容易的事。
修复需要几个小时。

您在服务器上为我制作的临时“沙盒”非常有用。
没有它,我将无法解决问题。
;)

现在是你的函数:

  var slideCountAdjusted;
  var slideCount;
  function SlideShow(action) {

    //---------- read from sliders -----------
    slideCount = parseInt( $('#slider1').val()-1 );
    fadeDelay  = parseInt( $('#slider2').val() );
    step       = parseInt( $('#slider3').val() );
    //----------------------------------------

    slideCountAdjusted=(slideCount+action) % totalSlides;
    if(slideCount>=totalSlides && action>0){
        slideCountAdjusted=0;
    }
    if(slideCount==0 && action<0){
        slideCountAdjusted=totalSlides-1;
    }

    $('#slider1').val(slideCountAdjusted+1).change();

    $('#slideStatusbar').html( 
      jscript_slideshowLinks                                                        // California > 
      +     " > "
      +     slides.eq(slideCountAdjusted).find('img').attr('src').replace(/^.*[\\\/]/, '')        // filename
    ); // Filename only

    if(intervalEnabled){
      runningTimer=setTimeout(function(){
        slides.eq(slideCount).fadeOut(fadeOutAmount,function() {

          slideCount = (slideCount + step) % totalSlides;   //slideCount = (slideCount + (action ? action : increment)) % totalSlides; 
          $('#slider1').val(slideCount+1).change();

          SlideShow(0);
        });
      }, fadeDelay*1000);
    }

    if(showNow){
      slides.eq(slideCount).fadeOut(fadeOutAmount,function() {
        slides.eq(slideCountAdjusted).fadeIn(fadeInAmount);
      });
    }else{
      slides.eq(slideCountAdjusted).fadeIn(fadeInAmount);
    }
  }

我还更改了这些点击处理程序:

  $('#slideshowPlay').off("click").on("click", function (e){ mySliderPlay(); SlideShow(0); });
  $('#slideshowPause').off("click").on("click", function (e){ mySliderPause();  });

  $('#slideshowPrevious').click(function (e) { mySliderBack(); });
  $('#slideshowNext').click(function (e)     { mySliderForward(); });

这里是那些处理程序:

  var intervalEnabled=true;
  var showNow=false;

  //---------------------------------------------------------------------
  // slideshowTimer routines - start
  //---------------------------------------------------------------------
  function mySliderPause() {
    console.log("PAUSE button pressed;");
    intervalEnabled=false;
    clearTimeout(runningTimer);
  }
  function mySliderPlay() {
    console.log("PLAY button pressed;");
    intervalEnabled=true;
    showNow=false;
  }
  function mySliderBack() {
    console.log("BACK button pressed;");
    intervalEnabled=false;
    showNow=true;
    clearTimeout(runningTimer);
    SlideShow(-1);

  }
  function mySliderForward() {
    console.log("FORWARD button pressed;");
    intervalEnabled=false;
    showNow=true;
    clearTimeout(runningTimer);
    SlideShow(1);
  }

更多更改,在您的 index.html 中...

我注释掉了这些脚本调用,我什至不知道它们应该做什么......
但是自从我删除它们后,您的页面加载速度更快了奇怪的间隔行为,我花了很长时间才发现神奇地消失了。

<!--script src='//production-assets.codepen.io/assets/editor/live/console_runner-079c09a0e3b9ff743e39ee2d5637b9216b3545af0de366d4b9aad9dc87e26bfd.js'></script>
<script src='//production-assets.codepen.io/assets/editor/live/events_runner-73716630c22bbc8cff4bd0f07b135f00a0bdc5d14629260c3ec49e5606f98fdd.js'></script>
<script src='//production-assets.codepen.io/assets/editor/live/css_live_reload_init-2c0dc5167d60a5af3ee189d570b1835129687ea2a61bee3513dee3a50c115a77.js'></script-->

我还注释掉了这个 jQuery lib 调用:

<!--script src='/ans/jquery/jquery-1.11.0.min.js'></script-->

因为你也叫这个。所以我把它移了几排。

<script src='//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>

【讨论】:

  • 干得好 Louys,正确的答案,很好的解决方案,就像您对我的其他主题/主题的其他回复一样。我接受了答案,也将其连根拔起。我在这个话题上有一些奇怪的行为并没有消失,你能够让它消失。当我想付钱给某人为我做一些编码任务时,这就是我正在寻找的那种奉献精神,你是我很快需要的主题列表中的第一个……过去我有一些问题没有得到解答(永远...自去年以来)或没有帮助的回复,但有时这样的回复真的很有帮助
猜你喜欢
  • 1970-01-01
  • 2012-12-27
  • 2011-03-18
  • 1970-01-01
  • 2014-12-30
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多