代码之家  ›  专栏  ›  技术社区  ›  Razvan Zamfir

自定义图像滑块错误:使用clearInterval停止自动前进不起作用

  •  0
  • Razvan Zamfir  · 技术社区  · 6 年前

    我正在使用jQuery和CSS开发一个自定义图像旋转木马。目的是让它 轻便的 但有足够的功能。

    剧本有一个 auto 我想成为的角色 如果用户单击项目符号,则停止 . 我在用 clearInterval 为此目的。代码如下:

    var $elm = $('.slider'),
      $slidesContainer = $elm.find('.slider-container'),
      slides = $slidesContainer.children('a'),
      slidesCount = slides.length,
      slideHeight = $(slides[0]).find('img').outerHeight(false),
      animationspeed = 300,
      animationInterval = 4000;
    
    // Set (initial) z-index for each slide
    var setZindex = function() {
      for (var i = 0; i < slidesCount; i++) {
        $(slides[i]).css('z-index', slidesCount - i);
      }
    };
    setZindex();
    
    var displayImageBeforeClick = null;
    
    var setActiveSlide = function() {
      $(slides).removeClass('active');
      $(slides[activeIdx]).addClass('active');
    };
    
    var advanceFunc = function() {
      if ($('.slider-nav li.activeSlide').index() + 1 != $('.slider-nav li').length) {
        $('.slider-nav li.activeSlide').next().find('a').trigger('click');
      } else {
        $('.slider-nav li:first').find('a').trigger('click');
      }
    }
    
    var autoAdvance = function() {
      setInterval(advanceFunc, animationInterval);
    };
    
    //Set slide height
    $(slides).css('height', slideHeight);
    
    // Append bullets
    for (var i = 0; i < slidesCount; i++) {
      var bullets = '<li><a href="#">' + i + '</a></li>';
      if (i == 0) {
        // active bullet
        var bullets = '<li class="activeSlide"><a href="#">' + i + '</a></li>';
        // active slide
        $(slides[0]).addClass('active');
      }
      $('.slider-nav').append(bullets);
    };
    
    var slideUpDown = function() {
      // set top property for all the slides
      $(slides).not(displayImageBeforeClick).css('top', slideHeight);
      // then animate to the next slide
      $(slides[activeIdx]).animate({
        'top': 0
      }, animationspeed);
    
      $(displayImageBeforeClick).animate({
        'top': "-100%"
      }, animationspeed);
    };
    
    autoAdvance();
    
    $('.slider-nav a').on('click', function(event) {
      displayImageBeforeClick = $(".slider-container .active");
      activeIdx = $(this).text();
      if ($(slides[activeIdx]).hasClass("active")) {
        return false;
      }
      $('.slider-nav a').closest('li').removeClass('activeSlide');
      $(this).closest('li').addClass('activeSlide');
      
      // Stop autoadvance if user clicks bullet
      if (event.originalEvent !== undefined) {
        clearInterval(autoAdvance);
      }
    
      setActiveSlide();
      slideUpDown();
    });
    body * {
      box-sizing: border-box;
    }
    
    .container {
      max-width: 1200px;
      margin: 0 auto;
    }
    
    .slider {
      width: 100%;
      height: 300px;
      position: relative;
      overflow: hidden;
    }
    
    .slider .slider-nav {
      text-align: center;
      position: absolute;
      padding: 0;
      margin: 0;
      left: 10px;
      right: 10px;
      bottom: 2px;
      z-index: 30;
    }
    
    .slider .slider-nav li {
      display: inline-block;
      width: 20px;
      height: 3px;
      margin: 0 1px;
      text-indent: -9999px;
      overflow: hidden;
      background-color: rgba(255, 255, 255, .5);
    }
    
    .slider .slider-nav a {
      display: block;
      height: 3px;
      line-height: 3px;
    }
    
    .slider .slider-nav li.activeSlide {
      background: #fff;
    }
    
    .slider .slider-nav li.activeSlide a {
      display: none;
    }
    
    .slider .slider-container {
      width: 100%;
      text-align: center;
    }
    
    .slider .slider-container a {
      display: block;
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
    }
    
    .slider .slider-container img {
      transform: translateX(-50%);
      margin-left: 50%;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css" rel="stylesheet"/>
    
    <div class="container">
      <div class="slider slider-homepage">
        <ul class="slider-nav"></ul>
        <div class="slider-container">
          <a href="#">
            <img src="https://picsum.photos/1200/300/?gravity=east" alt="">
          </a>
          <a href="#">
            <img src="https://picsum.photos/1200/300/?gravity=south" alt="">
          </a>
          <a href="#">
            <img src="https://picsum.photos/1200/300/?gravity=north" alt="">
          </a>
        </div>
      </div>

    问题 :即使控制台没有显示错误,自动前进也不会停止。我已经花了几个小时试图找出问题,但没有成功。

    2 回复  |  直到 6 年前
        1
  •  0
  •   tnyN    6 年前

    如果将变量autoAdvance设置为set interval,而不是执行该间隔的函数。那么你的清除间隔就可以工作了。

    前任: var autoAdvance = setInterval(advanceFunc, animationInterval);

        2
  •  0
  •   Razvan Zamfir    6 年前

    我设法解决了这个问题(在tnyN的帮助下),比如:

    1) 我换了

    var autoAdvance = function() {
      setInterval(advanceFunc, animationInterval);
    };
    

    具有 var autoAdvance = setInterval(advanceFunc, animationInterval);

    2) 摆脱 autoAdvance();

    以下是完整的工作代码:

    var $elm = $('.slider'),
      $slidesContainer = $elm.find('.slider-container'),
      slides = $slidesContainer.children('a'),
      slidesCount = slides.length,
      slideHeight = $(slides[0]).find('img').outerHeight(false),
      animationspeed = 300,
      animationInterval = 4000;
    
    // Set (initial) z-index for each slide
    var setZindex = function() {
      for (var i = 0; i < slidesCount; i++) {
        $(slides[i]).css('z-index', slidesCount - i);
      }
    };
    setZindex();
    
    var displayImageBeforeClick = null;
    
    var setActiveSlide = function() {
      $(slides).removeClass('active');
      $(slides[activeIdx]).addClass('active');
    };
    
    var advanceFunc = function() {
      if ($('.slider-nav li.activeSlide').index() + 1 != $('.slider-nav li').length) {
        $('.slider-nav li.activeSlide').next().find('a').trigger('click');
      } else {
        $('.slider-nav li:first').find('a').trigger('click');
      }
    }
    
    var autoAdvance = setInterval(advanceFunc, animationInterval);
    
    //Set slide height
    $(slides).css('height', slideHeight);
    
    // Append bullets
    for (var i = 0; i < slidesCount; i++) {
      var bullets = '<li><a href="#">' + i + '</a></li>';
      if (i == 0) {
        // active bullet
        var bullets = '<li class="activeSlide"><a href="#">' + i + '</a></li>';
        // active slide
        $(slides[0]).addClass('active');
      }
      $('.slider-nav').append(bullets);
    };
    
    var slideUpDown = function() {
      // set top property for all the slides
      $(slides).not(displayImageBeforeClick).css('top', slideHeight);
      // then animate to the next slide
      $(slides[activeIdx]).animate({
        'top': 0
      }, animationspeed);
    
      $(displayImageBeforeClick).animate({
        'top': "-100%"
      }, animationspeed);
    };
    
    $('.slider-nav a').on('click', function(event) {
      displayImageBeforeClick = $(".slider-container .active");
      activeIdx = $(this).text();
      if ($(slides[activeIdx]).hasClass("active")) {
        return false;
      }
      $('.slider-nav a').closest('li').removeClass('activeSlide');
      $(this).closest('li').addClass('activeSlide');
      
      // Stop autoadvance if user clicks bullet
      if (event.originalEvent !== undefined) {
        clearInterval(autoAdvance);
      }
    
      setActiveSlide();
      slideUpDown();
    });
    body * {
      box-sizing: border-box;
    }
    
    .container {
      max-width: 1200px;
      margin: 0 auto;
    }
    
    .slider {
      width: 100%;
      height: 300px;
      position: relative;
      overflow: hidden;
    }
    
    .slider .slider-nav {
      text-align: center;
      position: absolute;
      padding: 0;
      margin: 0;
      left: 10px;
      right: 10px;
      bottom: 2px;
      z-index: 30;
    }
    
    .slider .slider-nav li {
      display: inline-block;
      width: 20px;
      height: 3px;
      margin: 0 1px;
      text-indent: -9999px;
      overflow: hidden;
      background-color: rgba(255, 255, 255, .5);
    }
    
    .slider .slider-nav a {
      display: block;
      height: 3px;
      line-height: 3px;
    }
    
    .slider .slider-nav li.activeSlide {
      background: #fff;
    }
    
    .slider .slider-nav li.activeSlide a {
      display: none;
    }
    
    .slider .slider-container {
      width: 100%;
      text-align: center;
    }
    
    .slider .slider-container a {
      display: block;
      position: absolute;
      top: 0;
      left: 0;
      right: 0;
    }
    
    .slider .slider-container img {
      transform: translateX(-50%);
      margin-left: 50%;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css" rel="stylesheet"/>
    
    <div class="container">
      <div class="slider slider-homepage">
        <ul class="slider-nav"></ul>
        <div class="slider-container">
          <a href="#">
            <img src="https://picsum.photos/1200/300/?gravity=east" alt="">
          </a>
          <a href="#">
            <img src="https://picsum.photos/1200/300/?gravity=south" alt="">
          </a>
          <a href="#">
            <img src="https://picsum.photos/1200/300/?gravity=north" alt="">
          </a>
        </div>
      </div>