Раскрывающиеся блоки позволяют скрывать и показывать контент по запросу пользователя, оптимизируя пространство на странице и повышая удобство взаимодействия. В HTML их можно реализовать без использования сторонних библиотек, опираясь на встроенные элементы <details> и <summary>.
Элемент <details> автоматически добавляет функциональность разворачивания и сворачивания блока. Заголовок блока определяется через вложенный элемент <summary>. Пользователь может кликнуть по заголовку, чтобы открыть или закрыть содержимое. Поддержка этих элементов встроена во все современные браузеры, включая Chrome, Firefox, Safari и Edge.
Для более гибкой настройки внешнего вида раскрывающегося блока можно комбинировать HTML с CSS. Например, скрыть стандартные маркеры раскрытия и добавить собственные иконки через свойства appearance: none и background-image. Это позволяет добиться более аккуратного и адаптивного дизайна без утраты функциональности.
Если требуется более сложное поведение, например, анимация открытия или множественные вложенные блоки, можно дополнительно использовать JavaScript. В простейшем случае достаточно повесить обработчик события click на заголовок и переключать классы для управления отображением содержимого.
Базовая разметка для раскрывающегося блока с использованием тега <details>
Элемент <details>
предназначен для создания нативного раскрывающегося блока без необходимости использования JavaScript. Он поддерживается всеми современными браузерами.
Минимальная структура раскрывающегося блока:
<details>
<summary>Заголовок блока</summary>
Контент, который станет видимым после раскрытия.
</details>
Ключевые особенности:
<summary>
– обязательный элемент для отображения заголовка, по которому пользователь кликает для раскрытия содержимого.- Если
<summary>
отсутствует, браузер всё равно отобразит блок, но пользовательский опыт ухудшится. - Текст и другие элементы внутри
<details>
будут скрыты до раскрытия, за исключением содержимого<summary>
.
Дополнительные рекомендации по разметке:
- Внутрь
<details>
можно добавлять любые блочные и строчные элементы: списки, абзацы, ссылки. - Для начального раскрытия блока необходимо добавить атрибут
open
к тегу<details>
. - Желательно обеспечивать доступность с помощью атрибутов
aria-expanded
иaria-controls
при кастомной стилизации.
Пример раскрытого по умолчанию блока:
<details open>
<summary>Подробнее</summary>
Здесь находится дополнительная информация.
</details>
Создание раскрывающегося блока на чистом HTML и CSS без JavaScript
Для реализации раскрывающегося блока без использования JavaScript потребуется элемент <details>, который поддерживается большинством современных браузеров.
Базовая структура выглядит так:
<details>
<summary>Заголовок блока</summary>
Контент, который будет отображаться после раскрытия.
</details>
Элемент <summary> служит интерактивным заголовком. При клике по нему происходит раскрытие или сворачивание вложенного содержимого автоматически, без дополнительного кода.
Чтобы изменить внешний вид раскрывающегося блока, применяется CSS. Например, чтобы стилизовать заголовок и скрыть стандартный маркер:
details summary {
cursor: pointer;
list-style: none;
}
details summary::-webkit-details-marker {
display: none;
}
Добавление анимации открытия блока возможно через манипуляцию свойствами max-height и overflow с использованием псевдокласса :not([open]):
details {
overflow: hidden;
transition: max-height 0.3s ease;
}
details:not([open]) {
max-height: 2em;
}
details[open] {
max-height: 500px;
}
Следует учитывать, что значение max-height должно быть достаточно большим для полного отображения содержимого. Ограничение заключается в невозможности плавного перехода высоты без точного знания размера содержимого, однако в простых случаях этот способ работает эффективно.
Использование <details> и <summary> обеспечивает нативную доступность, так как элементы автоматически получают поддержку клавиатуры и читателей экрана без дополнительной настройки.
Добавление анимации раскрытия блока через CSS переходы
Чтобы реализовать плавное раскрытие блока, необходимо анимировать свойство max-height
, так как CSS не поддерживает переходы для свойства height: auto
. Начальное значение устанавливается равным нулю, а максимальное – заранее подобранной высоте, превышающей предполагаемое содержимое блока.
Пример базовых стилей для анимации:
.collapsible {
max-height: 0;
overflow: hidden;
transition: max-height 0.5s ease-out;
}
.collapsible.active {
max-height: 500px;
}
Класс active
добавляется к элементу при клике с помощью JavaScript. Плавность задается через свойство transition
с указанием продолжительности и функции ускорения. Значение max-height
подбирается с запасом, чтобы избежать обрезания содержимого.
Для более точного управления можно использовать динамическое присвоение реальной высоты элемента:
const block = document.querySelector('.collapsible');
block.style.maxHeight = block.scrollHeight + 'px';
Свойство scrollHeight
позволяет учитывать фактическую высоту содержимого, что устраняет необходимость задания фиксированных значений в CSS.
Создание кастомной кнопки для управления раскрытием блока
Чтобы создать кнопку для управления раскрывающимся блоком, используйте элемент <button>
с атрибутами, которые позволят менять состояние содержимого. Задайте кнопке уникальный идентификатор для дальнейшей привязки событий JavaScript.
Пример кнопки: <button id="toggleButton">Показать</button>
.
Создайте скрытый блок с идентификатором, например: <div id="contentBlock" style="display: none;">Содержимое блока</div>
.
Для переключения состояния используйте следующий скрипт:
const button = document.getElementById('toggleButton');
const content = document.getElementById('contentBlock');
button.addEventListener('click', () => {
const isHidden = content.style.display === 'none';
content.style.display = isHidden ? 'block' : 'none';
button.textContent = isHidden ? 'Скрыть' : 'Показать';
});
Рекомендуется использовать текст кнопки для отображения текущего состояния блока. Это улучшит понятность интерфейса для пользователя.
Не полагайтесь только на изменение свойства display
через атрибуты HTML. Для динамической работы лучше управлять стилями через JavaScript, чтобы избежать конфликтов с внешними CSS-правилами.
Если требуется плавная анимация раскрытия, добавьте классы с CSS-переходами и переключайте их через JavaScript вместо изменения inline-стилей.
Обработка событий открытия и закрытия блока с помощью JavaScript
Для управления раскрытием блока через JavaScript необходимо использовать обработчики событий на клике. В первую очередь, требуется получить ссылку на элемент-блок и элемент-триггер, например, кнопку:
const toggleButton = document.querySelector(‘.toggle-button’);
const contentBlock = document.querySelector(‘.content-block’);
Далее следует добавить слушатель событий:
toggleButton.addEventListener(‘click’, function() {
contentBlock.classList.toggle(‘active’);
});
Класс active должен отвечать за отображение блока через CSS-свойства, например: изменение высоты, прозрачности или использование display: block.
Чтобы точно определить состояние блока, используйте проверку наличия класса:
if (contentBlock.classList.contains(‘active’)) {
// Блок открыт
} else {
// Блок закрыт
}
Рекомендуется отделять функции открытия и закрытия для повышения читаемости кода:
function openBlock() {
contentBlock.classList.add(‘active’);
}
function closeBlock() {
contentBlock.classList.remove(‘active’);
}
Можно добавить анимацию раскрытия и сворачивания через JavaScript, управляя свойствами style.height с использованием scrollHeight:
function expandBlock() {
contentBlock.style.height = contentBlock.scrollHeight + ‘px’;
}
function collapseBlock() {
contentBlock.style.height = ‘0’;
}
Для плавности рекомендуется сочетать управление высотой с CSS-переходами (transition).
Также важно учитывать события завершения анимации (transitionend), чтобы корректно обрабатывать состояние блока после изменения его высоты:
contentBlock.addEventListener(‘transitionend’, function() {
// Завершено раскрытие или сворачивание
});
При работе с несколькими блоками используйте делегирование событий или привязывайте обработчики к каждому элементу через цикл.
Подключение нескольких независимых раскрывающихся блоков на одной странице
Для создания нескольких независимых раскрывающихся блоков на одной странице в HTML, можно использовать сочетание элементов <details>
и <summary>
. Каждый блок будет работать отдельно, независимо от других, без необходимости в сложных JavaScript-решениях. Это значительно упрощает реализацию и улучшает производительность страницы.
Пример кода с несколькими раскрывающимися блоками:
Блок 1
Содержание первого блока.
Блок 2
Содержание второго блока.
Блок 3
Содержание третьего блока.
Каждый элемент <details>
сам по себе является раскрывающимся контейнером. Он включает в себя заголовок <summary>
, который кликабелен и инициирует раскрытие или сворачивание содержимого. Для того чтобы блоки работали независимо, достаточно их просто разместить в разных местах страницы, и каждый из них будет функционировать в рамках своего контекста.
Важно помнить, что при использовании нескольких таких блоков на одной странице, каждый из них будет иметь отдельное состояние раскрытия. Это означает, что при открытии одного блока, другие останутся в исходном состоянии – свёрнутыми. Это достигается за счет использования стандартных элементов HTML5, без дополнительных скриптов и стилей.
Если необходимо изменить поведение, например, закрыть все блоки при открытии нового, для этого потребуется подключить немного JavaScript. Однако в базовом случае это не требуется.
Таким образом, использование <details>
и <summary>
позволяет легко и эффективно интегрировать несколько независимых раскрывающихся блоков на одной странице, минимизируя количество кода и повышая удобство работы с сайтом.
Рекомендации по доступности раскрывающихся блоков для пользователей с особыми потребностями
Раскрывающиеся блоки должны быть доступны для всех пользователей, включая людей с ограниченными возможностями. Чтобы обеспечить удобство использования таких элементов, необходимо соблюдать несколько ключевых принципов.
- Использование правильных элементов управления: раскрывающиеся блоки должны быть реализованы с помощью семантических HTML-элементов, таких как
<button>
для кнопок и<details>
для раскрывающихся блоков. Это улучшает доступность, поскольку экраны чтения и другие assistive technologies могут распознавать эти элементы и правильно их интерпретировать. - Обеспечение фокуса клавишами: раскрывающиеся блоки должны быть управляемы с помощью клавиатуры. Кнопки, открывающие или закрывающие блок, должны быть доступны с помощью клавиш
Tab
иEnter
, а такжеSpace
для открытия/закрытия. Также важно правильно устанавливать фокус на элемент после открытия блока, чтобы пользователь не потерял контекст. - Использование ARIA-атрибутов: для улучшения восприятия раскрывающихся блоков вспомогательными технологиями следует применять атрибуты ARIA, такие как
aria-expanded
для указания, открыт ли блок, иaria-controls
для связывания кнопки с конкретным раскрывающимся элементом. Пример:aria-expanded="true"
для открытого блока иaria-expanded="false"
для закрытого. - Предоставление информации о состоянии: важно ясно сообщать пользователю о текущем состоянии блока. Например, если блок раскрывается или сворачивается, необходимо обновить текст кнопки с «Развернуть» на «Свернуть» и наоборот. Это помогает людям с ограничениями в зрении или восприятии понимать, что происходит на странице.
- Предотвращение ловушек фокуса: не допускайте, чтобы фокус после открытия блока зависал в нем. Фокус должен быть легко перемещаемым по странице, чтобы пользователь мог без проблем продолжить навигацию. Применяйте правила по правильной обработке фокуса с использованием
tabindex
и скриптов для предотвращения зацикливания фокуса. - Оптимизация для экранных читалок: важно, чтобы текст внутри раскрывающегося блока был четко доступен для экранных читалок. Использование правильной структуры HTML и ARIA помогает обеспечить корректное озвучивание содержимого, а также упрощает понимание для пользователей, полагающихся на голосовые технологии.
- Проверка контрастности: текст внутри раскрывающихся блоков должен иметь достаточный контраст с фоном. Это особенно важно для людей с нарушениями зрения. Используйте проверку контрастности, чтобы убедиться, что текст и элементы управления видны для всех пользователей.
- Управление анимациями: избегайте быстрых или продолжительных анимаций, которые могут вызвать дискомфорт у людей с эпилепсией или нарушениями восприятия. Используйте возможности CSS для включения опций для отключения анимаций, таких как
prefers-reduced-motion
.
Соблюдение этих рекомендаций позволяет сделать раскрывающиеся блоки более доступными и улучшить пользовательский опыт для людей с особыми потребностями.
Вопрос-ответ:
Что такое раскрывающийся блок в HTML и зачем он нужен?
Раскрывающийся блок в HTML — это элемент, который скрывает содержимое по умолчанию, но позволяет пользователю раскрыть его по клику или другому событию. Такой блок полезен, когда нужно компактно организовать контент, чтобы не перегружать страницу избыточной информацией. Примером может быть список с описаниями, который раскрывается при необходимости, экономя место на странице.
Можно ли сделать раскрывающийся блок доступным для пользователей с ограниченными возможностями?
Да, для улучшения доступности раскрывающегося блока следует использовать правильные атрибуты и семантику. Например, элемент details
уже по умолчанию поддерживает доступность для экранных читалок, так как он имеет семантическое значение. Важно убедиться, что элементы внутри блока также правильно размечены. Также полезно добавить атрибуты aria-expanded
и aria-controls
, чтобы информировать пользователей о состоянии раскрытия блока.