1 июля 2022 года обновился черновик CSS Containment Module Level 3, в котором добавили новую возможность контейнеру — работать от стилей.
До обновления выражение от контейнера имело одну единственную характеристику — размер. Контейнер принимал решение, как ему измениться, в зависимости от размера — ширины, высоты, inline-size, block-size, пропорции и ориентации.
.wrapper {
container-type: inline-size;
}
.card {
padding: 10px;
}
@container (width > 500px) {
.card {
padding: 20px;
}
}
Теперь у выражений от контейнеров появилась новая характеристика — стили. Это значит, что контейнер в зависимости от вычисленного значения стиля может принять решение, как ему выглядеть.
👉🏻 Вычисленное значение — процесс преобразования относительного значения в абсолютное. Например, если у элемента значения font-size: 18px
, а padding: 2em
, то вычисленное значение у padding
будет 36px.
Сейчас опустим проценты для лайаута, безразмерные числа и специальные значений initial
и inherit
для упрощения.
@container style(background-color: white) {
.card {
color: black;
}
}
Выражения от стилей должны быть быть обёрнуты в style()
, чтобы отличать запросы от размера. Также хорошей новостью является то, что все элементы по умолчанию будут иметь container-type: style
. Именно поэтому он не указан в предыдущем примере кода.
Выражения от размеров и стилей можно комбинировать.
@container (width > 500px) and style(background-color: white) {
.card { }
}
Где применять на практике
Пока сложно говорить, так как сама спецификация ещё черновик, а выражения от размеров работают в последней версии Safari и свежем Chrome, но кто нам помешает пофантазировать?
Например, если все наклонные тексты вам нужно сделать с подложкой, то это будет достаточно просто сделать:
@container style(font-style: italic) {
span,
i,
.etc {
background: lavender;
}
/* или */
* {
background: lavender;
}
}
Конечно же для добавления тем на сайт:
@container style(--theme: dark) {
.card { }
}
И даже для ховеров
.card:hover,
.card:focus {
--theme: darkHover;
}
/* apply darkHover theme styles */
@container style(--theme: darkHover) {
.card { }
}
А пока ждём, пока выражения от стилей появятся везде.