В HTML есть глобальный атрибут
hidden. Он скрывает элемент, у которого указан. Можно задать hidden без значения или продублировать название атрибута в его значении по правилам булевых атрибутов:<div hidden>
<!-- ... -->
</div>
<div hidden="hidden">
<!-- ... -->
</div>
Элементы скрываются по простой причине: атрибут
hidden реализован в браузерах как презентационный и к нему применяется соответствующее правило.[hidden] {
display: none;
}Если в стилях разработчика для элемента не указано свойство
display, то при добавлении атрибута hidden он будет скрыт. Если значение display в стилях разработчика указано, то оно переопределяет правило атрибута hidden, так как по каскаду стили разработчика переопределяют стили браузера.Есть два способа предотвратить неожиданное поведение «атрибут есть, а элемент не скрыт». Первый — добавить в глобальные стили правило с
!important. Это тот редкий случай, когда использование !important уместно:[hidden] {
display: none !important;
}Второй способ — добавить правило для
[hidden] у элементов, где планируется использовать атрибут. Можно сочетать с :where() для сохранения специфичности:.element {
display: flex;
}
.element:where([hidden]) {
display: none;
}Атрибут
hidden отражается в свойство hidden и наоборот. Поэтому в JS можно удобно переключать состояние видимости и не беспокоиться о значении свойства display.// управление через атрибут
element.setAttribute('hidden', '');
element.removeAttribute('hidden');
// управление через свойство
element.hidden = true;
element.hidden = false;
// проверка, скрыт ли элемент
if (element.hidden) {
//...
}
// переключение
element.hidden = !element.hidden;
На мой взгляд это удобнее, чем работать с инлайн-стилями или делать специальный атомарный класс.
// управление через свойство display
element.style.display = 'none';
// нужно помнить предыдущее состояние
element.style.display = 'flex';
// управление через атрибут style
element.setAttribute('style', 'display: none');
// можно удалить другие нужные инлайн-стили
element.removeAttribute('style');
// управление через утилитарный класс
element.classList.add('is-hidden');
element.classList.remove('is-hidden');
Из-за того, что у браузеров есть стили для
hidden, элемент можно скрыть изначально на уровне разметки. Не нужно ждать загрузки, обработки и применения стилей. Поэтому hidden может стать решением в тех ситуациях, когда при загрузке страницы скрытый контент на доли секунд виден из-за того, что стили не догрузились.Ещё одна особенность
hidden в том, что атрибут может принимать значения. То есть это одновременно булев и перечисляемый атрибут. Так сложилось исторически из-за обратной совместимости. Атрибут без значения, со значением в виде пустой строки, строки hidden и строки с не валидным значением трактуется браузером как если у элемента установлен атрибут без значения.<!-- варианты эквивалентны -->
<div hidden></div>
<div hidden=""></div>
<div hidden="hidden"></div>
<div hidden="invalid"></div>
Но если указать в качестве значения
until-found, поведение меняется. hidden="until-found" делает элемент скрытым до тех пор пока пользователь не воспользуется функцией поиска по странице. Если внутри элемента есть контент, попадающий под условия поиска, то элемент будет показан. Также отличается значение в стилях браузера.[hidden="until-found"] {
content-visibility: hidden;
}Эта особенность полезна при разработке компонентов, которые скрывают контент, например раскрывающиеся блоки или аккордеоны. Есть статья с примером реализации аккордеонов и использованием
hidden="until-found".#ydkhtml