видимость-содержания
Базовая линия 2024
Новое доступно
С сентября 2024 года эта функция работает на последних устройствах и версиях браузеров. Возможно, эта функция не будет работать на старых устройствах или браузерах.
Свойство content-visibility CSS управляет тем, отображается ли содержимое элемента вообще, а также навязывает строгий набор ограничений, что позволяет пользовательским агентам потенциально опустить большие участки работы по макетированию и отрисовке, пока это не потребуется. Оно позволяет пользовательскому агенту пропустить работу элемента по отрисовке (включая макетирование и отрисовку) до тех пор, пока это не потребуется — это значительно ускоряет начальную загрузку страницы.
Примечание: Событие contentvisibilityautostatechange срабатывает для любого элемента с content-visibility: auto в нём, когда начинается или прекращается пропуск его работы по отрисовке. Это предоставляет удобный способ для кода приложения начать или остановить процессы отрисовки (например, рисование на <canvas>) когда они не нужны, тем самым экономя вычислительные ресурсы.
Попробовать
Синтаксис
/* Keyword values */ content-visibility: visible; content-visibility: hidden; content-visibility: auto; /* Global values */ content-visibility: inherit; content-visibility: initial; content-visibility: revert; content-visibility: revert-layer; content-visibility: unset;
Значения
visible-
Без эффекта. Содержимое элемента выкладывается и отрисовывается как обычно.
-
Элемент пропускает своё содержимое. Пропущенное содержимое не должно быть доступно функциям пользовательского агента, таким как поиск по странице, навигация по табуляции и т. д., а также не должно быть выбираемым или фокусируемым. Это аналогично тому, как содержимое получает
display: none. auto-
Элемент включает ограничение макетирования, ограничение стиля и ограничение отрисовки. Если элемент не актуален для пользователя, он также пропускает своё содержимое. В отличие от hidden, пропущенное содержимое по-прежнему должно быть доступно функциям пользовательского агента, таким как поиск по странице, навигация по порядку ввода и т. д., и должно быть фокусируемым и выбираемым как обычно.
Описание
Анимация и переход видимости-содержания
Поддерживающие браузеры анимируют/переход content-visibility с вариацией на тип дискретной анимации.
Дискретная анимация, как правило, означает, что свойство будет переключаться между двумя значениями на 50% пути анимации. Однако в случае с content-visibility, браузер будет переключаться между двумя значениями, чтобы отображать анимированное содержимое на протяжении всей длительности анимации. Таким образом, например:
- При анимации
content-visibilityотhiddenдоvisible, значение будет переключаться наvisibleна0%длительности анимации, чтобы оно было видно на протяжении всего процесса. - При анимации
content-visibilityотvisibleдоhidden, значение будет переключаться наhiddenна100%длительности анимации, чтобы оно было видно на протяжении всего процесса.
Это поведение полезно для создания анимаций входа/выхода, где, например, вы хотите удалить некоторое содержимое из DOM с помощью content-visibility: hidden, но хотите плавный переход (например, выцветание), а не мгновенное исчезновение.
При анимации content-visibility с помощью переходов CSS, transition-behavior: allow-discrete необходимо задать для content-visibility. Это эффективно включает переходы content-visibility.
Примечание: При переходе значения content-visibility элемента, вам не нужно указывать набор начальных значений для переходящих свойств, используя блок @starting-style, как это делается при переходе display. Это происходит потому, что content-visibility не скрывает элемент из DOM, как display: оно просто пропускает отрисовку содержимого элемента.
Формальное определение
| Начальное значение | visible |
|---|---|
| Применимо к | элементам, к которым может применяться ограничение размера |
| Наследуется | нет |
| Вычисленное значение | как указано |
| Тип анимации | Дискретное поведение, за исключением анимации к или от hidden видно на протяжении всей длительности |
Формальный синтаксис
Доступность
Содержимое, находящееся вне экрана, в свойстве content-visibility: auto остается в модели объекта документа и дереве доступности. Это позволяет улучшить производительность страницы с content-visibility: auto без негативного влияния на доступность.
Поскольку стили для содержимого, находящегося вне экрана, не отображаются, элементы, намеренно скрытые с помощью display: none или visibility: hidden все еще будут отображаться в дереве доступности. Если вы не хотите, чтобы элемент отображался в дереве доступности, используйте aria-hidden="true".
Примеры
Использование auto для снижения затрат на отрисовку длинных страниц
Следующий пример демонстрирует использование content-visibility: auto для пропуска отрисовки и рендеринга внеэкранных разделов. Когда section находится вне области просмотра, отрисовка содержимого пропускается, пока раздел не приблизится к области просмотра. Это помогает как при загрузке, так и при взаимодействиях на странице.
HTML
<section> <!-- Content for each section… --> </section> <section> <!-- Content for each section… --> </section> <section> <!-- Content for each section… --> </section> <!-- … -->
CSS
Свойство contain-intrinsic-size добавляет значения по умолчанию 500px к высоте и ширине каждого элемента section. После отрисовки раздела он сохраняет свои отрендеренные внутренние размеры, даже когда он прокручивается за пределы области просмотра.
section {
content-visibility: auto;
contain-intrinsic-size: auto 500px;
}
Использование hidden для управления видимостью
Следующий пример демонстрирует, как управлять видимостью содержимого с помощью JavaScript. Использование content-visibility: hidden; вместо display: none; сохраняет состояние отрисовки содержимого при скрытии, и отрисовка происходит быстрее.
HTML
<div class="hidden">
<button class="toggle">Show</button>
<p>
This content is initially hidden and can be shown by clicking the button.
</p>
</div>
<div class="visible">
<button class="toggle">Hide</button>
<p>
This content is initially visible and can be hidden by clicking the button.
</p>
</div>
CSS
Свойство content-visibility задано для абзацев, которые являются прямыми дочерними элементами элементов с классами visible и hidden. В нашем примере мы можем показывать и скрывать содержимое в абзацах в зависимости от класса CSS родительских div элементов.
Свойство contain-intrinsic-size включено для представления размера содержимого. Это помогает снизить сдвиг макета при скрытии содержимого.
p {
contain-intrinsic-size: 0 1.1em;
border: dotted 2px;
}
.hidden > p {
content-visibility: hidden;
}
.visible > p {
content-visibility: visible;
}
JavaScript
const handleClick = (event) => {
const button = event.target;
const div = button.parentElement;
button.textContent = div.classList.contains("visible") ? "Show" : "Hide";
div.classList.toggle("hidden");
div.classList.toggle("visible");
};
document.querySelectorAll("button.toggle").forEach((button) => {
button.addEventListener("click", handleClick);
});
Результат
Анимация видимости содержимого
В этом примере у нас есть элемент <div>, содержимое которого можно переключать между отображением и скрытием, нажав на него или любую клавишу.
HTML
<p> Click anywhere on the screen or press any key to toggle the <code><div></code> content between hidden and showing. </p> <div> This is a <code><div></code> element that animates between <code>content-visibility: hidden;</code>and <code>content-visibility: visible;</code>. We've also animated the text color to create a smooth animation effect. </div>
CSS
В CSS мы изначально устанавливаем content-visibility: hidden; для <div> , чтобы скрыть его содержимое. Затем мы настраиваем @keyframe анимации и привязываем их к классам для отображения и скрытия <div>, анимируя content-visibility и color, чтобы получить плавную анимацию при отображении/скрытии содержимого.
div {
font-size: 1.6rem;
padding: 20px;
border: 3px solid red;
border-radius: 20px;
width: 480px;
content-visibility: hidden;
}
/* Animation classes */
.show {
animation: show 0.7s ease-in forwards;
}
.hide {
animation: hide 0.7s ease-out forwards;
}
/* Animation keyframes */
@keyframes show {
0% {
content-visibility: hidden;
color: rgb(0 0 0 / 0%);
}
100% {
content-visibility: visible;
color: rgb(0 0 0 / 100%);
}
}
@keyframes hide {
0% {
content-visibility: visible;
color: rgb(0 0 0 / 100%);
}
100% {
content-visibility: hidden;
color: rgb(0 0 0 / 0%);
}
}
JavaScript
Наконец, мы используем JavaScript для применения классов .show и .hide к <div> соответственно, чтобы применить анимации при переключении между отображением и скрытием.
const divElem = document.querySelector("div");
const htmlElem = document.querySelector(":root");
htmlElem.addEventListener("click", showHide);
document.addEventListener("keydown", showHide);
function showHide() {
if (divElem.classList[0] === "show") {
divElem.classList.remove("show");
divElem.classList.add("hide");
} else {
divElem.classList.remove("hide");
divElem.classList.add("show");
}
}
Результат
Отображаемый результат выглядит следующим образом:
Спецификации
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
content-visibility |
85 | 85 | 125 | 71 | 18 | 85 | 125 | 60 | 18 | 14.0 | 85 |
auto |
85 | 85 | 125 | 71 | 18 | 85 | 125 | 60 | 18 | 14.0 | 85 |
hidden |
85 | 85 | 125 | 71 | 18 | 85 | 125 | 60 | 18 | 14.0 | 85 |
is_transitionable |
117 | 117 | Нет | 103 | 18 | 117 | Нет | 78 | 18 | 24.0 | 117 |
keyframe_animatable |
116 | 116 | Нет | 102 | 18 | 116 | Нет | 78 | 18 | 24.0 | 116 |
visible |
85 | 85 | 125 | 71 | 18 | 85 | 125 | 60 | 18 | 14.0 | 85 |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/content-visibility