Когда display: none
, а когда visibility: hidden
? — спрашивает нас RedFox. Зависит от того, что вы пытаетесь сделать. Есть и другие варианты как спрятать блок и даже специальный атрибут. Давайте разберёмся!
Если вам приходится что-то прятать, то лучше всего это вообще убрать: сайт легче, код чище... ошибок меньше! Но если вам нужно, чтобы оно там пряталось до поры, а потом кому-то пригодилось — это другое дело. Здесь важно не ошибиться с выбором способа.
display: none
Самый простой и популярный — display: none
, он работает как топор: элемент как будто вырубают из HTML. Его не видно на странице и соседние блоки про него ничего не знают. Просто нет и всё. Его даже скринридеры игоририруют и не читают содержимое — будьте аккуратнее с этим.
/* Вырубает */
.cut-down {
display: none;
}
Что интересно, несмотря на полное вырубание элемента, браузеры всё равно загружают картинку из img с display: none
. Если же картинка указана фоном, то Chrome и Edge её тоже загружают, а Firefox и Safari — нет. Ну, разные у них взгляды на оптимизацию загрузки, что поделать.
Другой способ — visibility: hidden
Он работает, как Кольцо Всевластья: элемент вроде здесь и соседние блоки его чувствуют, но его не видно. И чем это отличается от opacity: 0
? Opacity просто делает элемент прозрачным (или полупрозрачным), а visibility: hidden
ещё не даёт с ним взаимодействовать: навести, кликнуть, сфокусировать.
/* Прячет */
.one-ring {
visibility: hidden;
}
/* Не сработает */
.one-ring:hover {
visibility: visible;
}
У visibility: hidden
есть другая приятная особенность: свойство наследуется, а значит ребёнок невидимого родителя может сменить видимость на visible
. Такой трюк не пройдёт ни с display: none
, ни с opacity: 0
. С ним удобно делать всплывающие меню и подказки.
Иногда нужно, чтобы элемент не мешал дизайну, но при этом не прятался от скринридеров, оставаясь частью содержимого. Ну не нарисовал дизайнер здесь заголовка, а по логике документа он здесь нужен. Вот бы нам что-то вроде display: hidden
или visibility: none
! Это я только что придумал, в природе их не существует.
Недавно в черновике CSS Display третьего уровня появилось свойство box-suppress
со значениями show
, discard
и hide
. Оно отвязывает видимость блока от display
— ведь с обратной стороны от none есть не только block
, но и inline
, flex
, grid
. Значение discard
привычно вырубает элемент, а hide
делает то самое волшебное комбо. Читайте подробнее у Рейчел Эндрю.
/* То, что нужно */
.combo {
box-suppress:
hide;
}
К сожалению, до box-suppress
нам ещё долго ждать. Его не только ещё нет в браузерах, но уже в том черновике — недавно его перенесли в следующий уровень, чтобы закончить текущий вовремя. Так что придётся делать магию самим — следите за руками.
Есть такой паттерн «visually hidden»
или «визуально спрятанный», чтобы прятать элементы из дизайна, но оставлять доступным их содержимое. Про другие нюансы со скринридерами читайте у Тима Райта. Как это работает: вы делаете универсальный служебный класс и добавляете его к элементам, которые нужно доступно спрятать. Обычно его так и называют: visually-hidden
, через дефис.
<h2 class="
visually-hidden">
Важный
за головок,
которого нет
</h2>
Если посмотреть что внутри, то это обычный position: absolute
плюс clip
, который обрезает элемент до нуля. То есть он не влияет на соседей и становится невидимым. Все остальные свойства добавляют универсальности и кроссбраузерности, чтобы класс можно было не глядя шлёпнуть на любой элемент. Подробнее читайте в справке к ally. js Родни Рейма.
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
border: 0;
padding: 0;
white-space: nowrap;
clip-path: inset(100%);
clip: rect(0 0 0 0);
overflow: hidden;
}
А вы знали, что любому элементу можно добавить атрибут hidden и он пропадёт?
Теперь знаете! В современных браузерах на этот атрибут повешен тот самый display: none
, который вырубает элемент. Он бинарный как required
или checked
, так что его удобно выставлять через JavaScript. Только не забудьте добавить в стили [hidden] { display: none } для IE 10, Safari 5 и других старых браузеров.
<div hidden>
Вырублен
</div>
// JS
div.hidden = true;
Это почти всё, что вам нужно знать про прятки в CSS. Попробуйте эти способы, они все хороши в разных ситуациях. Главное, не рубите с плеча и думайте о доступном содержимом.