У меня была такая же проблема, поэтому я сделал миксин для этого.
@mixin tag($tag) {
$ampersand: & + '';
$selectors: simple-selectors(str-replace($ampersand, ' ', ''));
$main-selector: nth($selectors, -1);
$previous-selectors: str-replace($ampersand, $main-selector, '');
@at-root {
#{$previous-selectors}#{$tag}#{$main-selector} {
@content;
}
}
}
Чтобы это работало, вам понадобится также функция замены строки ( изХьюго Жираудель ):
@function str-replace($string, $search, $replace: '') {
$index: str-index($string, $search);
@if $index {
@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
}
@return $string;
}
Как это работает:
SCSS
.foo {
color: blue;
@include tag(p) {
color: red;
}
}
Вывод
.foo {
color: blue;
}
p.foo {
color: red;
}
Вариант использования
Этот метод работает с вложенными селекторами, но не с составными.