Sass 有条件地使用选择器包装规则

Sass 有条件地使用选择器包装规则,sass,Sass,我试图做的是一个mixin,它有一个可选的参数来包含或不包含规则周围的选择器。以下是预期的行为: @include smth(true) => .class{ color:blue } @include smth(false) => color: blue 我试过这样的方法: @mixin smth($selector:true){ @if $selector { .class{ } color: blue; @if $selector{

我试图做的是一个mixin,它有一个可选的参数来包含或不包含规则周围的选择器。以下是预期的行为:

@include smth(true)  => .class{ color:blue }
@include smth(false) => color: blue
我试过这样的方法:

@mixin smth($selector:true){
   @if $selector {
      .class{
   }

   color: blue;

   @if $selector{
       }
   }
}
显然,@if指令中的括号是问题所在。因此,我尝试将@if的内容放在双引号
”.class{
下,并使用插值
{.class{}
(带和不带转义字符
\
}),这样它就不会干扰,但不会起任何作用。
简而言之,我不希望sass处理@if的内容,只是“照原样说”

更新

从cimmanon的回答中,我设法创建了一个更通用的混音器:

@mixin conditional-wrap($condition, $selector){
  @if $condition{
    #{$selector}{
        @content
    }
  }
  @else{
    @content
  }
}
因此,我们现在可以做:

@mixin smth($selector:true){
  @include conditional-wrap($selector, '.class'){
      color: blue;
  }
}
Sass是一种脚本语言。大括号是SCSS语法的一部分(就像其他任何使用大括号的语言一样:JavaScript、PHP、C/C++等),Sass不仅仅是“按原样放”。Sass(缩进)语法根本不使用花括号。每种语法的解析器都不同,但选择器的内部表示形式及其属性是相同的,生成CSS文件时这些结构的输出方式也是一样的:花括号根据输出样式适当插入。简言之,您要写的是什么这是不可能的

Sass不关心您如何使用SCSS语法缩进代码,它只关心匹配大括号。因此,您的mixin被解释为:

@mixin smth($selector: true) {
   @if $selector {
       .class {

       }

       color: blue;

       @if $selector {

       }
   }
}
你能做的是改变你的逻辑

@mixin smth($selector: true) {
    @at-root #{if($selector, selector-nest(&, '.class'), &)} {
        color: blue;
    }
}
对于Sass版本3.3或更高版本:

@mixin foo {
    color: blue;
}

@mixin smth($selector: true) {
    @if $selector {
        .class {
            @include foo;
        }
    } @else {
        @include foo;
    }
}

投票结束时出现印刷错误(提示:开始大括号不能多于结束大括号).你是说在同一个@if指令内吗?因为否则就没有了。那么你的嵌套就搞乱了,你需要找到一个编辑器来显示匹配的花括号.Thks作为解释。你的第二个解决方案是我一开始做的,但后来我意识到我最好使用2个mixin
smth
smthSelector
rather而不是只使用一个参数。第一个解决方案看起来很有希望,我将在根目录下查找有关
@和
选择器嵌套的信息。您的第一个解决方案对我不起作用,这样做的全部目的是避免在最终css上重复相同的选择器。因为
$selector
时根目录下的
是假的,我们将使用同一个选择器两次。@Ghetolay“不起作用”是对问题的无用描述。Sassmeister说它很好用:我不仅仅说“它不起作用”,我已经解释了(或至少尝试过)为什么它对我不起作用。下面是你的Sassmeister的一个分支,它演示了我试图解释的案例: