display:none и visibility:hidden

в чем их различие

CSS-свойства display: none и visibility: hidden могут быть использованы для скрытия элементов на странице. Однако, они работают по-разному и имеют свои особенности. В этой статье мы рассмотрим различия между этими свойствами и как использовать их правильно.

Display: none

Display: none скрывает элемент и удаляет его из потока документа. Это означает, что скрытый элемент не занимает место на странице и не влияет на остальные элементы. Браузер не загружает скрытый элемент и не обрабатывает его, что может ускорить загрузку страницы. Однако, скрытый элемент остается доступен для программного обращения к нему, например, с помощью JavaScript.

Например сделаем такую разметку:

<div class="blocks">
  <div class="blocks__item block1">Блок 1</div>
  <div class="blocks__item block2">Блок 2</div>
  <div class="blocks__item block3">Блок 3</div>
</div>

Добавим немного стилей:

.blocks {
    display: flex;
    gap: 10px;
}

.blocks__item {
    padding: 12px 24px;
    background: green;
    color: white;
}

И получаем такой результат:

Блок 1
Блок 2
Блок 3

Теперь для .block2 установим display: none

.block2 {
   display: none;
}
Блок 1
Блок 2
Блок 3

Поскольку мы использовали display:none на элемент .block2, он не отображается в документе. Таким образом, его место на экране освобождается для других элементов.

Visibility: hidden

Свойство visibility: hidden не удаляет элемент из потока документа. Это означает, что скрытый элемент занимает место на странице и влияет на остальные элементы. Если вы скрываете элемент с помощью visibility:hidden, то он все еще будет влиять на макет страницы и может влиять на расположение других элементов на странице. Это свойство может быть полезным, когда вы хотите временно скрыть элемент, но сохранить его размер и позицию.

Возьмем наш предыдущий пример и вместо display: none для .block2 добавим visibility: hidden:

.block2 {
    visibility: hidden;
}
Блок 1
Блок 2
Блок 3

Как вы видите, блок скрылся но макет не изменился, оставив место под скрытый блок.

visibility: hidden против opacity: 0

Следующее, о чем вы можете спросить – какая разница между visibility: hidden и opacity: 0? Ведь между ними визуально нет никакой разницы.

.block2 {
    opacity: 0;
}
Блок 1
Блок 2
Блок 3

Да, визуально разницы нет, но есть разница в поведении элементов.

Элементы с visibility: hidden не являются интерактивными. Имеется в виду, что пользователи не могут взаимодействовать с такими элементами (например, кликать). Это потому, что такие элементы действительно невидимы.

А элементы с opacity: 0 интерактивны, так как они на самом деле видны, просто очень прозрачны. Свойство opacity не определяет видимость элемента — оно определяет только прозрачность.

Подведем итоги

свойства display: none, opacity: 0 и visibility: hidden могут быть полезными для скрытия элементов на странице, но имеют свои особенности и нужно использовать их с умом. Выбор между этими свойствами зависит от конкретной ситуации и того, что вы хотите достичь.

display: none отключает расположение элементов, чтобы они не отображались

visibility: hidden скрывает элементы без изменения разметки

opacity: 0 делает элементы очень прозрачными, но пользователи могут взаимодействовать с ними.