@SigmaMale
Middle Frontend developer (плюс минус middle)

JS не обновляет переменную с высотой элемента. Как исправить?

У мобильной версии слайдера должно быть два ряда слайдов. Для реализации этого у самого слайдера должна быть фиксированная высота, но так как контент может меняться (это карточки товаров), то и высоту контейнера нужно менять.

Я написал скрипт который определяет карточку с самой большой высотой и на основании этого рассчитывает высоту контейнера. Но есть баг: при смене размеров устройства не меняются размеры слайдера. По какой то причине переменная height рассчитывается только один раз (в первый).

const swiper = new Swiper('.slider__slider-wrapper', {
      // КОД СЛАЙДЕРА ...
    });

    // Эта функция должна рассчитывать и менять высоту слайдера
    function calcSliderHeight() {
      // Операция проводится только для смартфонов
      if (window.innerWidth < 768) {
        // Определяем высоту самой большой карточки
        let slidesHeight = [];
        for (let i = 0; i < slides.length; i++) {
          slidesHeight.push(slides[i].offsetHeight);
        }
        let height = (Math.max.apply(null, slidesHeight) * 2) + 30;

       // ВОТ ЗДЕСЬ КАЖДЫЙ РАЗ БУДЕТ ВЫВОДИТСЯ ОДНО И ТОЖЕ ЧИСЛО
       // ТО ЧИСЛО КОТОРОЕ РАССЧИТЫВАЕТСЯ В ПЕРВЫЙ РАЗ
       alert(height); 

        // Устанавливаем высоту для  .swiper-wrapper у всех блоков .slider (верстаю по БЭМ)
        let sliders = document.querySelectorAll(".slider .swiper-wrapper")
        for (let i = 0; i < sliders.length; i++) {
          sliders[i].style.cssText = `height:${height}px`;
        }
      }
    }

    // Выборка всех слайдеров
    let slides = document.querySelectorAll(".swiper-slide")
    // Первый запуск при загрузке страница
    calcSliderHeight();
    // Запускает перерасчет высоты при смене размеров экрана
    window.addEventListener('resize', calcSliderHeight);


Пробовал убрать if (window.innerWidth < 768), не помогло.
  • Вопрос задан
  • 113 просмотров
Пригласить эксперта
Ответы на вопрос 1
@TorVik_1
https://developer.mozilla.org/ru/docs/Web/API/Wind...

Я добавил таймаут к функции и все заработало
window.addEventListener("resize", resizeThrottler, false);

let resizeTimeout;
function resizeThrottler() {
  // ignore resize events as long as an actualResizeHandler execution is in the queue
  if ( !resizeTimeout ) {
    resizeTimeout = setTimeout(function() {
      resizeTimeout = null;
      actualResizeHandler();

     // The actualResizeHandler will execute at a rate of 15fps
     }, 66);
  }
}

function actualResizeHandler() {
  // handle the resize event
  console.log("asdasdd")
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы