Как плавно открыть аккордеон?

Для плавного открытия аккордеона в JavaScript можно использовать анимацию или переходы. Обычно анимация основывается на изменении высоты элемента, чтобы он раскрылся постепенно. Ниже я расскажу о двух подходах к реализации данной функциональности.

  1. Использование CSS-переходов:
  • Сначала убедитесь, что у ваших аккордеонных элементов есть классы для закрытого и открытого состояний, например, .closed и .open.
  • Затем добавьте следующие CSS-стили:
.accordion {
  overflow: hidden; /* скрывает содержимое, которое не должно отображаться */
  transition: height 0.3s ease; /* анимация постепенного изменения высоты */
}

.closed {
  height: 0;
}

.open {
  height: auto; /* автоматически изменяет высоту, чтобы отобразить всё содержимое */
}
  • В JavaScript настройте обработчики событий для элементов аккордеона, которые будут добавлять или удалять классы .open и .closed.
const accordionItems = document.querySelectorAll('.accordion-item');

accordionItems.forEach(item => {
  const header = item.querySelector('.header');
  const content = item.querySelector('.content');

  header.addEventListener('click', () => {
    item.classList.toggle('open');
  });
});
  • Теперь, когда пользователь кликает на заголовок аккордеона, элементу присваивается класс .open, что приводит к плавному открытию, благодаря заданному в CSS правилу transition.
  1. Использование JavaScript-анимации:
  • В этом подходе нам понадобится развернуть аккордеон путем анимации изменения высоты, что потребует некоторой дополнительной работы с JavaScript.
  • В CSS добавьте следующий стиль:
.accordion {
  overflow: hidden; /* скрывает содержимое, которое не должно отображаться */
}

.closed {
  height: 0;
}
  • В JavaScript определите функцию анимации для плавного открытия аккордеона:
function slideDown(element) {
  element.style.display = 'block'; // убедитесь, что элемент видим
  const height = element.clientHeight;
  
  element.style.height = '0px'; // начальная высота
  
  // анимация изменения высоты
  function animate() {
    let currentHeight = parseInt(element.style.height);
    
    if (currentHeight < height) {
      element.style.height = (currentHeight + 5) + 'px'; // изменяем высоту на 5px
      requestAnimationFrame(animate); // повторяем анимацию
    } else {
      element.style.height = 'auto'; // автоматически изменяет высоту, чтобы отобразить всё содержимое
    }
  }
  
  animate(); // запускаем анимацию
}

function slideUp(element) {
  const height = element.clientHeight;
  
  // анимация изменения высоты
  function animate() {
    let currentHeight = parseInt(element.style.height);
    
    if (currentHeight > 0) {
      element.style.height = (currentHeight - 5) + 'px'; // изменяем высоту на 5px
      requestAnimationFrame(animate); // повторяем анимацию
    } else {
      element.style.display = 'none'; // скрываем элемент
    }
  }
  
  animate(); // запускаем анимацию
}
  • Затем настройте обработчики событий для элементов аккордеона, используя функции slideDown и slideUp:
const accordionItems = document.querySelectorAll('.accordion-item');

accordionItems.forEach(item => {
  const header = item.querySelector('.header');
  const content = item.querySelector('.content');

  header.addEventListener('click', () => {
    if (content.style.display === 'none') {
      slideDown(content);
    } else {
      slideUp(content);
    }
  });
});
  • Теперь, когда пользователь кликает на заголовок аккордеона, используя функцию slideDown и slideUp, элемент раскрывается или сворачивается с плавной анимацией.

Оба подхода могут быть использованы для создания плавного открытия аккордеона в JavaScript. Выбор между ними зависит от ваших предпочтений и требований проекта.