Sass 无法@extend 使用父选择器创建的选择器

Sass fails to @extend selectors created with the parent selector

我需要创建 CSS 以某种方式使用 SCSS 和占位符完成的输出

这是我想要的输出

.myclass {
  color: silver;
}
.myclass-gold {
  color: gold;
}

当我用这样的 SCSS placeholder 尝试时

%placeholder {
  color: silver;
  #{&}-gold {
    color: gold;
  }
}

.myclass {
  @extend %placeholder !optional;
}

我只得到这个结果

.myclass {
  color: silver;
}

黄金部分全部掉落


我需要一个占位符,因为我使用了很多选择器,例如 a.myclassinput.myclass 等,并且不希望从这些

中展开 @export

如果我不使用占位符而是使用随机选择器——并使用一些 extry 字节——输出也不正确,

ae739ab7 {
  color: silver;
  #{&}-gold {
    color: gold;
  }
}

.myclass {
  @extend ae739ab7 !optional;
}

产量

ae739ab7, .myclass {
  color: silver;
}
ae739ab7 ae739ab7-gold, .myclass ae739ab7-gold {
  color: gold;
}

ae739ab7 {
  color: silver;
  &-gold {
    color: gold;
  }
}

.myclass {
  @extend ae739ab7 !optional;
}

给我

ae739ab7, .myclass {
  color: silver;
}
ae739ab7-gold {
  color: gold;
}

这里缺少的始终是选择器 .myclass-gold

这是否可以通过一些魔术来实现?

扩展仅适用于完全匹配。当你这样写时:

%placeholder {
  color: silver;
  #{&}-gold {
    color: gold;
  }
}

你真正创造的是这样的:

%placeholder {
  color: silver;
}

%placeholder %placeholder-gold {
  color: gold;
}

所以当你这样写的时候:

.myclass {
  @extend %placeholder !optional;
}

它只会扩展 %placeholder 选择器而不是 %placeholder-gold 选择器。要获得您正在寻找的行为,您必须单独扩展每个占位符选择器:

%placeholder {
  color: silver;
  @at-root #{&}-gold {
    color: gold;
  }
}

@mixin placeholder {
    & {
        @extend %placeholder;
        @at-root #{&}-gold {
            @extend %placeholder-gold;
        }
    }
}

.myclass {
  @include placeholder;
}

输出:

.myclass {
  color: silver;
}
.myclass-gold {
  color: gold;
}