Разное
Селекторы
:is() перечисляет варианты в одном селекторе. Его специфичность равна самому тяжёлому варианту внутри скобок. :where() делает то же самое, но специфичность всегда нулевая, поэтому такое правило легко перекрыть.
:is(h1, h2, h3) {
font-family: Arial, sans-serif;
}
:where(.card, .panel) a {
color: inherit;
}
:has() выбирает элемент, внутри которого есть подходящий потомок.
.card:has(.badge) {
border-color: #c00;
}
:focus-visible срабатывает, когда фокус пришёл с клавиатуры. Клик мышью его обычно не показывает.
button:focus-visible {
outline: 2px solid #1a1a1a;
}
Вложенность пишут прямо в CSS. & означает текущий селектор.
.card {
color: #222;
& .title {
font-size: 20px;
}
&:hover {
color: #c00;
}
}
Каскад
@layer задаёт порядок групп правил. Побеждает слой, который в списке стоит позже. Правило вне слоёв перекрывает правила внутри слоёв.
@layer base, theme;
@layer base {
button {
color: gray;
}
}
@layer theme {
button {
color: blue;
}
}
!important перекрывает обычное объявление с любой специфичностью.
revert возвращает значение, которое было до правил автора: для обычного свойства это стиль браузера. initial возвращает начальное значение самого свойства, а не стиль браузера.
button {
color: revert;
}
Значения
vmin — 1% меньшей стороны окна, vmax — 1% большей. svh считает высоту, когда панель браузера на телефоне открыта. lvh считает её скрытой. dvh меняется вместе с панелью.
.screen {
min-height: 100dvh;
font-size: 4vmin;
}
min() берёт меньшее значение, max() — большее. clamp() держит предпочитаемое значение между минимумом и максимумом.
h1 {
font-size: clamp(20px, 4vw, 40px);
width: min(720px, 100%);
}
oklch задаёт светлоту, насыщенность и оттенок. color-mix() смешивает два цвета. light-dark() выбирает цвет по схеме страницы. Для него на корне задают color-scheme.
:root {
color-scheme: light dark;
}
body {
color: oklch(30% 0.02 250);
background: light-dark(#fff, #111);
border-color: color-mix(in oklch, blue 40%, white);
}
Адаптив
@container смотрит на ширину родителя, а не окна. Родителю задают container-type: inline-size. Запрос срабатывает у его потомков.
.card {
container-type: inline-size;
}
@container (min-width: 400px) {
.card h2 {
font-size: 24px;
}
}
prefers-color-scheme читает светлую или тёмную схему системы. prefers-reduced-motion говорит, что пользователь просит меньше движения.
@media (prefers-color-scheme: dark) {
body {
background: #111;
color: #fff;
}
}
@media (prefers-reduced-motion: reduce) {
.card {
transition: none;
}
}
aspect-ratio задаёт соотношение сторон самому элементу.
.video {
width: 100%;
aspect-ratio: 16 / 9;
}
Сетка
subgrid отдаёт потомку колонки или строки родителя. Внутренние элементы встают в те же линии, а не в свою отдельную сетку.
.grid {
display: grid;
grid-template-columns: 1fr 2fr;
}
.grid article {
display: grid;
grid-column: 1 / -1;
grid-template-columns: subgrid;
}
Прокрутка
scroll-snap-type останавливает прокрутку на элементах. У потомка ставят scroll-snap-align.
.row {
display: flex;
overflow-x: auto;
scroll-snap-type: x mandatory;
}
.row img {
scroll-snap-align: start;
}
overscroll-behavior: contain не отдаёт прокрутку родителю, когда свой блок уже докручен до края.
.panel {
overflow: auto;
overscroll-behavior: contain;
}
Логические свойства
inline идёт по строке, block — поперёк строки. В обычном горизонтальном тексте margin-inline — это левый и правый отступ, padding-block — верхний и нижний.
.card {
margin-inline: auto;
padding-block: 16px;
padding-inline: 24px;
}
Новые свойства
Ниже свойства и функции, которые есть в текущих Chrome, Firefox и Safari и которых нет в остальных заметках. Статус на октябрь 2026 года: Baseline.