скользящий ползунок круговой индикатор для стрелки - PullRequest
0 голосов
/ 26 марта 2020

У меня есть скользящий ползунок (или несколько ползунков) на странице.

Я добавляю стрелки для ползунка.

И я хочу, чтобы стрелки показывали индикатор выполнения слайда. Но только в соответствующем направлении.

Если ползунок перемещается вправо, то анимация - следующая кнопка со стрелкой. Кнопка со стрелкой prev должна оставаться заблокированной (slick-disabled).

Если ползунок достиг конца, активируется кнопка prev, и следующая кнопка становится недоступной (slick-disabled), и ползунок прокручивается в направлении, противоположном первому.

В то же время переключение между слайдами также должно работать.

Или следующая кнопка всегда активна и находится в процессе выполнения. И движение происходит только вправо. Когда мы дойдем до последнего слайда, снова снова первый и снова движение вправо.

Код:

var time = 2;
var $slick, isPause, tick, percentTime = 0;

if ($('.slider').length) {
  $('.slider').each(function() {
    var time = 2;
    var isPause, tick, percentTime = 0;

    $slick = $(this);
    var $status = $(this).closest('.section').find('.slider-num'),
      $current = $status.find('strong'),
      $length = $status.find('i');

    $slick.on('init reInit afterChange', function(event, slick, currentSlide, nextSlide) {

      var i = (currentSlide ? currentSlide : 0) + 1;
      $current.html((((i) < 10) ? "0" + (i) : i));
      $length.html('/' + (((slick.slideCount) < 10) ? "0" + (slick.slideCount) : slick.slideCount));
      //$status.html( '<strong>' + (((i)<10) ? "0"+(i) : i) +'</strong>'+ '<small>/' + (((slick.slideCount)<10) ? "0"+(slick.slideCount) : slick.slideCount)  + '</<small>');
    });

    $slick.slick({
      slidesToShow: 1,
      slidesToScroll: 1,
      dots: false,
      infinite: false,
      touchMove: true,
      draggable: true,
      lazyLoad: 'ondemand',
      prevArrow: '<button class="slick-prev slick-disabled"><svg preserveAspectRatio="none" class="progress" viewBox="0 0 110 110"><circle class="circle-bg" r="50" cx="55" cy="55"/><circle class="circle-go" r="50" cx="55" cy="55"/></svg></button>',
      nextArrow: '<button class="slick-next"><svg preserveAspectRatio="none" class="progress" viewBox="0 0 110 110"><circle class="circle-bg" r="50" cx="55" cy="55"/><circle class="circle-go" r="50" cx="55" cy="55"/></svg></button>',
      autoplay: true,
      autoplaySpeed: 10000,
      // easing: 'swing',
    });


    $slick.on({
      mouseenter: function() {
        isPause = true;
      },
      mouseleave: function() {
        isPause = false;
        startProgressbar();
      },
      mousedown: function() {
        $rbar.fadeOut('slow');
        percentTime = 0;
      },
      afterChange: function(event, slick, currentSlide, nextSlide) {
        if (currentSlide === slick.slideCount - 1) {
          $slick.find('.slick-prev').removeClass('slick-disabled');
          $slick.find('.slick-next').addClass('slick-disabled');
        }
        console.log(currentSlide + '_' + slick.slideCount);
      }
    });
  });
}





function startProgressbar() {
  clearTimeout(tick);
  isPause = false;
  tick = setInterval(interval, 40);
  $rbar.fadeIn('slow');
}

var $rbar = $('.circle-go');
var rlen = 2 * Math.PI * $rbar.attr('r');

function interval() {
  if (isPause === false) {
    percentTime += 1 / (time + 0.1);

    $rbar.css({
      strokeDasharray: rlen,
      strokeDashoffset: rlen * (1 - percentTime / 100)
    });
    if (percentTime >= 100) {
      $slick.slick('slickNext');
      percentTime = 0;
      startProgressbar();
    }

    //console.log('S>>>' + percentTime);
  }

}

startProgressbar();
.circle-bg {
  fill: rgba(255, 255, 255, 0.5);
  stroke: #8C8C8C;
  stroke-width: 1;
  stroke-linecap: butt;
}

.circle-go {
  fill: rgba(255, 255, 255, 0);
  stroke: red;
  stroke-width: 5;
}

.slick-arrow {
  width: 56px;
  height: 56px;
  padding: 0;
  position: absolute;
  top: 50%;
  margin-top: -28px;
  background: transparent;
  border: none;
  display: block;
  z-index: 100;
  cursor: pointer;
}

.slick-arrow.slick-disabled .circle-bg {
  fill: rgba(255, 255, 255, 0);
}

.slick-arrow.slick-disabled .circle-go {
  opacity: 0;
}

.slick-arrow svg {
  width: 100%;
  height: 100%;
}

.slick-prev {
  left: 0;
}

.slick-next {
  right: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick.min.css" integrity="sha256-UK1EiopXIL+KVhfbFa8xrmAWPeBjMVdvYMYkTAEv/HI=" crossorigin="anonymous" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.9.0/slick.min.js" integrity="sha256-NXRS8qVcmZ3dOv3LziwznUHPegFhPZ1F/4inU7uC8h0=" crossorigin="anonymous"></script>


<div class="slider-wrapper" id="slick-1">
  <div class="slider">
    <div class="slide">
      <img src="https://images.unsplash.com/photo-1585071863849-9c95194bc0d8?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=600&q=60" />
    </div>
    <div class="slide">
      <img src="https://images.unsplash.com/photo-1585071550721-fdb362ae2b8d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=600&q=60" />
    </div>
    <div class="slide">
      <img src="https://images.unsplash.com/photo-1585001971706-6a237712c0a7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=600&q=60" />
    </div>
    <div class="slide">
      <img src="https://images.unsplash.com/photo-1585068489440-879a7b089853?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=600&q=60" />
    </div>
  </div>

Вопрос: Как добавить анимацию прогресса в кнопки управления ползунком?

...