SASS расширяется только от root

Недавно я столкнулся с .. "вещью" в стране SASS. И, может быть, вы, ребята, знаете трюк или что-то подобное, чтобы «исправить» это.

У меня есть этот класс .icon. Он содержит некоторые базовые стили для моих иконок (используется для иконочного шрифта). Затем эти значки можно разместить в разметке, где я захочу. Например, в button. Но внутри кнопки этот значок нуждается в дополнительном стиле. Итак, я делаю следующее:

.icon {
  // Basic styling
}

button {
  .icon {
    // Additional styling
  }
}

Он компилируется в этот css:

.icon {
  // Basic styling
}

button .icon {
  // Additional styling
}

Пока все в порядке. Но теперь я хочу расширить .icon до элемента after внутри всех моих элементов .foo следующим образом:

.foo:after {
  @extend .icon;
}

Теперь он компилируется в этот css:

.icon, .foo:after { // This is good, exactly what I want
  // Basic styling
}

button .icon, button .foo:after { // But I don't need the second half of this line
  // Basic Additional
}

Теперь элемент foo не только расширяет «корневой» класс значков, но также класс значков под кнопкой и все его дополнительные стили. Но мне это не нужно. Я не хочу, чтобы этот элемент имел этот дополнительный стиль. Это еще не приводит к проблемам. Но, возможно, это может произойти позже. Поэтому мне было любопытно, возможно ли расширить только .icon из корня, опуская вложенные .icon в button и, возможно, более вложенные классы значков в других элементах позже.

Моей первой мыслью было использовать абстрактный класс, такой как %icon, и расширять его, но вышеупомянутый класс значков и файл, в который он помещен, генерируются grunt-webfont. Поэтому я не могу просто изменить стиль класса значков, потому что он все время перезаписывается.

Что я могу сделать? Есть ли еще какие-то функции расширения SASS, о которых я не знаю? Или есть совсем другой способ?

Спасибо за любую помощь.

РЕШЕНИЕ:

Используя всю замечательную помощь и советы, я нашел способ избежать этой проблемы: Grunt-Webfont предлагает использовать i-tag для отображения значков. Font-Awesome делает то же самое. Итак, я делаю именно это. И я обычно не использую его ни для чего другого. Это позволяет использовать i-tag под button для моего дополнительного стиля, а не класс .icon. Таким образом, класс .icon используется только один раз в сгенерированном файле и больше никогда.

.icon {
  // Basic styling
}

button {
  i { // <= Previously '.icon'
    // Additional styling
  }
}

person user3734681    schedule 20.10.2014    source источник
comment
Вопрос для меня не ясен, но я думаю, вы хотите использовать родительский селектор: & (амперсанд)   -  person Daredzik    schedule 20.10.2014
comment
Здесь у вас нет выбора. Вот как должен работать @extend. Нет никакого волшебства, расширяющего этот класс, но не в том случае, если он является частью более сложного селектора.   -  person cimmanon    schedule 20.10.2014
comment
Можете ли вы использовать другой класс вместо вложенного селектора? Вместо button .icon используйте .button-icon и добавьте туда свои дополнительные стили. Затем добавьте классы .icon и .button-icon в свой HTML-код значка внутри кнопок.   -  person Steve Sanders    schedule 20.10.2014


Ответы (3)


Вы пробовали делать что-то подобное?

.icon {
  //some styles from external (ie: grunt webfont)
  color: red;
}

%icon {
  @extend .icon;
}

button {
  .ico {
    @extend %icon;
    //add some additional styles
  }
}

.foo:after {
  @extend %icon;
  //add some more
}

Тогда вы бы не генерировали правило foo:after для .icon внутри кнопки.

EDIT2 — вам нужно создать дополнительный класс, который вы можете использовать внутри своих стилей, поэтому определен только один класс .icon (в вашем css, сгенерированном grunt-webfont). Затем просто используйте класс .ico внутри ваших стилей и расширьте заполнитель %icon, как показано выше.

РЕДАКТИРОВАТЬ. Рассматривали ли вы решение этой проблемы в своем генераторе grunt-webfont? Судя по документации, вы можете настроить вывод на scss следующим образом:

options: {
      stylesheet: 'scss',
      mixinPrefix: 'mixin-'

Затем просто используйте миксин, чтобы определить стили желаемых классов?

person am_    schedule 20.10.2014
comment
Опять же, OP не может использовать это, потому что селектор button .icon генерируется динамически. - person cimmanon; 21.10.2014
comment
Я только что попробовал, но это все равно привело к тому же css. Очевидно, %icon не только расширяет .icon в корне, но и .icon под button. - person user3734681; 21.10.2014
comment
О, так ваша кнопка { .icon {...} } также определена в grunt-webfont? - person am_; 21.10.2014
comment
Ой. Нет нет, извините. Я мог бы сделать, как вы предложили. Создается только класс .icon, который нельзя изменить. Так что я мог бы поместить другие вещи в другой файл. Но приведенный выше код не меняет результирующий css. Но я попробую ваше редактирование, как только смогу. Спасибо :) - person user3734681; 21.10.2014
comment
Ах да, вы правы. Если вы добавите больше стилей за заполнителем @extend, вы также получите дополнительный класс foo:after. Если вы не хотите добавлять дополнительный класс значков - кажется, самое простое решение - установить параметры в вашем генераторе grunt-webfont. - person am_; 21.10.2014

Я думаю, это даст нужный вам результат? Правда, слегка сумбурно.

Метод: создать стиль-заполнитель и для начала расширить его до .icon.

%icon-styles{
  basic: styling;
}

.icon {
  @extend %icon-styles;
}

.foo:after {
  @extend %icon-styles;
}

button .icon {
  @extend %icon-styles;
  additional: styling;
}

Он компилируется в:

.icon, .foo:after, button .icon {
  basic: styling;
}

button .icon {
  additional: styling;
}
person mknadler    schedule 20.10.2014
comment
ОП уже сказал, что они не могут этого сделать, потому что файл, содержащий классы, которые они хотят расширить, создается динамически. - person cimmanon; 21.10.2014
comment
Ага, только что понял, что пропустил это. - person mknadler; 21.10.2014

Вы также можете использовать собственный шаблон с grunt-webfont. Это даст вам гораздо больше контроля над сгенерированным CSS.

person Artem Sapegin    schedule 10.11.2014