@container
Базовая версия 2023
Новое
С февраля 2023 года эта функция работает на последних версиях устройств и браузеров. Возможно, она не будет работать на старых устройствах или браузерах.
Правило @container CSS правило — это условное групповое правило, которое применяет стили к контексту контейнера. Объявления стилей отфильтровываются по условию и применяются к контейнеру, если условие истинно. Условие оценивается при изменении размера контейнера или значения <style-feature>.
Свойство container-name задаёт список имён контейнеров запросов. Эти имена могут использоваться правилами @container для фильтрации целевых контейнеров запросов. Необязательный, регистрозависимый <container-name> фильтрует контейнеры запросов, которые являются целевыми для запроса.
После выбора подходящего контейнера запроса для элемента, каждая функция контейнера в <container-condition> оценивается относительно этого контейнера запроса.
Синтаксис
Правило @container имеет следующий синтаксис:
@container <container-condition># {
<stylesheet>
}
Например:
@container (width > 400px) {
h2 {
font-size: 1.5em;
}
}
/* with an optional <container-name> */
@container tall (height > 30rem) {
h2 {
line-height: 1.6;
}
}
/* multiple queries in a single condition */
@container (width > 400px) and style(--responsive: true) {
h2 {
font-size: 1.5em;
}
}
/* condition list */
@container card (width > 400px), style(--responsive: true) {
h2 {
font-size: 1.5em;
}
}
Значения
<container-condition>-
Необязательное
<container-name>и<container-query>. Определённые в<stylesheet>стили применяются, если условие истинно.<container-name>-
Необязательно. Имя контейнера, к которому будут применены стили, когда запрос примет истинное значение, указанное как
<ident>. <container-query>-
Набор функций, которые оцениваются относительно контейнера запроса при изменении размера контейнера.
<stylesheet>-
Набор объявлений CSS.
Логические ключевые слова в запросах к контейнерам
Логические ключевые слова могут использоваться для определения условия контейнера:
-
andобъединяет два или более условий. -
orобъединяет два или более условий. -
notотрицает условие. Только одно условие 'not' разрешено для каждого запроса к контейнеру и не может использоваться с ключевыми словамиandилиor.
@container (width > 400px) and (height > 400px) {
/* <stylesheet> */
}
@container (width > 400px) or (height > 400px) {
/* <stylesheet> */
}
@container not (width < 400px) {
/* <stylesheet> */
}
Именованные контексты ограничения
Контекст ограничения может быть именован с помощью свойства container-name.
.post {
container-name: sidebar;
container-type: inline-size;
}
Краткая запись для этого — использование container в форме container: <name> / <type>, например:
.post {
container: sidebar / inline-size;
}
В запросах к контейнерам свойство container-name используется для фильтрации набора контейнеров до тех, у которых совпадает имя контейнера запроса:
@container sidebar (width > 400px) {
/* <stylesheet> */
}
Подробности об использовании и ограничениях именования описаны на странице container-name.
Дескрипторы
В условии контейнера можно использовать следующие дескрипторы:
aspect-ratio-
Соотношение сторон
aspect-ratioконтейнера, вычисленное как отношение ширины к высоте контейнера, выраженное как значение<ratio>. block-size-
Размер
block-sizeконтейнера, выраженный как значение<length>. height-
Высота контейнера, выраженная как значение
<length>. inline-size-
Размер
inline-sizeконтейнера, выраженный как значение<length>. orientation-
Ориентация контейнера, либо
landscapeилиportrait. width-
Ширина контейнера, выраженная как значение
<length>.
Примеры
Настройка стилей на основе размера контейнера
Рассмотрим следующий пример компонента карточки с заголовком и текстом:
<div class="post">
<div class="card">
<h2>Card title</h2>
<p>Card content</p>
</div>
</div>
Контекст контейнера можно создать с помощью свойства container-type, в данном случае с использованием значения inline-size для класса .post. Затем можно использовать правило @container для применения стилей к элементу с классом .card в контейнере, который уже меньше 650px.
/* A container context based on inline size */
.post {
container-type: inline-size;
}
/* Apply styles if the container is narrower than 650px */
@container (width < 650px) {
.card {
width: 50%;
background-color: gray;
font-size: 1em;
}
}
Создание именованных контекстов контейнера
В примере HTML — компонент карточки с заголовком и текстом:
<div class="post">
<div class="card">
<h2>Card title</h2>
<p>Card content</p>
</div>
</div>
Сначала создайте контекст контейнера, используя свойства container-type и container-name. Краткая запись для этого описана на странице container.
.post {
container-type: inline-size;
container-name: summary;
}
Затем укажите этот контейнер, добавив имя в запрос к контейнеру:
@container summary (min-width: 400px) {
.card {
font-size: 1.5em;
}
}
Вложенные запросы к контейнерам
Невозможно указать несколько контейнеров в одном запросе к контейнеру. Можно вложить запросы к контейнерам, что даст тот же эффект.
Следующий запрос оценивается как истинный и применяет объявленный стиль, если контейнер с именем summary шире 400px и имеет родительский контейнер, шире 800px.
@container summary (min-width: 400px) {
@container (min-width: 800px) {
/* <stylesheet> */
}
}
Запросы к стилю контейнера
Экспериментально: Это экспериментальная технология
Перед использованием в продакшне тщательно проверьте таблицу совместимости браузеров.
Запросы к контейнерам также могут оценивать вычисленный стиль элемента контейнера. Запрос к стилю контейнера — это запрос @container который использует одну или несколько функциональных нотаций style(). Булевой синтаксис и логическое объединение функций стиля в запрос стиля такой же, как и для запросов к функциям CSS.
@container style(<style-feature>),
not style(<style-feature>),
style(<style-feature>) and style(<style-feature>),
style(<style-feature>) or style(<style-feature>) {
/* <stylesheet> */
}
Параметр каждой style() — это одно <style-feature>. <style-feature> — это допустимое объявление CSS, свойство CSS или <custom-property-name>.
@container style(--themeBackground),
not style(background-color: red),
style(color: green) and style(background-color: transparent),
style(--themeColor: blue) or style(--themeColor: purple) {
/* <stylesheet> */
}
Функция стиля без значения истинна, если вычисленное значение отличается от начального значения для данного свойства.
Если <style-feature> переданное как аргумент функции style(), является объявлением, запрос к стилю оценивается как истинный, если значение объявления совпадает с вычисленным значением этого свойства для запрошенного контейнера. В противном случае результат ложный.
Следующий запрос к контейнеру проверяет, что вычисленное computed_value свойства --accent-color элемента контейнера равно blue:
@container style(--accent-color: blue) {
/* <stylesheet> */
}
Примечание: Если у пользовательского свойства есть значение blue, эквивалентный шестнадцатеричный код #0000ff не будет соответствовать, если свойство не было определено как цвет с @property, чтобы браузер мог правильно сравнивать вычисленные значения.
Функции стиля, которые запрашивают сокращённое свойство, истинны, если вычисленные значения совпадают для каждого из его свойств, и ложны в противном случае. Например, @container style(border: 2px solid red) истинно, если все 12 длинных свойств (border-bottom-style, и т. д.) составляющие это сокращённое свойство, истинны.
Глобальные revert и revert-layer недопустимы в качестве значений в запросе <style-feature> и приводят к ложному значению запроса к стилю контейнера.
Спецификации
| Спецификация |
|---|
| Модуль условных правил CSS уровня 5 # container-rule |
Совместимость с браузерами
| Рабочий стол | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
@container |
105 | 105 | 110 | 91 | 16 | 105 | 110 | 72 | 16 | 20.0 | 105 |
style_queries_for_custom_properties |
111 | 111 | Нет | 97 | 18Элемент документа не может быть контейнером. См. ошибку 271040. |
111 | Нет | 75 | 18Элемент документа не может быть контейнером. См. ошибку 271040. |
22.0 | 111 |
См. также
© 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/@container