CSS-аккордеон без JavaScript: чекбоксы и радиокнопки
TL;DR
Кратко: показаны три подхода к аккордеону на чистом HTML/CSS — встроенные теги , кастомный аккордеон на чекбоксах (несколько открытых вкладок) и на радиокнопках (только одна вкладка). Приведены рабочие HTML/CSS‑фрагменты, подсказки по стилю, доступности и советы по анимации и сценариям, где CSS‑аккордеон может не подойти.

CSS-аккордеоны широко применяются для разворачиваемых меню, сниппетов, изображений, видео, FAQ, списков и выдержек из статей. Их можно реализовать с HTML/CSS и JavaScript. Но реализация только на HTML/CSS полезна там, где JavaScript отключён или нежелателен.
В этом руководстве пошагово показано, как создать аккордеон без JavaScript: базовый HTML‑вариант, кастомный аккордеон на чекбоксах и на радиокнопках, стили и советы по анимации.
Построение базового аккордеона только на HTML
Если важна доступность и простота, используйте теги . Это нативный, семантически верный и доступный способ — он корректно работает без дополнительного кода и с любыми языками программирования на сервере.
HTML-пример (несколько FAQ):
FAQ 1
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Ratione adipisci illum error, hic expedita numquam impedit explicabo vitae iure quae vero autem quia quibusdam tempora atque harum perferendis praesentium dolor!
FAQ 2
Consequuntur earum pariatur dolorem repellat temporibus ducimus sunt suscipit repudiandae cupiditate in accusantium recusandae tempora sint eligendi, perferendis aspernatur architecto voluptas laborum adipisci neque voluptates consequatur.
FAQ 3
Tenetur, ex delectus, perferendis aperiam voluptatem consequuntur molestiae ratione rerum vitae ab modi, minus placeat quis dignissimos. Dolorem quaerat odit, iusto laboriosam possimus, in architecto aliquam commodi sapiente saepe sequi at eligendi hic reprehenderit repellendus quos!
Преимущества HTML-only варианта
- Автоматическая доступность для экранных читалок и клавиатурной навигации;
- Минимум кода, нативное поведение (открыть/закрыть);
- Работает без CSS и JavaScript (хотя стили рекомендуются для внешнего вида).
Ограничение: нативный
body {
font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
max-width: 30rem;
margin: 1.5rem auto;
}
summary {
font-weight: 600;
color: rgb(255, 255, 255);
background-color: rgb(7, 185, 255);
padding: 1.2rem;
margin-bottom: 1.2rem;
border-radius: 0.5rem;
cursor: pointer;
}Вывод:
Создаём кастомный FAQ на CSS (без JavaScript)
Если нужна точная кастомизация внешнего вида, и вы хотите контролировать псевдоэлементы, иконки, анимации — делаем аккордеон с использованием скрытых input (checkbox или radio). Есть два популярных подхода:
- Метод на чекбоксах — позволяет открывать несколько секций одновременно;
- Метод на радиокнопках — только одна секция открыта одновременно.
Метод с чекбоксами
Логика: у каждой секции есть скрытый input type=”checkbox”. По состоянию :checked с помощью селекторов соседства меняется стиль label и показывается контент.
HTML (пример):
Custom CSS Only Accordion (FAQ)
Using Checkbox method
Lorem ipsum dolor sit amet consectetur adipisicing elit. Harum debitis voluptas aliquid tenetur quas suscipit assumenda a, nesciunt eum nobis eaque, exercitationem distinctio alias ullam quia. Corrupti beatae necessitatibus nihil.
Temporibus vel dolore nam dolorem similique voluptatum. Aliquam, dolor et! Tempore mollitia voluptatibus ducimus excepturi doloribus aliquam ipsum vel, accusantium quo nemo expedita esse eos libero incidunt reprehenderit facere ex hic ipsa odit in! Eveniet.
Общий базовый CSS:
body {
color: #502c2c;
background: #f1edec;
padding: 1.2rem;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
max-width: 45rem;
margin: 0 auto;
font-size: 1.2rem;
}Скрываем настоящие чекбоксы и радиокнопки (технически input остаётся доступным для клавиатуры и скринридеров):
/* Скрытие input (checkbox / radio) */
input {
position: absolute;
opacity: 0;
z-index: -1;
}Стили для собственно аккордеона (кратко):
/* Стиль аккордеона */
.faq {
color: #ffe3e3;
margin-bottom: 3rem;
}
.faq-label {
font-size: 1.5rem;
display: flex;
align-items: center;
justify-content: space-between;
padding: 1em;
background: #b61818;
font-weight: bold;
cursor: pointer;
user-select: none;
}
.faq-label::after {
content: '\002B'; /* плюс */
padding: 0.51rem;
transform: scale(1.8);
text-align: center;
transition: all 0.35s;
}
.faq-content {
max-height: 0;
padding: 0 1em;
color: #2c3e50;
background: white;
transition: all 0.35s;
display: none;
}
/* Показ содержимого при checked */
input:checked + .faq-label {
background: #8f1414;
}
input:checked + .faq-label::after {
content: '\2013'; /* тире вместо плюса */
transform: scale(1.5);
}
input:checked ~ .faq-content {
max-height: 100vh;
padding: 1em;
display: block;
transition: all 0.35s;
}Вывод:
-using-Checkbox-Mehtod.jpg?q=50&fit=crop&w=825&dpr=1.5)
Метод с радиокнопками
Логика: похож на чекбоксы, но input type=”radio” с одинаковым name обеспечивает, что открыта только одна секция одновременно. Для возможности полного закрытия добавляют «пустую» радиокнопку‑переключатель “Close all”.
HTML (пример):
Custom CSS Only Accordion (FAQ)
Using the Radio Button method
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Voluptatibus maiores quisquam atque dicta eum numquam necessitatibus, nisi non adipisci temporibus corrupti libero hic aspernatur quibusdam dolores perferendis, officiis odio repellendus.
Aperiam dolores autem odit, nihil eius sit minima quas laudantium aspernatur possimus reiciendis vitae ducimus labore quidem velit vel temporibus! Illo sunt placeat officiis, tiure magnam.
Laudantium quibusdam laboriosam hic omnis quas ullam commodi rem. Architecto ut laborum eaque cum porro doloremque hic cupiditate tempora temporibus ducimus dolores magnam quidem, facilis sapiente officiis voluptas?
CSS для «Close all» (пример):
.faq-label {
position: relative;
}
.faq-close {
display: inline-block;
padding: 1rem;
font-size: 1rem;
background: #b61818;
cursor: pointer;
position: absolute;
left: 64rem;
}Вывод:
-using-the-Radio-Method.jpg?q=50&fit=crop&w=825&dpr=1.5)
Советы по анимации и улучшениям
- Для плавного разворачивания используйте max-height вместе с transition или CSS-анимации keyframes для более сложных эффектов;
- Для иконок используйте CSS-псевдоэлементы ::before/::after, SVG или webfont‑иконки;
- Учтите, что display: none нельзя анимировать — вместо него переключайте max-height/opacity/transform;
- Сохраняйте доступность: метки label, фокусируемые элементы и логичная последовательность DOM.
Важно: у радиокнопок всегда одна выбранная опция; чтобы иметь возможность полностью закрыть аккордеон, нужен управляющий «Close all»‑input.
Когда CSS-only аккордеон не подходит
- Требуются сложные асинхронные операции при открытии секции (загрузка данных, lazy‑fetch) — лучше JS;
- Нужна тонкая синхронизация состояния с URL/history (то есть deep linking) — удобнее реализовать на JS;
- Требуются сложные интерактивные сценарии (перетаскивание, динамическое добавление секций) — JS более гибок.
Альтернативные подходы
- Использовать /
для простых случаев и лучшей доступности;
- Аккордеон на JS — полный контроль состояния и анимаций, динамика и интеграция с API;
- Библиотеки UI (например, компонентные библиотеки) — экономят время при сложных интерфейсах.
Мини‑методология: как выбрать подход
- Оцените требования: нужен ли доступ для скринридеров и работа без JS?
- Если «да» — используйте или CSS‑only;
- Нужна динамика/асинхронность — выбирайте JS;
- Для UX: чекбоксы — несколько открытых, радио — одна открытая.
flowchart TD
A[Есть ли требование 'работать без JS?'] -->|Да| B[Использовать или CSS-only]
A -->|Нет| C[Требуется динамика?]
C -->|Да| D[Использовать JS-аккордеон]
C -->|Нет| B
B --> E{Несколько открытых?}
E -->|Да| F[Чекбоксы]
E -->|Нет| G[Радио]Чеклист перед публикацией
- Проверить фокусировку клавиатурой (Tab/Shift+Tab);
- Убедиться, что label правильно связан с input (for / id);
- Проверить внешний вид в мобильных размерах;
- Добавить тесты на поведение (открыть/закрыть, анимация);
- Проверить работу без JavaScript (если это требование).
Критерии приёмки
- Все секции корректно открываются/закрываются клавиатурой;
- Контент не перекрывается при анимации (нет дерганья страницы);
- Экранные читалки читают заголовки секций и контент;
- Для радиоварианта можно закрыть все через управляющий input (если требуется).
Короткая шпаргалка (cheat sheet)
- Плюс/минус в заголовке: content: ‘\002B’ и ‘\2013’;
- Скрытие input: position:absolute; opacity:0; z-index:-1; — оставляет доступность;
- Анимация разворачивания: transition: max-height 0.35s ease, padding 0.35s;
- Не анимируйте display; вместо него используйте opacity/transform/max-height.
Однострочный глоссарий
- Аккордеон — UI‑компонент с секциями, которые можно разворачивать/сворачивать;
- :checked — CSS‑состояние для input, используемое для управления стилями;
- /
— нативный HTML для простых раскрывающихся блоков.
Заключение
Кратко: если нужен простой, доступный и надёжный аккордеон — начните с . Для точной стилизации и кастомных анимаций применяйте подходы на скрытых input (чекбоксы или радио). Если же требуется динамичная логика, асинхронные загрузки или интеграция с историей браузера — используйте JavaScript.
Примечание: экспериментируйте с анимациями и макетом (горизонтальные аккордеоны, изображения внутри секций), но сохраняйте доступность и предсказуемое поведение для пользователей.
Похожие материалы
Safari на Apple Watch: как открыть веб-страницу
Конвертация единиц в Windows 11
Замена экрана смартфона — как сделать самому
USB‑ключ для ремонта и обслуживания ПК
iCloud на Windows: установка и синхронизация