Современный CSS
Нативная вложенность, :has(), :is/:where, логические свойства, @layer.
Обновлено
Что значит «современный CSS»
За последние годы в CSS появились возможности, для которых раньше нужны были Sass или JavaScript. Всё, что ниже, сегодня работает во всех основных браузерах — это стоит использовать, а не просто знать.
Nesting — вложенные правила, нативно
.card {
padding: 1rem;
& h3 { font-weight: 600; } /* .card h3 */
&:hover { border-color: gray; } /* .card:hover */
.dark & { background: black; } /* .dark .card */
@media (min-width: 48rem) {
padding: 2rem;
}
}& = родительский селектор. Как в Sass, но без сборки. Не вкладывайте глубже 2–3 уровней — растёт специфичность, и CSS становится трудно читать.
:has() — «родительский селектор»
Впервые можно стилизовать элемент по тому, что он содержит, или по тому, что происходит после него:
.card:has(img) { padding-top: 0; } /* карточки с изображением */
.field:has(input:invalid) label { color: var(--danger); } /* label невалидного поля */
form:has(:focus-visible) { outline: 2px solid; } /* форма, в которой фокус */
body:has(dialog[open]) { overflow: hidden; } /* блокирует прокрутку при открытой модалке */Многое, что раньше требовало состояния в React (класс на родителе), теперь решается одним CSS.
:is() и :where() — списки селекторов
:is(h1, h2, h3):hover { color: var(--accent); }
:where(ul, ol) { padding-left: 1rem; }:is() |
:where() |
|
|---|---|---|
| Специфичность | самого специфичного аргумента | ноль |
| Когда | сократить повторяющиеся селекторы | базовые стили / сброс, легко переопределить |
Логические свойства
Вместо лево / право / верх / низ вы описываете направление относительно текста. Раскладка автоматически работает и в языках с письмом справа налево (арабский, иврит).
| Физические | Логические |
|---|---|
margin-left / margin-right |
margin-inline-start / margin-inline-end |
padding-left + padding-right |
padding-inline |
padding-top + padding-bottom |
padding-block |
width / height |
inline-size / block-size |
top/right/bottom/left: 0 |
inset: 0 |
В Tailwind они есть: ps-4, pe-4, ms-auto, px-4 = padding-inline.
@layer — порядок каскада, явно
@layer reset, base, components, utilities;
@layer components {
.btn { padding: 1rem; }
}Слои, объявленные позже, побеждают независимо от специфичности — см. Каскад. Tailwind v4 построен на них (theme, base, components, utilities).
Другие полезные возможности
| Возможность | Что делает |
|---|---|
clamp(), min(), max() |
плавные значения без media queries |
color-mix(in oklab, var(--c) 20%, transparent) |
цвета, производные от токенов |
oklch() |
цвета, равномерные для восприятия — лучшие палитры |
| container queries | адаптивность по родителю — Адаптивность |
aspect-ratio |
фиксированные пропорции |
text-wrap: balance / pretty |
сбалансированные заголовки, без висячих слов |
accent-color |
цвет нативных чекбоксов и радиокнопок |
Коротко
- Нативная вложенность через
&;:has()стилизует по содержимому;:where()= нулевая специфичность. - Логические свойства (
padding-inline,inset) вместо лево / право. @layerуправляет каскадом;color-mix,oklch,text-wrap: balance— для современных деталей.