Сброс ползунка JavaScript при изменении размера окна (НЕ jQuery)

#javascript #slider #carousel #reset #window-resize

#javascript #ползунок #карусель #Сброс #окно-изменение размера

Вопрос:

Мне не нужно решение jQuery.

Проблема: при изменении размера моей страницы слайды в слайдере расположены неправильно.

Я открыт для любого решения, но я предполагаю, что мне нужно сбросить JS для моего heroSlider при изменении размера окна.

Вот JSfiddle https://jsfiddle.net/3ou0ja4c /

 // HERO SLIDER
const heroSlider = () => {
  const carouselSlide = document.querySelector('.carousel-slide')
  let carouselImages = document.querySelectorAll('.carousel-slide .slide-bg')

  // Buttons
  const prevBtn = document.querySelector('#prevBtn')
  const nextBtn = document.querySelector('#nextBtn')

  // Timer
  let interval = setInterval( () => rotateSlide(), 5000)

  // Counter
  let counter = 1
  let size = carouselImages[0].clientWidth

  carouselSlide.style.transform = 'translateX('   (-size * counter )   'px)'

  const rotateSlide = () => {
    if (counter >= carouselImages.length -1) return
    carouselSlide.style.transition = "transform 0.4s ease-in-out"
    counter  
    carouselSlide.style.transform = 'translateX('   (-size * counter )   'px)'
  }

  // Button Listeners
  nextBtn.addEventListener('click',() => {
    clearInterval(interval)
    rotateSlide()
  })

  prevBtn.addEventListener('click', () => {
    if (counter <= 0) return
    carouselSlide.style.transition = "transform 0.4s ease-in-out"
    counter--
    carouselSlide.style.transform = 'translateX('   (-size * counter )   'px)'
    clearInterval(interval)
  })

  carouselSlide.addEventListener('transitionend', () => {
    // If image is a clone, jump to original image with no animation
    if (carouselImages[counter].id === 'lastClone'){
      carouselSlide.style.transition = "none"
      counter = carouselImages.length - 2
      carouselSlide.style.transform = 'translateX('   (-size * counter )   'px)'
    }
    if (carouselImages[counter].id === 'firstClone'){
      carouselSlide.style.transition = "none"
      counter = carouselImages.length - counter
      carouselSlide.style.transform = 'translateX('   (-size * counter )   'px)'
    }
  })
}

heroSlider()
 

Это не очень хорошо смотрится на скрипке, но вы все равно можете видеть, что он ломается при изменении размера. Он работает для всех размеров окна, если вы обновляете страницу, но я НЕ хочу, чтобы страница обновлялась при всех изменениях размера.

Вы можете увидеть реальную сделку по адресу http://www.justinkwapich.com/JH/index.html

Любая помощь действительно ценится, спасибо!

Ответ №1:

В вашей heroSlider() функции вы можете добавить прослушиватель событий, чтобы проверить, изменен ли window размер, и создать обратный вызов, в котором вы обновляете size переменную и все остальное, что зависит от этого размера:

 let counter = 1
let size = carouselImages[0].clientWidth

window.addEventListener('resize', () => {
  size = carouselImages[0].clientWidth
  carouselSlide.style.transform = 'translateX('   (-size * counter )   'px)'
  // ...
  // ...
})
 

Комментарии:

1. Спасибо. Мне пришлось добавить новый слайд, чтобы все работало правильно, но это очень помогло. Очень признателен.

2. Похоже, сейчас он работает на живом сайте. Я рад, что это сработало, но не уверен, зачем вам нужен дополнительный слайд. В любом случае, я был бы признателен, если бы вы могли принять этот ответ, если бы он помог вам решить вашу проблему 🙂