Спойлеры и аккордеоны на сайте: пошаговая разработка и стилизация
Для кого эта статья:
- Веб-разработчики и дизайнеры, начинающие или с базовым опытом
- Студенты и специалисты, заинтересованные в обучении интерактивным веб-компонентам
Менеджеры проектов и UX-дизайнеры, стремящиеся улучшить пользовательский опыт сайтов
Интерфейсы современных сайтов переполнены информацией — и часто это становится проблемой как для разработчиков, так и для посетителей. Спойлеры и аккордеоны — элегантное решение, позволяющее структурировать контент без визуального перегруза страницы. 💡 Правильно реализованные интерактивные элементы не только улучшают пользовательский опыт, но и повышают конверсию, увеличивая время нахождения пользователя на сайте. Следуя этой пошаговой инструкции, вы научитесь создавать функциональные аккордеоны даже без глубоких знаний в программировании.
Хотите научиться создавать не просто базовые, а профессиональные интерактивные элементы для веб-сайтов? Курс Обучение веб-разработке от Skypro даст вам не только теоретические знания, но и практические навыки по созданию современных интерактивных компонентов. Вы освоите продвинутую работу с JavaScript и CSS-анимациями, научитесь реализовывать плавные переходы и создавать высококонверсионные пользовательские интерфейсы, которые будут работать на всех устройствах безупречно.
Что такое спойлеры и аккордеоны на сайте: виды и применение
Спойлеры и аккордеоны — интерактивные элементы интерфейса, позволяющие скрывать и показывать содержимое по клику пользователя. Принципиальное различие между ними заключается в поведении при взаимодействии.
Спойлер (или toggle) — простой элемент, который может находиться в одном из двух состояний: открыт или закрыт. При клике он меняет своё состояние независимо от других элементов на странице.
Аккордеон — группа спойлеров, объединённых общей логикой: при открытии одного элемента все остальные автоматически закрываются. Это позволяет держать интерфейс в порядке даже при большом количестве информационных блоков.
| Тип элемента | Особенности | Применение |
|---|---|---|
| Простой спойлер | Независимое открытие/закрытие | Детали товара, дополнительная информация |
| Аккордеон | Открыт только один элемент группы | FAQ, категории товаров, фильтры |
| Вкладки (Tabs) | Визуально отличаются, но механика схожа с аккордеоном | Переключение между разделами контента |
| Многоуровневые аккордеоны | Вложенные друг в друга спойлеры | Иерархические меню, сложная документация |
Спойлеры и аккордеоны решают ряд задач:
- Экономят место на странице, позволяя компактно организовать большие объёмы информации
- Улучшают навигацию по контенту и дают пользователю контроль над тем, что он видит
- Снижают информационную перегрузку, позволяя фокусировать внимание на нужном контенте
- Улучшают пользовательский опыт на мобильных устройствах, где пространство экрана ограничено
- Повышают эстетические качества интерфейса за счёт более структурированной подачи информации
Михаил Соколов, руководитель отдела UX-дизайна
Был у меня однажды проект для юридической компании. На их сайте размещалась огромная база правовых документов — шаблоны договоров, описания юридических процедур, ответы на вопросы. Всё это выводилось сплошным текстом, и клиенты жаловались, что не могут найти нужную информацию.
Мы решили полностью переработать структуру, организовав контент в систему вложенных аккордеонов. Первый уровень — категории правовой информации, второй — подкатегории, третий — конкретные документы. Это позволило посетителям сначала выбрать интересующую их область права, затем конкретный тип документа и только потом открывать полное описание.
Результат превзошёл ожидания: время, проводимое на сайте, увеличилось на 42%, а конверсия выросла на 18%. Что особенно важно — клиенты перестали жаловаться на запутанность и сложность нахождения информации.

Базовая разметка: создание структуры HTML для аккордеонов
Начнём с создания базовой HTML-структуры для аккордеона. Качественная семантическая разметка — фундамент любого интерактивного элемента. При правильной организации кода вы обеспечите не только корректную работу, но и доступность для пользователей ассистивных технологий. 🔍
Основные элементы разметки аккордеона:
- Контейнер — обёртка для всего аккордеона
- Заголовок — кликабельный элемент (триггер)
- Контент — скрываемая/показываемая часть
- Иконка состояния — визуальный индикатор (например, стрелка или плюс/минус)
Вот пример базовой HTML-разметки для создания аккордеона:
<div class="accordion-container">
<!-- Первый элемент аккордеона -->
<div class="accordion-item">
<div class="accordion-header">
<h3>Первый раздел</h3>
<span class="icon">+</span>
</div>
<div class="accordion-content">
<p>Содержимое первого раздела...</p>
</div>
</div>
<!-- Второй элемент аккордеона -->
<div class="accordion-item">
<div class="accordion-header">
<h3>Второй раздел</h3>
<span class="icon">+</span>
</div>
<div class="accordion-content">
<p>Содержимое второго раздела...</p>
</div>
</div>
</div>
При создании аккордеонов следует учитывать важные нюансы для обеспечения доступности (accessibility):
- Используйте атрибуты aria-expanded, aria-controls и aria-labelledby для соответствия стандартам доступности
- Обеспечьте управление с клавиатуры (TabIndex, обработка клавиши Enter)
- Используйте семантически правильные теги, например <button> для заголовков
- Добавьте скринридер-дружественные подсказки о состоянии элемента
Вот пример улучшенной разметки с учётом доступности:
<div class="accordion-container">
<div class="accordion-item">
<button
class="accordion-header"
id="heading-1"
aria-expanded="false"
aria-controls="content-1">
Первый раздел
<span class="icon" aria-hidden="true">+</span>
</button>
<div
id="content-1"
class="accordion-content"
aria-labelledby="heading-1">
<p>Содержимое первого раздела...</p>
</div>
</div>
</div>
При необходимости создания вложенных аккордеонов используйте тот же принцип, размещая новые элементы внутри accordion-content. Это позволяет создавать многоуровневые иерархические структуры.
CSS-стилизация спойлеров: от простых решений до анимаций
После создания HTML-структуры необходимо добавить стили, которые не только сделают наш аккордеон визуально привлекательным, но и обеспечат правильное отображение состояний "открыто/закрыто". CSS позволяет реализовать как простые, так и сложные анимированные решения. 💫
Основные стили для аккордеона:
/* Базовые стили для контейнера */
.accordion-container {
width: 100%;
max-width: 600px;
margin: 0 auto;
border-radius: 8px;
overflow: hidden;
}
/* Стили для заголовка */
.accordion-header {
display: flex;
justify-content: space-between;
align-items: center;
background-color: #f4f4f4;
padding: 15px 20px;
cursor: pointer;
border: none;
width: 100%;
text-align: left;
font-weight: 500;
}
.accordion-header:hover {
background-color: #e8e8e8;
}
/* Стили для контента */
.accordion-content {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
padding: 0 20px;
}
/* Состояние открытого элемента */
.accordion-item.active .accordion-content {
max-height: 200px; /* Примерная высота контента */
padding: 15px 20px;
border-bottom: 1px solid #ddd;
}
/* Анимация иконки */
.accordion-item .icon {
transition: transform 0.3s ease;
}
.accordion-item.active .icon {
transform: rotate(45deg);
}
Существует несколько подходов к реализации открытия/закрытия контента с помощью CSS:
| Метод | Преимущества | Недостатки |
|---|---|---|
| max-height | Плавная анимация, работает во всех браузерах | Требует установки фиксированного значения, может вызвать задержки при анимации |
| display: none/block | Простота реализации | Невозможно анимировать переходы |
| height + overflow | Точная анимация | Требует JavaScript для вычисления высоты |
| transform: scaleY() | Производительная анимация | Может вызывать искажения содержимого |
Для создания более изысканных анимаций можно использовать дополнительные CSS-свойства:
@keyframes slideDown {
from { opacity: 0; transform: translateY(-10px); }
to { opacity: 1; transform: translateY(0); }
}
.accordion-item.active .accordion-content {
animation: slideDown 0.4s ease forwards;
}
Продвинутые техники стилизации аккордеонов:
- Применение CSS-переменных для гибкой настройки
- Использование CSS Grid для создания сложных макетов внутри контента
- Реализация адаптивного поведения под различные размеры экрана
- Добавление индикаторов состояния через псевдоэлементы
- Плавные переходы между состояниями с использованием transition-delay
Анна Владимирова, фронтенд-разработчик
Когда мне поручили разработать сайт каталога для мебельного магазина, заказчик поставил условие: на мобильных устройствах интерфейс должен быть максимально компактным, но при этом предоставлять все детали товаров.
Я создала адаптивную систему аккордеонов с продуманной анимацией. Главная проблема возникла при анимации контента произвольной высоты – метод с max-height давал неприятные задержки. Решение нашлось в комбинированном подходе: сначала JavaScript вычислял точную высоту элемента, затем CSS выполнял анимацию.
Для экономии времени пользователя я добавила микроанимации, визуально подсказывающие, что элемент интерактивный – легкое покачивание иконки при наведении, плавное изменение цвета. После запуска сайта время, проведенное посетителями в каталоге, увеличилось на 27%, а конверсия мобильных пользователей выросла почти вдвое. Эффективный UX работает не хуже прямой рекламы.
JavaScript для интерактивности: техническая реализация спойлеров
После настройки HTML и CSS необходимо добавить JavaScript для обработки взаимодействия пользователя с аккордеоном. JavaScript делает элементы по-настоящему интерактивными, обрабатывая клики и управляя состояниями. ⚙️
Базовая реализация интерактивности с помощью JavaScript:
document.addEventListener('DOMContentLoaded', function() {
// Получаем все заголовки аккордеона
const accordionHeaders = document.querySelectorAll('.accordion-header');
// Добавляем обработчики событий
accordionHeaders.forEach(header => {
header.addEventListener('click', function() {
// Находим родительский элемент
const accordionItem = this.parentElement;
// Переключаем класс active
accordionItem.classList.toggle('active');
// Обновляем ARIA-атрибут
const expanded = accordionItem.classList.contains('active');
this.setAttribute('aria-expanded', expanded);
// Обновляем текст иконки
const icon = this.querySelector('.icon');
if (icon) {
icon.textContent = expanded ? '-' : '+';
}
});
});
});
Для создания полноценного аккордеона с поведением "открыт только один элемент" необходимо добавить дополнительную логику:
document.addEventListener('DOMContentLoaded', function() {
const accordionHeaders = document.querySelectorAll('.accordion-header');
accordionHeaders.forEach(header => {
header.addEventListener('click', function() {
// Находим родительский элемент
const currentItem = this.parentElement;
// Получаем все элементы аккордеона
const allItems = document.querySelectorAll('.accordion-item');
// Закрываем все элементы
allItems.forEach(item => {
if (item !== currentItem) {
item.classList.remove('active');
const itemHeader = item.querySelector('.accordion-header');
itemHeader.setAttribute('aria-expanded', 'false');
const icon = itemHeader.querySelector('.icon');
if (icon) icon.textContent = '+';
}
});
// Переключаем текущий элемент
currentItem.classList.toggle('active');
const expanded = currentItem.classList.contains('active');
this.setAttribute('aria-expanded', expanded);
const icon = this.querySelector('.icon');
if (icon) icon.textContent = expanded ? '-' : '+';
});
});
});
Для более точной анимации с использованием height вместо max-height можно применить следующий подход:
function toggleAccordion(header) {
const accordionItem = header.parentElement;
const content = accordionItem.querySelector('.accordion-content');
// Если элемент уже открыт – закрываем
if (accordionItem.classList.contains('active')) {
// Устанавливаем высоту равной текущей высоте, чтобы анимация работала
content.style.height = content.scrollHeight + 'px';
// Вызываем перерисовку для применения стиля
content.offsetHeight;
// Устанавливаем высоту в 0 для анимации закрытия
content.style.height = 0;
accordionItem.classList.remove('active');
header.setAttribute('aria-expanded', 'false');
}
// Если элемент закрыт – открываем
else {
// Устанавливаем точную высоту содержимого
content.style.height = content.scrollHeight + 'px';
accordionItem.classList.add('active');
header.setAttribute('aria-expanded', 'true');
// После завершения анимации удаляем фиксированную высоту
content.addEventListener('transitionend', function() {
if (accordionItem.classList.contains('active')) {
content.style.height = 'auto';
}
}, { once: true });
}
}
Дополнительные функции, которые можно реализовать с помощью JavaScript:
- Управление с клавиатуры (поддержка Tab, Enter, Arrow keys)
- Открытие/закрытие всех элементов по кнопке
- Автоматическое открытие элемента при загрузке страницы
- Сохранение состояния в localStorage для сохранения между сессиями
- Плавная прокрутка к открытому элементу для длинных списков
Готовые библиотеки и фреймворки для быстрого внедрения аккордеонов
Не всегда есть время или необходимость создавать аккордеоны с нуля. В таких случаях можно воспользоваться готовыми решениями, которые предоставляют различные библиотеки и фреймворки. Это позволит существенно ускорить процесс разработки, при этом получая качественный и проверенный результат. 🚀
Наиболее популярные готовые решения для внедрения аккордеонов:
| Библиотека/фреймворк | Особенности | Размер | Сложность интеграции |
|---|---|---|---|
| Bootstrap | Полный фреймворк с множеством компонентов | ~150KB (минимум) | Низкая |
| jQuery UI | Требует jQuery, имеет обширные опции настройки | ~100KB | Средняя |
| Accordion.js | Легковесное решение только для аккордеонов | ~5KB | Низкая |
| React-Accessible-Accordion | Компонент для React с полной доступностью | ~10KB | Средняя (требует React) |
| Vue-Accordion | Компонент для Vue.js | ~8KB | Средняя (требует Vue) |
Пример использования аккордеона Bootstrap:
<!-- Подключаем CSS и JavaScript Bootstrap -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<!-- Разметка аккордеона Bootstrap -->
<div class="accordion" id="accordionExample">
<div class="accordion-item">
<h2 class="accordion-header" id="headingOne">
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
Элемент аккордеона #1
</button>
</h2>
<div id="collapseOne" class="accordion-collapse collapse show" aria-labelledby="headingOne" data-bs-parent="#accordionExample">
<div class="accordion-body">
Содержимое первого элемента аккордеона.
</div>
</div>
</div>
<div class="accordion-item">
<h2 class="accordion-header" id="headingTwo">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
Элемент аккордеона #2
</button>
</h2>
<div id="collapseTwo" class="accordion-collapse collapse" aria-labelledby="headingTwo" data-bs-parent="#accordionExample">
<div class="accordion-body">
Содержимое второго элемента аккордеона.
</div>
</div>
</div>
</div>
Для jQuery UI аккордеона достаточно следующего кода:
<!-- Подключение jQuery и jQuery UI -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://code.jquery.com/ui/1.13.1/jquery-ui.min.js"></script>
<link rel="stylesheet" href="https://code.jquery.com/ui/1.13.1/themes/base/jquery-ui.css">
<!-- HTML-разметка -->
<div id="accordion">
<h3>Раздел 1</h3>
<div>
<p>Содержимое первого раздела</p>
</div>
<h3>Раздел 2</h3>
<div>
<p>Содержимое второго раздела</p>
</div>
</div>
<script>
$(function() {
$("#accordion").accordion({
collapsible: true,
heightStyle: "content"
});
});
</script>
Преимущества использования готовых решений:
- Экономия времени разработки
- Оптимизированный код, протестированный на различных устройствах
- Встроенная доступность и поддержка клавиатурной навигации
- Регулярные обновления и исправления ошибок от сообщества
- Обширная документация и множество примеров использования
При выборе готового решения учитывайте следующие факторы:
- Соответствие вашей технологической экосистеме (React, Vue, Angular и т.д.)
- Размер библиотеки и её влияние на производительность сайта
- Гибкость настройки стилей и поведения
- Поддержка требуемых функций (анимации, вложенность, мобильная адаптивность)
- Уровень поддержки и активность сообщества вокруг библиотеки
Создание спойлеров и аккордеонов — важный навык в арсенале современного веб-разработчика. Эти компоненты значительно улучшают пользовательский опыт, делая интерфейсы более понятными и удобными. Независимо от выбранного подхода — разработка с нуля или использование готовых библиотек — ключевым фактором успеха остается понимание принципов работы и особенностей реализации. Помните, что качественный аккордеон должен быть не только красивым, но и доступным, отзывчивым и интуитивно понятным для всех категорий пользователей.