Оригинал: 10 Ways to Hide Elements in CSS, автор Craig Buckler

Существует множество способов скрыть элементы на странице — и все они по-разному влияют на доступность, разметку, анимации, производительность и обработку событий.

Анимации

Некоторые CSS-свойства принимают только два крайних значения — все или ничего. Элемент либо полностью видим, либо полностью невидим, а промежуточных значений не существует.

Другие свойства, например, прозрачность, могут принимать значения в определенном диапазоне. К таким свойствам можно применить CSS-анимации для плавного изменения.

Помните, что анимация может вызывать дезориентацию, мигрень, судороги или другой физический дискомфорт у некоторых людей. Поэтому всегда используйте медиа-запрос prefers-reduced-motion, для учета пользовательских предпочтений.

Доступность

Все описанные ниже приемы обеспечивают визуальное скрытие элемента на странице, но они не всегда прячут его от ассистивных технологий. Например, скринридеры продолжают читать текст, даже если вы уменьшите его размер до крошечного и сделаете цвет прозрачным.

Для изменения этого поведения могут потребоваться дополнительные CSS-свойства или ARIA-атрибуты, вроде aria-hidden="true".

Обработка событий

Сокрытие элемента не всегда означает, что он перестает быть интерактивным. Иногда на невидимые блоки можно кликнуть, а значит, будут срабатывать привязанные к ним обработчики событий.

Производительность

После того как браузер загрузит и распарсит HTML DOM и CSSOM, страница рендерится (и перерендеривается) в три этапа:

  1. Layout: генерируется геометрия и позиция каждого элемента;
  2. Paint: отрисовываются пиксели каждого элемента;
  3. Composition: слои элементов располагаются в правильном порядке друг над другом.

Эффекты, которые вызывают только композиционные изменения, определенно предпочтительнее всех других, так как требуют меньше действий. В некоторых случаях браузер также может использовать аппаратное ускорение.

Способ #1. opacity и filter: opacity()

Свойства opacity: N и filter: opacity(N) могут принимать значения в диапазоне от 0 до 1 (или от 0% до 100%), где 0 — это полная прозрачность элемента, а 1 — полная непрозрачность.

See the Pen hide with opacity: 0 by SitePoint (@SitePoint) on CodePen.

Между этими двумя свойствами в современных браузерах практически нет разницы. filter позволяет использовать сразу несколько эффектов, например, прозрачность одновременно с размытием или контрастностью.

Свойство opacity можно анимировать — и это очень хороший подход с точки зрения производительности.

Помните, что элементы с opacity: 0 остаются на странице и на них могут срабатывать пользовательские события.

МетрикаВлияние
Браузерная поддержкаХорошая. В IE свойство opacity поддерживает только значения в диапазоне от 0 до 1
Доступность скрытого элементаПри значении 0 или 0% контент элемента недоступен
Вызывает изменение макетаНет
ПеререндерингComposition
ПроизводительностьХорошая, может использоваться аппаратное ускорение
Покадровая анимацияВозможна
Срабатывание событий на скрытом элементеДа

Способ #2. alpha-канал

Свойство opacity влияет на элемент целиком, но вы можете также изменять видимость отдельных свойств: цвета (color), фона (background-color) или рамки (border-color). Чтобы скрыть их, используйте цвет в формате rgba (или hsla) и установите значение альфа-канала равным нулю, например, rgba(0, 0, 0, 0).

See the Pen hide with color alpha by SitePoint (@SitePoint) on CodePen.

Каждое свойство можно анимировать отдельно для создания интересных эффектов.

Эту технику нельзя применить к фоновым изображения (кроме тех, которые созданы с помощью CSS-градиентов).

Способы управления альфа-каналом:

  • Ключевое слово transparent. Устанавливает полную прозрачность, не поддерживает промежуточные анимации.
  • rgba(r, g, b,a): красный, зеленый, синий и альфа-канал.
  • hsla(h, s, l, a): оттенок, насыщенность, светлота и альфа-канал.
  • HEX-формат: #RRGGBBAA или #RGBA
МетрикаВлияние
Браузерная поддержкаХорошая. В IE поддерживается только ключевое слово transparent и rgba-формат.
Доступность скрытого элементаКонтент остается доступным
Вызывает изменение макетаНет
ПеререндерингPainting
ПроизводительностьХорошая, но медленнее, чем у opacity
Покадровая анимацияВозможна
Срабатывание событий на скрытом элементеДа

Способ #3. transform

Свойство transform позволяет передвигать (translate), масштабировать (scale), вращать (rotate) или искажать (skew) элемент. Оно позволяет также его спрятать. Например, можно радикально уменьшить масштаб (scale(0)) или передвинуть блок за пределы вьюпорта (translate(-999px, 0px)).

See the Pen hide with transform: scale(0); by SitePoint (@SitePoint) on CodePen.

CSS-трансформации предлагают великолепную производительность с использованием аппаратного ускорения. Трансформируемый элемент перемещается на отдельный слой и может изменяться, не затрагивая другие слои. Пространство, занимаемое блоком до изменения, остается на странице, но полностью скрытый элемент уже недоступен для взаимодействия.

МетрикаВлияние
Браузерная поддержкаХорошая
Доступность скрытого элементаКонтент остается доступным
Вызывает изменение макетаНет, сохраняются оригинальные размеры блока
ПеререндерингComposition
ПроизводительностьХорошая, может использоваться аппаратное ускорение
Покадровая анимацияВозможна
Срабатывание событий на скрытом элементеНет

Способ #4. clip-path

Свойство clip-path определяет область обрезки — часть блока, которая будет видима на странице. Если эта область занимает 0 пикселей, элемент будет скрыт: clip-path: circle(0).

See the Pen hide with clip-path by SitePoint (@SitePoint) on CodePen.

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

МетрикаВлияние
Браузерная поддержкаТолько современные браузеры
Доступность скрытого элементаКонтент остается доступным для некоторых приложений
Вызывает изменение макетаНет, сохраняются оригинальные размеры блока
ПеререндерингPaint
ПроизводительностьДопустимая
Покадровая анимацияВозможна в современных браузерах
Срабатывание событий на скрытом элементеНет

Способ #5. visibility

Свойство visibility принимает одно из двух значений: visible или hidden. Для ячеек таблицы доступно также значение collapse.

See the Pen hide with visibility: hidden by SitePoint (@SitePoint) on CodePen.

Пространство, занимаемое элементом, остается на странице (кроме collapse).

МетрикаВлияние
Браузерная поддержкаОтличная
Доступность скрытого элементаКонтент элемента недоступен
Вызывает изменение макетаНет (кроме collapse)
ПеререндерингComposition (кроме collapse)
ПроизводительностьХорошая
Покадровая анимацияНевозможна
Срабатывание событий на скрытом элементеНет

Способ #6. display

display, вероятно, самое популярное свойство для скрытия элементов на странице. Значение none эффективно удаляет блок, как будто его никогда и не существовало в DOM.

See the Pen hide with display: none by SitePoint (@SitePoint) on CodePen.

Однако в большинстве случаев display: none — самый плохой способ спрятать что-то. Это свойство нельзя анимировать, и оно вызывает перерисовку страницы (layout), если только элемент не вырван из общего потока документа (position: absolute) или если не используется новое свойство contain.

Кроме того, свойство display может принимать множество значений (block, inline, flex, grid, table, …). Если вы сбрасываете его до значения none, то вернуть затем правильное отображение может быть затруднительно (может помочь значение unset).

МетрикаВлияние
Браузерная поддержкаОтличная
Доступность скрытого элементаКонтент элемента недоступен
Вызывает изменение макетаДа
ПеререндерингLayout
ПроизводительностьПлохая
Покадровая анимацияНевозможна
Срабатывание событий на скрытом элементеНет

Способ #7. Атрибут hidden

HTML-атрибут hidden можно добавить к любому элементу:

<p hidden>
  Hidden content
</p>

К нему будут применены дефолтные стили браузера:

[hidden] {
  display: none;
}

Эта техника имеет те же преимущества и недостатки, что и предыдущая, но она может быть удобна для использования в различных CMS, где нет возможности влиять на стиль контента (но можно редактировать HTML-код).

Способ #8. Абсолютное позиционирование

Свойство position позволяет переместить элемент из его исходной (static) позиции в общем потоке документа с помощью свойств top, bottom, left и right. Абсолютно спозиционированный элемент (position: absolute) можно вынести за пределы вьюпорта, например, установив ему свойство left: -999px (значение может быть другим).

See the Pen hide with position: absolute by SitePoint (@SitePoint) on CodePen.

МетрикаВлияние
Браузерная поддержкаОтличная, кроме position: sticky
Доступность скрытого элементаКонтент элемента остается доступным
Вызывает изменение макетаДа, при изменении позиционирования
ПеререндерингЗависит от ситуации
ПроизводительностьПри правильном использовании неплохая
Покадровая анимацияВозможна для свойств top, bottom, left и right
Срабатывание событий на скрытом элементеДа, но если элемент вынесен за пределы вьюпорта, взаимодействие с ним затруднительно

Способ #9. Перекрытие другим элементом

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

See the Pen hide with an overlay by SitePoint (@SitePoint) on CodePen.

Эта техника требует большего количества кода, чем остальные. В некоторых случаях ее применение может быть невозможным (сложный или неизвестный фон).

МетрикаВлияние
Браузерная поддержкаОтличная
Доступность скрытого элементаКонтент элемента остается доступным
Вызывает изменение макетаНет, если используется абсолютное позиционирование
ПеререндерингPaint
ПроизводительностьПри правильном использовании неплохая
Покадровая анимацияВозможна
Срабатывание событий на скрытом элементеДа, если для перекрытия используется псевдоэлемент или дочерний элемент блока

Способ #10. Уменьшение размеров

Элемент можно спрятать, уменьшив его размеры с помощью свойств width, height, padding, border-width и/или font-size. При необходимости также можно использовать свойство overflow: hidden, чтобы избежать переполнения уменьшенного элемента контентом.

See the Pen hide with width or height by SitePoint (@SitePoint) on CodePen.

Эта техника позволяет создавать интересные анимационные эффекты, но ее производительность существенно хуже, чем у свойства transform.

МетрикаВлияние
Браузерная поддержкаОтличная
Доступность скрытого элементаКонтент элемента остается доступным
Вызывает изменение макетаДа
ПеререндерингLayout
ПроизводительностьПлохая
Покадровая анимацияВозможна
Срабатывание событий на скрытом элементеНет

Выбор техники

Многие годы мы не раздумывая использовали display: none для скрытия элементов, однако у этого способа есть множество альтернатив — более гибких и производительных. Эта техника остается валидной, но в большинстве случаев лучше использовать другое решение. В первую очередь обратите особое внимание на максимально оптимизированные свойства opacity и transform.

3 комментария

  • Катерина
    Катерина
    17/03/2020, 05:22
    Свойства left и top имеют более высокий приоритет по сравнению с right и bottom. Если left и right противоречат друг другу, то значение right игнорируется. То же самое касается и bottom . Если left задать отрицательное значение, то слой уйдёт за левый край браузера, полосы прокрутки при этом не возникнет. Это один из способов спрятать элемент от просмотра. То же относится и к свойству top, только слой уйдёт за верхний край.
  • Роман
    Роман
    9/03/2020, 23:19
    При работе с формами через Ajax недостаточно display:none, чтобы исключить данные из отправки необходимо добавлять атрибут disabled к элементам формы
    • Furry_web
      Furry_web
      16/03/2020, 17:00
      Конечно, разные задачи требуют разных подходов. В статье идет речь скорее о визуальном скрытии

Оставить комментарий

*Доступные HTML-теги: a, abbr, blockquote, code, pre, del, i, em, strong, b, strike
*Не будет опубликован