- PVSM.RU - https://www.pvsm.ru -
Я хочу рассказать о замечательном элементе <details> и показать несколько примеров его использования, от простых до безумных.
Вам знаком паттерн верстки компонента, который может менять своё состояние с видимого на скрытый:
.component {
display:none;
}
.component.open {
display:block;
}
toggleButton.onclick = () => component.classList.toggle('open')
А теперь забудьте. Существует элемент, который может делать это из коробки. Знакомьтесь — <details>
HTML-элемент
<details>используется для раскрытия скрытой (дополнительной) информации.
Прежде всего давайте посмотрим как этот элемент работает:
Обратите внимание, что пример работает без каких либо дополнительных стилей или JavaScript. Вся функциональность встроена в сам браузер.
По умолчанию видимый текст зависит от настроек языка вашей системы, но его можно изменить добавив в <details> элемент <summary>:
Чтобы изменить состояние элемента в html вам достаточно добавить атрибут open
<!-- Содержимое по-умолчанию видимо -->
<details open> ... </details>
<!-- Содержимое по-умолчанию скрыто -->
<details> ... </details>
А чтобы управлять состоянием средствами JavaScript предусмотрен специальный API:
const details = document.querySelector('details')
details.open = true // Отобразить содержимое
details.open = false // Скрыть содержимое
Элемент <summary> фокусируемый. То есть передвигаясь по странице с клавиатуры вы попадёте на этот элемент. А вот содержимое может попасть в фокус только если <details> открыт, то есть фокус никогда не попадет на невидимые элементы внутри <details>.
Как правило, программы чтения с экрана хорошо справляются со стандартным использованием <details> и <summary>. Существуют некоторые вариации в объявлении в зависимости от программы и браузера. Подробнее [1].
Далее я примерно повторю некоторые компоненты из документации bootstrap, но практически без JavaScript.
Первое что вам может понадобится — изменить внешний вид маркера. Делается это очень просто:
summary::-webkit-details-marker {
/* Любые стили */
}
Или вы можете скрыть стандартный маркер и реализовать собственный
/* Убираем стандартный маркер Chrome */
details summary::-webkit-details-marker {
display: none
}
/* Убираем стандартный маркер Firefox */
details > summary {
list-style: none;
}
/* Добавляем собственный маркер для закрытого состояния */
details summary:before {
content: 'f0fe';
font-family: "Font Awesome 5 free";
margin-right: 7px;
}
/* Добавляем собственный маркер для открытого состояния */
details[open] summary:before {
content: 'f146';
}
Здесь всё просто. Базовый функционал такой же. Нужно лишь немного изменить внешний вид:
Повторим предыдущий пример, немного изменим внешний вид <summary> и получим аккордеон:
Но, как видите, один элемент не закрывается когда открывается другой. Чтобы добиться этого нам понадобиться пара строк JavaScript. Необходимо отслеживать появление атрибута open на одном из элементов <details> и удалять его у остальных:
Эта реализация очень похожа на Collapse Component, с той разницей что содержимое <details> имеет абсолютное позиционирование и перекрывает контент.
В своей основе это тот же Popover Component. Отличается лишь внешний вид.
Тот же пример, только с отдельной кнопкой
Но у Dropdown Component есть ещё одно важное отличие: по клику за его пределами он должен скрываться. Чтобы реализовать это снова понадобится написать пару строк JavaScript.
// По клику на тело документа
document.body.onclick = () => {
// Найти все открытые <details>
document.body.querySelectorAll('details.dropdown[open]')
// И закрыть каждый из них
.forEach(e => e.open = false)
}
И напоследок пример модального окна.
Вообще <details> не лучший выбор для реализации этого компонента. Существует куда более подходящий элемент — <dialog>, но у него весьма плохая поддержка браузерами.
Can I Use Details & Summary elements [2]
MDN details element [3]
W3C details element [4]
Автор: Kozack
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/html/337895
Ссылки в тексте:
[1] Подробнее: https://www.scottohara.me/blog/2018/09/03/details-and-summary.html
[2] Can I Use Details & Summary elements: https://caniuse.com/#feat=details
[3] MDN details element: https://developer.mozilla.org/ru/docs/Web/HTML/Element/details
[4] W3C details element: https://www.w3.org/TR/html51/semantics.html#the-details-element
[5] Источник: https://habr.com/ru/post/477520/?utm_source=habrahabr&utm_medium=rss&utm_campaign=477520
Нажмите здесь для печати.