SCSS расширяет вложенный селектор и переопределяет вложенные наборы правил
Итак, у меня есть местозаполнитель с вложенным селектором:
%block {
.title {
font-size:12px;
}
}
Я хочу расширить его и добавить в класс .title
:
.superblock {
@extend %block;
.title {
font-weight:bold;
}
}
Ответ, который я хочу:
.superblock .title {
font-size: 12px;
font-weight: bold; }
Однако, я получаю ответ:
.superblock .title {
font-size: 12px; }
.superblock .title {
font-weight: bold; }
Я делаю что-то неправильно или это просто, как это работает? Чтобы уточнить, я хочу объединить его. Если я добавлю что-то непосредственно внутри .superblock
и добавлю, как еще один .superblock2
, который также расширяет блок%, они сжимаются без каких-либо проблем.
Ответы
Ответ 1
У Sass нет функций для "слияния" дублирующих селекторов. Вам понадобится найти другую утилиту, чтобы сделать это после того, как CSS был скомпилирован.
Директива @extend
- это не просто способ использования классов вместо mixins (аналогично вызовам mixed LESS). Почему @extend
работает так, как становится ясно, когда вы расширяете обычные классы вместо классов расширения:
.block {
font-size:12px;
}
.foo {
@extend .block;
font-weight: bold;
}
Вывод:
.block, .foo {
font-size: 12px;
}
.foo {
font-weight: bold;
}
Использование класса extend просто подавляет излучение исходного имени класса.
Теперь, когда вы видели, почему @extend
работает так, как вы это делаете, вы все еще хотите, что предлагает @extend
? Если ответ отрицательный, вам нужно использовать mixin:
@mixin block {
// styles
.title {
font-size: 12px;
@content;
}
}
.superblock {
@include block {
font-weight: bold;
}
}
Вывод:
.superblock .title {
font-size: 12px;
font-weight: bold;
}
Ответ 2
Это в значительной степени. SASS производит расширенные объявления отдельно.
И у него нет функциональности группировки объявлений с помощью селектора, это не тот умный.
Но вам не нужно так беспокоиться о чистоте CSS. Современные веб-серверы обслуживают CSS gzipped, все дублирование будет приятно сжато.
Ответ 3
МЕНЬШЕ может это сделать. Однако вы должны написать:
.superblock {
.title {
.block .title;
}
}
Не уверен, что он работает с @extend тоже.
Ответ 4
Вы можете использовать инструменты, я использовал их для очистки css
https://github.com/addyosmani/grunt-uncss
"Задача для удаления неиспользуемого CSS из ваших проектов с помощью UnCSS".