Вложенные стили в CSS
Важно: нативная вложенность похожа на синтаксис препроцессоров, но поведение селектора отличается — обязательно применяйте & при ссылке на родителя.
Ключевые варианты запроса
- вложенные стили в CSS
- nested css
- вложенность в CSS без препроцессора
- & селектор в CSS
- вложенные медиа-запросы
Введение
Исторически CSS воспринимался как неудобный для масштабирования язык: отсутствовали переменные, функции и удобные структуры. Препроцессоры (Sass, Less, Stylus) добавили удобства — вложенность, миксины, циклы. Со временем сам CSS заимствовал ряд идей из препроцессоров. Одна из таких идей — вложенные стили.
Вложенность позволяет группировать правила по структуре HTML. Это делает код более организованным: визуально видно, какие элементы относятся к какому контейнеру.
Вложенные стили: старый/классический способ
Вложенность была доступна в препроцессорах вроде Sass и Less. Смысл одинаков: описать отношения «родитель — потомок» компактно. В обычном CSS для оформления всех h1 внутри .container нужно было писать так:
.container {
background-color: #f2f2f2;
}
.container h1 {
font-size: 44px;
}
В препроцессоре (например, Less) та же логика выглядела короче:
.container{
background-color: #f2f2f2;
h1 {
font-size:44px;
}
}
Преимущество — явная иерархия. Глубину вложенности можно увеличивать, но чрезмерная вложенность ухудшает поддержку и может привести к излишне специфичным селекторам.
Нативная вложенность в CSS
Нативная вложенность работает похоже на препроцессоры, но с важной разницей: при обращении к дочернему элементу прямо по имени браузер не всегда правильно понимает контекст. Рассмотрим пример полного HTML-файла:
Nested Styling in CSS
Hello from the children of planet Earth!
В примере контейнер получает красный фон, а вложенный h1 — жёлтый цвет текста. Но в реальном браузере вы заметите, что фон применяется, а цвет h1 — нет. Причина в том, что нативная вложенность требует явной ссылки на родительский селектор при формировании итогового селектора. Для этого используется амперсанд (&):
.container {
background-color: red;
& h1 {
color: yellow;
}
}
Здесь & служит ссылкой на родительский селектор .container. Комбинация «& h1» означает “.container h1” в итоговом CSS, и браузер применит цвет.
Похожим образом можно обращаться к псевдоклассам и псевдоэлементам:
.parent1{
&:hover{
background-color: red;
}
&::before{
content:"Here is a pseudo element.";
}
}
Это делает код компактным и очевидным: все состояния и вставки связаны с родителем.
Вложенные медиа-запросы
Раньше нужно было писать медиа-запросы отдельно:
p {
color:black;
}
@media (min-width:750px) {
p {
color:gray;
}
}
Теперь можно вложить @media внутрь правила элемента — это улучшает читаемость и связывает условие с конкретным элементом:
p {
color:black;
@media (min-width:750px) {
color:gray;
}
}
Такая организация уменьшает фрагментацию стилей: вы видите базовое правило и условное переопределение рядом.
Пример: стилизация сайта с использованием вложенности
Создайте папку, добавьте index.htm и style.css. В index.htm разместите примерную разметку (ниже — та же, что в демонстрации):
Simple Website
Lorem ipsum dolor sit amet consectetur adipisicing elit.
David Uzondu
3 hours ago
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Illo ut
quasi hic sint dolorum sapiente magni ratione? Suscipit commodi ad,
asperiores nostrum natus aperiam et alias, officiis dolorum ipsa vero
minima consequatur recusandae quasi aliquid quibusdam ducimus eaque!
Excepturi voluptas eveniet nemo, earum doloribus, soluta architecto
iste repellat autem aspernatur beatae ut quis odio est voluptates sunt
qui rerum blanditiis minus! Rerum labore nobis, odit quod amet dolorum
quae laudantium.
Trending Articles
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Fugit, iusto ipsum!
В style.css вы можете оформить контейнер и вложенные правила так:
.container {
display: flex;
gap: 25px;
@media(max-width:750px) {
flex-direction: column;
}
.article{
width:90%;
}
& div:nth-child(3) {
text-align: justify;
}
& span {
color: rgb(67, 66, 66);
&:nth-child(1)::before {
font-style: italic;
content: "Written by ";
}
&:nth-child(2) {
font-style: italic;
&::before {
content: " ~ ";
}
}
}
.meta-data {
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: solid 1px;
}
}
Результат — компактный и логически сгруппированный CSS:
Нужен ли препроцессор теперь?
Короткий ответ: не обязательно. Длинный — зависит от задач. Нативная вложенность решает одну из основных удобств препроцессоров, но препроцессоры всё ещё дают:
- циклы и итерации для генерации повторяющегося CSS;
- миксины и функции для переиспользования блоков кода;
- более зрелую систему переменных и вычислений (хотя CSS-переменные и функции частично компенсируют это).
Если вам нужны только вложенность и простые переиспользуемые куски — можно обойтись нативным CSS. Если проект предполагает сложную генерацию стилей, препроцессор остаётся удобным инструментом.
Когда вложенность не подходит (примеры и предостережения)
- Слишком глубокая вложенность приводит к высокой специфичности и сложной поддержке.
- Избыточная вложенность ухудшает читаемость и мешает переиспользованию классов в разных местах.
- Встроенные селекторы без & могут не транслироваться так, как в препроцессоре — внимательно проверяйте итоговые селекторы.
- Поддержка в браузерах может отличаться; в CI/CD включайте проверку совместимости (Can I use, автотесты).
Альтернативные подходы
- Использовать методологии классов (BEM, ITCSS) — минимизируют необходимость глубокой вложенности.
- CSS-переменные и кастомные функции заменяют часть возможностей препроцессоров.
- Инструменты типа PostCSS с плагинами могут транспилировать удобный синтаксис в совместимый CSS.
Шпаргалка: как и когда использовать &
- & h1 → .parent h1
- &.mod → .parent.mod (если нужно добавить модификатор к родителю)
- &:hover → .parent:hover
- &::before → .parent::before
- & > a → .parent > a
Подсказка: если вы хотите получить селектор, начинающийся не с родителя, используйте &:matches(…) или составные селекторы с осторожностью.
Чек-листы по ролям
Разработчик:
- Проверить итоговые селекторы в DevTools;
- Избегать вложенности глубже 3 уровней;
- Добавить тесты на визуальную регрессию для ключевых компонентов.
Дизайнер / верстальщик:
- Обозначить общие контейнеры и компоненты, где вложенность оправдана;
- Попросить разработчика не делать уникальных селекторов, мешающих переиспользованию.
Техлид:
- Включить проверку поддержки браузеров в CI;
- Установить правила максимум уровней вложенности в Style Guide.
Критерии приёмки
- Итоговый CSS не содержит селекторов с чрезмерной специфичностью;
- Все ключевые компоненты отображаются одинаково в целевых браузерах;
- Изменение стиля одного компонента не ломает другие из-за непреднамеренной специфичности.
Ментальные модели и эвристики
- Думайте о вложенности как о вложенных блоках в документе: только там, где действительно есть иерархия, используйте вложенность.
- Если правило может применяться к разным компонентам, лучше вынести его на верхний уровень и назвать класс явно.
Быстрая методология внедрения вложенности в проект
- Обозначьте компоненты, где вложенность улучшит поддержку (карточки, статьи, виджеты).
- Ограничьте глубину до 2–3 уровней.
- Используйте & для всех ссылок на родителя, чтобы избежать неожиданных селекторов.
- Запустите визуальные тесты и проверьте в целевых браузерах.
Decision flowchart (Mermaid)
flowchart TD
A[Нужна ли вложенность?] -->|Да| B{Глубина > 3?}
B -->|Да| C[Отказаться или рефакторить]
B -->|Нет| D[Использовать & и вложенность]
A -->|Нет| E[Писать обычные селекторы / BEM]Рекомендации по совместимости и миграции
- Проверяйте поддержку нативной вложенности в целевых браузерах (Can I use). Если поддержка недостаточна — используйте транспилеры (PostCSS) или оставьте препроцессор.
- При миграции от препроцессора будьте внимательны к месту вставки селектора: заменяйте простые вложения на конструкции с &.
Краткое объявление для команды (100–200 слов)
Нативная вложенность CSS теперь позволяет писать более компактный и читаемый код, группируя стили по компонентам. Мы можем постепенно внедрять её в новые компоненты: использовать & для ссылок на родителя, ограничивать глубину вложенности и запускать проверку поддержки браузеров. Для сложной генерации стилей (циклы, миксины) остаётся смысл в препроцессоре. План внедрения: репозиторный эксперимент на 1–2 компонентах, правила стиля в CONTRIBUTING.md и автоматическая проверка совместимости в CI.
Краткое резюме
- Нативная вложенность делает CSS более выразительным и уменьшает фрагментацию стилей.
- Обязательно используйте & при обращении к родителю — это ключевое отличие от препроцессоров.
- Не злоупотребляйте глубокой вложенностью: держите правила простыми и переиспользуемыми.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone