Событие щелчка на ползунке идет в конец массива

Я пытаюсь создать простой слайдер с помощью javascript. Пока вот мой код:

HTML:

  <div class = "carousel-container">

    <div class = "slides-container">
      <div class = "slide">
        <img src = "assets/images/image-1.jpg" alt = "">
      </div>
      <div class = "slide">
        <img src = "assets/images/image-3.jpg" alt = "">
      </div>
      <div class = "slide">
        <img src = "assets/images/image-2.jpg" alt = "">
      </div>
      <div class = "slide">
        <img src = "assets/images/image-3.jpg" alt = "">
      </div>
    </div>

  </div>

  <div class = "carousel-nav">
    <button class = "button-previous">Previous</button>
    <button class = "button-next">Next</button>
  </div>

Дж:

    const slides = document.querySelectorAll('.slide')
    const slidesContainer = document.querySelector('.slides-container')
    const slidesCount = slides.length
    const slideWidth = slides[0].clientWidth

    const prevButton = document.querySelector('.button-previous')
    const nextButton = document.querySelector('.button-next')

    function nextSlide(slide) {
      for (slide = 0; slide < slidesCount; slide++) {
        slidesContainer.style.transform = 'translateX(-' + (slide * slideWidth) + 'px)'
      }
    }

    nextButton.addEventListener('click', function() {
      nextSlide()
    })

У меня проблема в том, что когда я нажимаю следующую кнопку, ползунок перемещается до конца моего массива, пропуская все изображения между ними.

Что было бы лучшим способом, чтобы мой цикл for останавливался на каждом изображении и повторялся при нажатии кнопки?

Вы пытаетесь заставить его ненадолго останавливаться на каждом слайде, прежде чем перейти к «следующему» слайду?

Ito Pizarro 03.06.2019 18:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
44
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

let current = 0;

function nextSlide(slide) {
      if (current < slidesCount) {
        slidesContainer.style.transform = 'translateX(-' + (slide * slideWidth) + 'px)';
        current++;
      }
}
Ответ принят как подходящий

Причина, по которой он пропускается до конца при каждом нажатии: цикл for(). Вы циклически проходите через все слайдов, создавая новую translateX координату при каждом проходе — по клику каждый. Оставляя вас с последним значением каждый раз.

Ответ, который дал ДешевыйГеймер, определяет шаблон, позволяющий избежать ловушки цикла for(), отслеживая текущий индекс «слайда» за пределами обработчика nextSlide().

let current = 0; // <- independent index reference

function nextSlide(slide) {
      if (current < slidesCount) {
        slidesContainer.style.transform = 'translateX(-' + (current * slideWidth) + 'px)';
        current++;  // <- increment the index
      }
}
// I changed the `slide` reference in `(slide * slideWidth)` to `current`  to reflect the intent of the code

Это позаботится о том, чтобы вы увеличивались в карусели до тех пор, пока current не станет равным 3. (Аргумент slide в nextSlide(slide) необязателен.)

Возможно, я не совсем понимаю, что вы пытаетесь сделать или почему вы собираетесь использовать цикл for, но если речь идет просто о выборе следующего слайда, вы можете использовать это:

var currentSlide = 0;

function nextSlide() {
  //make sure currentSlide is in range
  currentSlide = (currentSlide >= slidesCount) ? 0 : ++currentSlide;

  slidesContainer.style.transform = 'translateX(-' + (currentSlide * slideWidth) + 'px)';
}

nextButton.addEventListener('click', nextSlide);

или немного более гибкий:

var currentSlide = 0;

function nextSlide(direction /* Number */) {
  if (!direction) direction = 1; //default

  setSlide(currentSlide + direction % slidesCount);
}

function setSlide(index) {
  if (index === currentSlide) return;

  //make sure index is in range
  while(index >= slidesCount) index -= slidesCount;
  while(index < 0) index += slidesCount;

  slidesContainer.style.transform = 'translateX(-' + (index * slideWidth) + 'px)';

  currentSlide = index;
}

nextButton.addEventListener('click', function() {
  nextSlide(this.dataset["direction"]); //by using data you don't need two different button classes
});

Но если вы настаиваете на использовании цикла, я боюсь сказать, что это неуместно в данном случае, поскольку вычисление translateX основано на заданном значении.

Другие вопросы по теме