Обновление синтаксиса CSS вложенности
В начале этого года в 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 свойством и значением.
К счастью, инженер обнаружил, что если парсеру не удалось разобрать вложенный селектор как свойство при обычном проходе, то его можно перезапустить в режиме, предполагающем наличие селектора вместо свойства. Парсинг возобновляется, подтверждая вложенность как вложенность селектора. Это достаточно быстро и достаточно надёжно, чтобы быть достаточным для релиза синтаксиса.