В CSS существует несколько способов скрыть элемент, и каждый из них имеет свои особенности: влияние на доступность, сохранение места в макете, возможность взаимодействия и влияние на производительность. Выбор метода зависит от конкретной задачи.
Ключевые аспекты
display: none — полностью удаляет элемент из потока, не занимает место, недоступен для screen readers
visibility: hidden — элемент невидим, но занимает место в макете
opacity: 0 — элемент прозрачен, занимает место, можно взаимодействовать (клики)
position: absolute + left: -9999px — элемент за пределами экрана, доступен для screen readers
clip-path: inset(100%) — современный способ "вырезать" элемент
Плюсы и минусы
Метод
Место в макете
Доступность
Анимация
Клики
display: none
Нет
Недоступен
Нет
Нет
visibility: hidden
Да
Недоступен
Да
Нет
opacity: 0
Да
Доступен
Да
Да
position off-screen
Нет визуально
Доступен
—
Нет
Частые ошибки на собеседованиях
Не знают разницу между display: none и visibility: hidden
Забывают, что opacity: 0 сохраняет возможность кликов
Не учитывают доступность (a11y) при скрытии элементов
Путают visibility: hidden с visibility: collapse (для таблиц)
Не знают про aria-hidden для управления доступностью
Введение и проблематика
Скрытие элементов — одна из самых частых задач в веб-разработке. Модальные окна, выпадающие меню, условный контент — всё это требует умения правильно скрывать и показывать элементы.
Выбор способа скрытия влияет на: доступность (accessibility), производительность, возможность анимации и поведение при взаимодействии.
Адаптивный дизайн: скрытие элементов на мобильных устройствах
Условный контент: показ/скрытие в зависимости от состояния
Доступность: визуально скрытый контент для screen readers
Основные способы скрытия
1. display: none
Полностью удаляет элемент из потока документа.
css
.hidden {display:none;}
Характеристики:
Элемент не занимает место
Не виден визуально
Недоступен для screen readers
Не реагирует на события (клики)
Нельзя анимировать (элемент просто "исчезает")
⚠️
display: none полностью исключает элемент из accessibility tree. Используйте с осторожностью!
Когда использовать:
Полное удаление элемента из интерфейса
Переключение между разными представлениями
Когда элемент точно не нужен пользователю
2. visibility: hidden
Элемент невидим, но занимает место в макете.
css
.invisible {visibility:hidden;}
Характеристики:
Элемент занимает своё место (остаётся "пустота")
Не виден визуально
Недоступен для screen readers
Не реагирует на события
Можно анимировать (например, с transition)
Сравнение с display: none:
html
<divclass="container"> <divclass="box">1</div> <divclass="box"style="display: none;">2</div> <divclass="box">3</div></div><!-- Результат: [1][3] — второй блок полностью исчез -->
Когда использовать:
Нужно сохранить layout (избежать "прыжков" интерфейса)
Планируется анимация появления/исчезновения
Временное скрытие с сохранением размеров
3. opacity: 0
Элемент полностью прозрачен, но остаётся в потоке и реагирует на события.
css
.transparent {opacity:0;}
Характеристики:
Элемент занимает место
Невидим визуально
Доступен для screen readers
Реагирует на клики! (это важно)
Отлично анимируется
🚫
Элемент с opacity: 0 продолжает получать клики! Это может привести к неожиданному поведению.
Современный способ "вырезать" видимую область элемента.
css
.clipped {clip-path:inset(100%);}
Характеристики:
Элемент занимает место
Недоступен визуально
Доступен для screen readers
Можно анимировать
6. HTML-атрибут hidden
Семантический способ скрыть элемент.
html
<divhidden>Этот контент скрыт</div>
Эквивалентно display: none в CSS.
css
[hidden] {display:none;}
Атрибут hidden можно переопределить в CSS. Если нужно гарантированное скрытие, используйте display: none !important.
Управление доступностью
aria-hidden
Атрибут aria-hidden управляет видимостью элемента только для assistive technologies.
html
<!-- Скрыто для screen readers, но видно визуально --><spanaria-hidden="true">🔒</span><!-- Видно для screen readers, но скрыто визуально --><spanclass="visually-hidden">Защищённый контент</span>
inert
Новый атрибут, который делает элемент и его содержимое полностью инертным.
html
<divinert><!-- Весь контент внутри: не фокусируется, не кликается, не читается screen readers --> <button>Недоступная кнопка</button></div>