Вы можете получить доступ к родительскому селектору, используя амперсанд в функциях и миксинах, не передавая его в качестве параметра.
Я бы, наверное, сделал что-то подобное (демо) :
@mixin pre($modifier) {
$ampersand: & + '';
$parents-list: simple-selectors(str-replace($ampersand, ' ', ''));
$suffix: nth($parents-list, -1) + '';
$suffix-type: str-slice($suffix, 1, 1);
$suffix-name: str-slice($suffix, 2, -1);
$ascendant-selectors: str-replace($ampersand, $suffix, '');
$current-selector: '#{$suffix-type}#{$modifier}-#{$suffix-name}';
@at-root {
#{$ascendant-selectors}#{$current-selector} {
@content;
}
}
}
Чтобы это работало, вам понадобится также функция замены строки ( от Hugo Giraudel ):
@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
.bg {
color: red;
@include pre(blue) {
color: blue;
}
}
выход
.bg {
color: red;
}
.blue-bg {
color: blue;
}
Варианты использования:
- .foo
- span.foo
- span .foo
- .foo .bar
- .foo.bar
Вы также можете использовать ID s.