SCSS-переопределение @extend другим @extend
Общая проблема, с которой я сталкиваюсь с @extend, заключается в попытке переопределить унаследованные свойства с помощью другого @extend.
Вот пример:
// class selectors to be @extended
// these could also use % to be silent/placeholder selectors
.size-2xl {
    @include rem(font-size, 40px);
}
.size-3xl {
    @include rem(font-size, 60px);
}
// mapping the class selector properties onto some structural classes
.heading1 {
    @extend .size-3xl;
}
.heading1-small {
    @extend .heading1;
    @extend .size-2xl;
}
Когда SCSS компилируется, .heading1 и .heading1-small получат правильные свойства, но .heading1-small будут слишком большими. 
Это, по-видимому, происходит, когда класс @extend - able отображается на несколько различных селекторов.
Когда SCSS компилируется в CSS, различные селекторы объединяются в один или несколько наборов правил с множественные селекторы.
Иногда SCSS кажется скомпилированным "не по порядку", так что скомпилированный .heading1 множественный селектор выводится после .heading1-small множественного селектора. 
Это может быть даже вложенный @extend, вызывающий такое поведение.
- использовать @include('size-2xl')(менее сухой)
- не @extendПравила, содержащие@extend(ограничивает использование @ extend)
Спасибо.
1 ответ:
Наборы правил в выходном CSS находятся точно в том же месте/порядке/последовательности, как они были определены в SCSS, только вы выводите только расширенные
.size-2xlи.size-3xlнаборы правил. Поэтому вам нужно поменять местами эти два определения правил (см. демо-версия) или определите правила size как микшины и включите их в заголовок правила (см. демо-версия). Итак, я думаю, что вы, должно быть, путаете что-то о том, как работает@extend.Если вы есть что-то вроде этого:
.class1 { foo: bar1; } .class2 { foo: bar2; @extend .class1; }Вы только добавите селектор
.class2к уже существующему набору правил с селектором.class1- так что выход будет выглядеть следующим образом:.class1, .class2 { foo: bar1; } .class2 { foo: bar2; }Однако, если мы не добавим никаких новых свойств к
.class2, а просто используем@extend:.class1 { foo: bar1; } .class2 { @extend .class1; }Набор правил
.class2не будет напечатан в CSS, и только селектор будет добавлен в.class1- отсюда вывод:.class1, .class2 { foo: bar1; }Это более или менее то, что вы делаете, просто добавляя селекторы
.header1и.header2к правилам.size-2xlи.size-3xl, таким образом, выходные данные будут находиться в том же месте/порядке, в котором эти правила определены в SCSS.Итак, что вы получите в конце вашего примера:
- вы определяете наборы правил
.size-2xlи.size-3xl- вы добавляете селектор
.header1-smallв наборы правил.size-2xl- вы добавляете
.header1-smallв селектор.header1и добавляете оба в набор правил.size-3xl- набор правил
.size-2xl(Теперь после расширения:.size-2xl, .header1-small) печатается в CSS- набор правил
.size-3xl(Теперь после расширения:.size-3xl, .header1, .header1-small) печатается в CSS- набор правил
.header1(также расширенный.header1, .header1-small) не распечатывается, так как не имеет определенных свойств- набор правил
.header1-smallне распечатывается, так как не имеет определенных свойствЕще одно примечание: то же самое произойдет и при использовании селекторов заполнителей (
%), только тогда это может быть еще более запутанным, например в.size-3xl, .header1, .header1-small.size-3xlбудет невидимым, но в CSS все это будет по-прежнему компилироваться в том месте, где Правило.size-3xlбыло определено в SCSS.