Руководство по сокрытию элементов в CSS

Источник: «Guide to hiding elements in CSS»
Мы изучим различные подходы к сокрытию элементов веб-страниц с помощью CSS и оценим их производительность.

Сокрытие элементов веб-сайта может быть полезно по разным причинам, например для защиты конфиденциальной информации, ограничения доступа к премиум-контенту или персонализации контента для определённых групп пользователей. Например, мы можем захотеть скрыть определённые рекламные акции или предложения от пользователей, которые уже совершили покупку, или персонализировать контент на основе географического местоположения пользователя или истории просмотров. Мы можем использовать CSS для выборочного сокрытия или отображения определённых элементов на основе пользовательских атрибутов.

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

Компромиссы, которые следует учитывать при использовании CSS для сокрытия элемента

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

CSS свойство display

CSS свойство display определяет, следует ли рассматривать элемент как block или inline элемент, а также устанавливает макет для его дочерних элементов, таких как flex или grid.

Мы можем использовать свойство display со значением none, чтобы скрыть элемент и его потомков на веб-странице:

.hide-element{
display:none;
}

Установка display значения none для элемента полностью удаляет его из макета, создавая впечатление, что он не существует в документе. Это также относится к дочерним элементам.

В приведённом ниже примере мы скрываем элемент div, и элемент button немедленно перемещается на прежнее место div. Мы видим, что div полностью удаляется из макета, когда для его свойства display установлено значение none:

See the Pen

Анимация

Невозможно анимировать свойство display напрямую, поскольку display принимает только определённые значения (например, block, inline, inline-block) и не может быть преобразовано или анимировано, как другие свойства, принимающие числовые или цветовые значения.

Триггер событий

Когда элемент скрыт с помощью display: none, он удаляется из макета страницы, и браузер не выделяет этому элементу ни каких ресурсов. Это означает, что события не могут быть инициализированы для этого элемента.

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

Установка свойству display элемента значения none может привести к перезагрузке макета или задержке рендеринга контента.

Доступность

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

CSS свойство visibility

CSS свойство visibility позволяет скрыть или показать элемент без изменения макета документа. Это свойство также можно использовать для сокрытия строк или столбцов <table>:

.hide-element{
visibility: hidden;
}

В приведённом ниже примере мы скрываем элемент div используя свойство visibility. Этот подход только визуально скрывает элемент, он не удаляется и документа и макет документа не изменяется:

See the Pen

Анимация

Свойство visibility можно анимировать, но результат выглядит ужасно и даёт резкий эффект. Это связано с тем, что свойство видимости имеет бинарное значение visible и hidden. При переходе между этими двумя состояниями элемент будет появляться или исчезать резко, без каких-либо промежуточных состояний.

Триггер событий

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

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

Установка для свойства элемента visibility значения hidden оказывает незначительное влияние на производительность, поскольку влияет только на визуальный рендеринг элемента, а не на его макет или размер.

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

Доступность

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

CSS свойства opacity и filter

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

Мы можем добиться такого же эффекта с помощью свойства filter: opacity(), но, как правило, предпочтительнее использовать свойство opacity и использовать filter для других целей (например, для применения эффектов blur, contrast или grayscale к элементам). Выбор остаётся за вами.

.hide-element{
opacity: 0.3;
// или
opacity: 30%;

// или
filter: opacity(0.3);

// или
filter: blur(100px);
}

Значение свойства opacity представлено числом от 0.0 до 1.0 или процентом от 0% до 100%. Это означает непрозрачность канала или значение его альфа-канала. Значения за пределами этого диапазона по-прежнему приемлемы, но будут ограничены ближайшей границей указанного диапазона.

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

Обратите внимание: Если используется значение opacity, отличное от 1, для элемента создаётся новый контекст наложения.

В приведённом ниже примере мы скрываем элемент div, используя свойство opacity:

See the Pen

Анимация

Любой элемент, скрытый с помощью свойства opacity, по-прежнему можно анимировать. Постепенно изменяя значение opacity от 1 (полностью видимый) до 0 (полностью прозрачный), элемент постепенно исчезнет и станет скрытым. Точно также, постепенно изменяя значение opacity от 0 до 1, элемент постепенно проявится и станет видимым.

Триггер событий

Когда элемент скрыт с использованием подхода opacity, события по-прежнему могут запускаться для этого элемента. Это связано с тем, что элемент по-прежнему присутствует в документе и по-прежнему занимает место в макете, даже если он не виден.

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

Скрытие элемент с помощью opacity не оказывает существенного влияния на производительность.

Доступность

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

CSS свойство clip-path

CSS свойство clip-path позволяет определять конкретную область элемента, которая должна отображаться, скрывая остальные части. Область отсечения определяет, какая часть элемента видна, а части, выходящие за пределы области, скрыты от просмотра:

.hide-element{
clip-path: polygon(0 0, 0 0, 0 0, 0 0);

//или

clip-path: circle(0);
}

В приведённом выше коде свойство clip-path установлено на polygon с четырьмя точками, все из которых находятся в начале координат (0,0), эффективно скрывая элемент.

В приведённом ниже примере мы скрываем элемент div, используя свойство clip-path, установленное на circle:

See the Pen

Анимация

Свойство clip-path может быть анимировано с использованием CSS анимации и переходов для создания интересных визуальных эффектов.

Триггер событий

События могут быть инициированы для элемента скрытого с помощью CSS свойства clip-path. Несмотря на то, что элемент невидим, он всё ещё существует в документе и может реагировать на такие события, как клики, наведение и нажатие клавиш.

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

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

Анимация свойства clip-path элемент требует, чтобы браузер пересчитывал макет и перерисовывал элемент для каждого кадра анимации. Это может быть очень ресурсоёмким процессом и привести к тому, что анимация будет прерывистой или запаздывающей на более медленных устройствах. Особенно если несколько элементов одновременно анимируются с помощью clip-path.

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

Доступность

Когда контент скрыт с помощью clip-path, он по-прежнему присутствует в документе и может быть доступен для программ чтения с экрана и других вспомогательных технологий. Однако, если скрытый контент не помечен или не описан должным образом, пользователи с ослабленным зрением могут не знать о его наличии и могут упустить важную информацию или функции.

CSS свойства height, width и overflow

CSS свойства height, width и overflow могут использоваться для сокрытия элементов. Например, установка свойств height: 0, width: 0 и overflow: hidden для элемента эффективно скроют его от просмотра. Поскольку это указывает, что элемент не будет иметь видимой высоты или ширины, любое содержимое, превышающее эти размеры, будет скрыто.

Установка для свойства overflow значения hidden гарантирует, что любой контент, превышающий размеры элемента, не будет виден — вместо этого он обрезается или скрывается из поля зрения:

.hide-element{
width:0;
height:0;
overflow:hidden;
}

Обратите внимание: Важно помнить, что другие CSS свойства, такие как padding, border и margin, по-прежнему могут влиять на макет и положение элемента.

Когда height и width родительского элемента установлены равными 0, а его overflow установлено в hidden — дочерние элементы будут скрыты и не будут занимать место на странице. Это связано с тем, что дочерние элементы содержатся внутри родительского элемента.

Анимация

Элемент, скрытый из-за того, что его height и width равны 0, по-прежнему можно анимировать. Постепенно изменяя значения от 0 до желаемой ширины и высоты, элемент станет видимым и будет постепенно увеличиваться в размерах. Затем, уменьшая значения обратно до 0, элемент будет постепенно уменьшаться и станет невидимым.

Триггер событий

События не могут быть запущены для элементов скрытых с использованием height, width и overflow.

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

Использование height, width и overflow для сокрытия элементов может негативно сказаться на производительности веб-страницы, особенно если внутри скрытых элементов есть сложный и ресурсоёмкий контент.

Доступность

Когда элементы скрыты с использованием height, width и overflow, их содержимое всё ещё может быть прочитано программами чтения с экрана.

CSS свойство transform

CSS свойство transform имеет несколько функций, включая перемещение, масштабирование, вращение или наклон элемента. Элемент можно скрыть используя свойство transform, либо масштабируя его до 0, либо переводя за пределы экрана, используя такие значения, как -999px для горизонтальной оси и 0px для вертикальной оси:

.hide-element{
transform: scale(0);

// или

transform: translate(-999px, 0);
}

Сокрытие элемент с помощью свойства transform: scale(0) аналогично подходу с height и width. Разница в том, что на свойство transform не влияют border, padding или margin, поэтому элемент полностью исчезнет с экрана.

transform: translate(), с другой стороны, может использоваться для перемещения элемента как по горизонтальной, так и по вертикальной осям. Используя отрицательные значения с функцией translate, мы можем переместить элемент за пределы контейнера, эффективно скрыв его от просмотра. Мы можем добиться аналогичных результатов с помощью свойства position (будет описано далее в статье).

Стоит отметить, что этот приём скрывая элемент, фактически не удаляет его со страницы и не меняет его положение в макете.

В приведённом ниже примере мы скрываем div, используя свойство transform:

See the Pen

Анимация

Элемент, скрытый с помощью свойства transform, может быть анимирован. Свойство transform обеспечивает высокую производительность и аппаратное ускорение, поскольку оно позволяет перемещать элемент в отдельный слой, который можно анимировать как в 2D, так и в 3D. Этот подход не влияет на исходное пространство макета.

Мы можем использовать CSS трансформации и анимации для создания плавных и постепенных изменений масштаба элемента, заставляя его растворяться или исчезать, или заставляя его появляться где-то за пределами веб-страницы.

Триггер событий

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

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

Использование transform: scale() или transform: translate() для сокрытия элемента в небольшой степени отрицательно влияет на производительность, но в некоторых случаях это можно улучшить с помощью аппаратного ускорения.

Доступность

Когда элементы скрыты с помощью свойства transform, их содержимое по-прежнему может быть прочитано программами чтения с экрана.

CSS свойство position

CSS свойство position может использоваться для смещения элемента в макете веб-страницы с использованием значений top, bottom, left и right. Например, абсолютно позиционированный элемент можно переместить за пределы экрана, указав значение, например, left: -9999px:

.hide-element{
position: absolute;
left: -9999px;
}

В приведённом ниже примере мы скрываем элемент div, используя свойство position:

See the Pen

Анимация

Элемент скрытый с помощью свойства position, может быть анимирован. Мы можем анимировать его значения его свойства top, left, right и bottom.

Триггер событий

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

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

Использование position для сокрытия элементов может повлиять на производительность веб-страницы. Даже если элемент был смещён за пределы экрана, браузеры всё равно необходимо рассчитать макет и пространство для этого элемента, что приводит к ненужным расчётам рендеринга и макета. Если таким образом скрыть большое количество элементов веб-страницы, это может увеличить время загрузки страницы и сделает её менее отзывчивой.

Доступность

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

Заключение

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

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

Дополнительные материалы

Предыдущая Статья

Использование CSS свойств object-fit и object-position

Следующая Статья

Mobile-First подход с HTML и CSS