Spec-Zone.ru › CSS

содержимое

Базовая линия Широко доступно

Эта функция хорошо отработана и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с марта 2022 года.

  • Подробнее
  • Полная совместимость
  • Отправить отзыв

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

Попробуйте

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

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

Примечание: Использование значений layout, paint, strict или content для этого свойства создает:

  1. Новый контейнерный блок (для потомков, у которых свойство position имеет значение absolute или fixed).
  2. Новый стек-контекст.
  3. Новый блочный контекст форматирования.

Синтаксис

/* Keyword values */
contain: none;
contain: strict;
contain: content;
contain: size;
contain: inline-size;
contain: layout;
contain: style;
contain: paint;

/* Multiple keywords */
contain: size paint;
contain: size layout paint;
contain: inline-size layout;

/* Global values */
contain: inherit;
contain: initial;
contain: revert;
contain: revert-layer;
contain: unset;

Значения

Свойство contain может иметь любое из следующих значений:

  • Ключевое слово none или
  • Одно или несколько ключевых слов, разделенных пробелами, size (или inline-size), layout, style, и paint в любом порядке или
  • Одно из значений-сокращений strict или content

Ключевые слова имеют следующие значения:

none

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

strict

Все правила контейнирования применяются к элементу. Это эквивалентно contain: size layout paint style.

content

Все правила контейнирования, кроме size, применяются к элементу. Это эквивалентно contain: layout paint style.

size

Применяется контейнирование размера к элементу в направлениях inline и block. Размер элемента можно вычислить изолированно, игнорируя дочерние элементы. Это значение нельзя комбинировать с inline-size.

inline-size

Применяется контейнирование размера inline к элементу. Размер inline элемента можно вычислить изолированно, игнорируя дочерние элементы. Это значение нельзя комбинировать с size.

layout

Внутренний макет элемента изолируется от остальной части страницы. Это означает, что ничего вне элемента не влияет на его внутренний макет, и наоборот.

style

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

paint

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

Формальное определение

Начальное значение none
Применимо к всем элементам
Наследуется нет
Вычисленное значение как указано
Тип анимации Не анимируемое

Формальный синтаксис

contain = 
none |
strict |
content |
[ [ size | inline-size ] || layout || style || paint ]

Примеры

Контейнирование отрисовки

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

div {
  width: 100px;
  height: 100px;
  background: red;
  margin: 10px;
  font-size: 20px;
}
<div style="contain: paint">
  <p>This text will be clipped to the bounds of the box.</p>
</div>
<div>
  <p>This text will not be clipped to the bounds of the box.</p>
</div>

Контейнирование макета

Рассмотрим пример ниже, который показывает, как ведут себя элементы с применением и без применения контейнирования макета:

<div class="card" style="contain: layout;">
  <h2>Card 1</h2>
  <div class="fixed"><p>Fixed box 1</p></div>
  <div class="float"><p>Float box 1</p></div>
</div>
<div class="card">
  <h2>Card 2</h2>
  <div class="fixed"><p>Fixed box 2</p></div>
  <div class="float"><p>Float box 2</p></div>
</div>
<div class="card">
  <h2>Card 3</h2>
  <!-- ... -->
</div>
.card {
  width: 70%;
  height: 90px;
}

.fixed {
  position: fixed;
  right: 10px;
  top: 10px;
  background: coral;
}

.float {
  float: left;
  margin: 10px;
  background: aquamarine;
}

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

У второй и третьей карточек контейнирование отсутствует. Контекст макета для фиксированной области во второй карточке — это корневой элемент, поэтому фиксированная область расположена в верхнем правом углу страницы. Флотовый элемент перекрывает границы второй карточки, что приводит к неожиданному сдвигу макета третьей карточки, который виден в позиционировании элемента <h2>. При перерасчете он не ограничивается контейнером. Это влияет на производительность и вмешивается в макет остальной части страницы.

Контейнирование стиля

Контейнирование стиля ограничивает счетчики и кавычки содержащим элементом. Для CSS-счетчиков свойства counter-increment и counter-set ограничиваются элементом, как если бы элемент находился в корне документа.

Контейнирование и счетчики

В примере ниже рассматривается, как работают счетчики при применении контейнирования стиля:

<ul>
  <li>Item A</li>
  <li>Item B</li>
  <li class="container">Item C</li>
  <li>Item D</li>
  <li>Item E</li>
</ul>
body {
  counter-reset: list-items;
}

li::before {
  counter-increment: list-items;
  content: counter(list-items) ": ";
}

.container {
  contain: style;
}

Без контейнирования счетчик увеличивался бы от 1 до 5 для каждого элемента списка. Контейнирование стиля приводит к тому, что свойство counter-increment ограничивается поддеревом элемента, и счетчик снова начинается с 1:

Контейнирование и кавычки

Аналогичным образом влияют на CSS-кавычки значения content, относящиеся к кавычкам, которые ограничены элементом:

<!-- With style containment -->
<span class="open-quote">
  outer
  <span style="contain: style;">
    <span class="open-quote"> inner </span>
  </span>
</span>
<span class="close-quote"> close </span>
<br />
<!-- Without containment -->
<span class="open-quote">
  outer
  <span>
    <span class="open-quote"> inner </span>
  </span>
</span>
<span class="close-quote"> close </span>
body {
  quotes: "[" "]" "‹" "›";
}
.open-quote:before {
  content: open-quote;
}

.close-quote:after {
  content: close-quote;
}

Из-за контейнирования первая закрывающая кавычка игнорирует внутренний span и использует вместо него закрывающую кавычку внешнего span:

Спецификации

Спецификация
Модуль CSS Containment Level 2
# contain-property

Совместимость с браузерами

Рабочий стол Мобильные устройства
Chrome Edge Firefox Opera Safari Chrome для Android Firefox для Android Opera для Android Safari на iOS Samsung Internet WebView Android
contain 52 79 69 39 15.4 52 79 41 15.4 6.0 52
content 52 79 69 39 15.4 52 79 41 15.4 6.0 52
inline-size 105 105 101 91 16 105 101 72 16 20.0 105
layout 52 79 69 39 15.4 52 79 41 15.4 6.0 52
none 52 79 69 39 15.4 52 79 41 15.4 6.0 52
paint 52 79 69 39 15.4 52 79 41 15.4 6.0 52
size 52 79 69 39 15.4 52 79 41 15.4 6.0 52
strict 52 79 69 39 15.4 52 79 41 15.4 6.0 52
style
52До Chrome 115, стили containment не влияли на кавычки, см. баг 40592922.
79До Edge 115, стили containment не влияли на кавычки, см. баг 40592922.
103
39До Opera 101, стили containment не влияли на кавычки, см. баг 40592922.
15.4Стили containment не влияют на кавычки, см. баг 232083.
52До Chrome 115, стили containment не влияли на кавычки, см. баг 40592922.
103
41До Opera 77, стили containment не влияли на кавычки, см. баг 40592922.
15.4Стили containment не влияют на кавычки, см. баг 232083.
6.0До Samsung Internet 23.0, стили containment не влияли на кавычки, см. баг 40592922.
52До Chrome 115, стили containment не влияли на кавычки, см. баг 40592922.

См. также

  • CSS containment
  • CSS container queries
  • Свойство CSS content-visibility
  • Свойство CSS position

© 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/contain

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API