Вложение нескольких классов одного типа в одного родителя
Я хочу создать классы, как показано ниже:
.colored{
&{
.red{background-color:red;}
.blue{background-color:blue;}
.gray{background-color:gray;}
}
}
и это не работает, но если я напишу так:
.colored{
&.red{
background-color:red;
}
&.blue{
background-color:blue;
}
&.gray{
background-color:gray;
}
}
тогда это работает. Есть ли причины, по которым первая версия не работает должным образом?
1 ответ
Причина:
Это происходит из-за того, как вложенность работает (и должна работать) в Less. Когда вы вкладываете селектор под другой селектор, внутренний селектор считается применимым для элемента, который является дочерним по отношению к элементу, представленному внешним селектором.
Ниже приведен код
.colored{
&{
.red{background-color:red;}
.blue{background-color:blue;}
.gray{background-color:gray;}
}
}
эквивалентно следующему (потому что &
будет заменен родительским селектором, который .colored
)
.colored{
.red{background-color:red;}
.blue{background-color:blue;}
.gray{background-color:gray;}
}
Теперь, как я упоминал ранее, это будет компилировать в .colored .red
, .colored .blue
, .colored .gray
(обратите внимание на пространство между селекторами).
С другой стороны, когда вы вставляете &
непосредственно перед .red
.blue
.gray
, это означает, что родительский селектор и вложенный селектор применяются к одному и тому же элементу (а не дочернему элементу). Селекторы, которые он выведет .colored.red
, .colored.blue
, .colored.gray
(обратите внимание, что там нет места).
Решение:
Это тот же код, что и в вашем вопросе, и это рекомендуемое решение. Я отправляю это снова в ответе только, чтобы сделать это полным.
.colored{
&.red{
background-color:red;
}
&.blue{
background-color:blue;
}
&.gray{
background-color:gray;
}
}