Обновление синтаксиса CSS вложенности

Источник: «CSS nesting relaxed syntax update»
В Chrome 120 включена функция заглядывающей вперёд вложенности.

В начале этого года в Chrome 112 появилась вложенность CSS, и теперь она есть во всех основных браузерах.

Однако в синтаксис было внесено одно строгое и потенциально неожиданное требование, указанное первым в разделе Недопустимые примеры вложения статьи Вложенность CSS. В этой статье мы расскажем, что изменилось в спецификации и в Chrome 120.

Вложенность имён тегов элементов

Одним из наиболее удивительных ограничений в первом релизе синтаксиса CSS вложенности был запрет вложения имён тегов элементов без & или :is(). Это было устранено, что сделало допустимыми следующие CSS вложения:

.card {
h1 {
/* теперь это работает! */
}
}

/* то же самое, что */
.card {
& h1 {
/* теперь это теперь это работает! */
}
}

Это становится действительно удобным при вложении упорядоченных, неупорядоченных списков или списков определений:

dl {
dt {
/* стили dl dt */
}

dd {
/* стили dl dd */
}
}

Какие изменения привели к появлению возможности такой вложенности

Во многом это стало возможным благодаря исследованиям и созданию прототипов инженерами Chrome в сочетании с желанием сообщества и CSS Working Group.

Существовали большие сомнения в том, что парсер CSS можно научить отличать имя тега (div) от имени свойства (visibility), поскольку в настоящее время парсер не имеет понятия, что нужно заглядывать вперёд. Чтобы понять, что лексема является свойством, браузеру необходимо заглянуть вперёд и посмотреть, не следует ли за неизвестной лексемой символ :. Поэтому в первоначальной спецификации символ & использовался для указания браузеру на то, что следующее за ним свойство является вложенным, а не обычным CSS свойством и значением.

К счастью, инженер обнаружил, что если парсеру не удалось разобрать вложенный селектор как свойство при обычном проходе, то его можно перезапустить в режиме, предполагающем наличие селектора вместо свойства. Парсинг возобновляется, подтверждая вложенность как вложенность селектора. Это достаточно быстро и достаточно надёжно, чтобы быть достаточным для релиза синтаксиса.

Дополнительные материалы

Предыдущая Статья

Неортодоксальный Eloquent

Следующая Статья

Новое в Symfony 6.4: Атрибуты AutowireLocator и AutowireIterator