Что такое аккордеон и зачем он нужен
Аккордеон — это интерактивный UI-элемент, позволяющий пользователю раскрывать и скрывать блоки контента по клику. Обычно он используется для организации информации в компактной форме, например, в FAQ-разделах, настройках, фильтрах и других интерфейсах с ограниченным пространством.
В этой статье мы разберем, как реализовать аккордеон на чистом JavaScript и CSS без использования сторонних библиотек. Но пойдём дальше — вы узнаете и нестандартные способы его реализации, включая CSS-only подход и адаптивные особенности.
Шаг 1: Разметка HTML
Начнем с базовой структуры. Главное — понимать, что каждый элемент аккордеона состоит из заголовка (триггера) и скрытого контента. Вот минимальный пример:
```html
Содержимое первого блока.
Содержимое второго блока.
```
Обратите внимание: для улучшения доступности используем `
Шаг 2: Стилизация аккордеона с использованием CSS
Когда говорят об «аккордеоне с использованием CSS», часто имеют в виду анимации, скрытие и отображение блоков. Вот базовый стиль:
```css
.accordion-content {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
}
.accordion-item.active .accordion-content {
max-height: 500px; /* можно настроить под контент */
}
```
Совет: если вы хотите реализовать аккордеон только на CSS — это возможно с использованием чекбоксов и псевдоклассов, но будьте готовы столкнуться с ограничениями: отсутствием анимации высоты по контенту и сложностями адаптации под динамические данные.
Шаг 3: Реализация логики на чистом JavaScript
Сейчас мы рассмотрим создание аккордеона без библиотек, руководствуясь принципом минимализма. Скрипт должен по клику добавлять или удалять класс `.active`.
```javascript
document.querySelectorAll('.accordion-header').forEach(header => {
header.addEventListener('click', () => {
const item = header.parentElement;
const isOpen = item.classList.contains('active');
// Закрываем все пункты
document.querySelectorAll('.accordion-item').forEach(i => i.classList.remove('active'));
// Открываем текущий, если он был закрыт
if (!isOpen) {
item.classList.add('active');
}
});
});
```
Этот подход удобен, если вы хотите, чтобы в один момент был открыт только один блок. Но что если нужен множественный выбор?
Измените логику, убрав закрытие других блоков:
```javascript
header.addEventListener('click', () => {
header.parentElement.classList.toggle('active');
});
```
Теперь можно раскрывать сразу несколько секций — реализация аккордеона на JavaScript гибка и легко модифицируема.
Подводные камни
Новички часто допускают следующие ошибки:
- Используют `display: none` вместо `max-height`, из-за чего невозможно сделать плавную анимацию раскрытия.
- Не закрывают другие блоки при необходимости — получаем «вечное меню».
- Слишком жёстко задают высоту `max-height`, не учитывая адаптивность.
Что делать?
- Используйте `scrollHeight` для динамического управления высотой:
```javascript
const content = header.nextElementSibling;
if (item.classList.contains('active')) {
content.style.maxHeight = content.scrollHeight + 'px';
} else {
content.style.maxHeight = null;
}
```
Это позволит сделать аккордеон на чистом JavaScript более отзывчивым к содержимому.
Нестандартные решения: выходим за рамки
Стандартных реализаций много, но как сделать аккордеон вручную, при этом добавить оригинальности интерфейсу?
Вот несколько идей:
- Гармоника по горизонтали — вместо вертикальных секций создайте горизонтальную навигацию, где каждый блок раскрывается вбок.
- SVG-анимация стрелок — добавьте интерактивные иконки, вращающиеся при раскрытии. Это усилит визуальный эффект и улучшит UX.
- Авто-свертывание при скролле — если пользователь прокрутил страницу, автоматически закрывайте открытые блоки, сохраняя чистоту интерфейса.
Также, для продвинутых пользователей можно внедрить MutationObserver, чтобы отслеживать динамическое добавление блоков и автоматически подключать к ним обработчики — особенно актуально при работе с Ajax-подгрузкой.
Полезные советы
- Используйте `aria-expanded`, чтобы сделать аккордеон доступным для screen reader'ов.
- Проверяйте совместимость с мобильными устройствами — табы и клики могут вести себя по-разному.
- Минимализм — ваш друг. Не перегружайте аккордеон логикой.
Итог
Реализация аккордеона на JavaScript не требует подключения громоздких фреймворков. Создание аккордеона без библиотек — полезный навык, позволяющий лучше понять структуру событий, классов и взаимодействие с DOM.
Если вы хотите сделать простой, но функциональный аккордеон с использованием CSS — начните с базовой версии, а затем комбинируйте её с JavaScript для добавления интерактивности. Благодаря этому подходу вы не только улучшите UX сайта, но и прокачаете свои навыки фронтенда.
Экспериментируйте, адаптируйте под свои нужды и не бойтесь идти дальше стандартных решений. Ведь создание интерфейса — это не только про код, но и про эстетику и опыт пользователя.



