【问题标题】:wrap rules with selector conditionally有条件地用选择器包装规则
【发布时间】:2015-04-05 05:47:11
【问题描述】:

我正在尝试做的是一个带有可选参数的 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:

@mixin conditional-wrap($condition, $selector){
  @if $condition{
    #{$selector}{
        @content
    }
  }
  @else{
    @content
  }
}

所以我们现在可以这样做了:

@mixin smth($selector:true){
  @include conditional-wrap($selector, '.class'){
      color: blue;
  }
}

【问题讨论】:

  • 投票关闭是印刷错误(提示:左花括号不能多于右花括号)。
  • 您的意思是在同一个@if 指令内吗?因为否则就没有。
  • 那你的嵌套搞砸了,你需要找一个能显示匹配大括号的编辑器。

标签: sass


【解决方案1】:

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;
    }
}

【讨论】:

  • 感谢您的解释。你的第二个解决方案是我最初最终做的,但后来我意识到我最好使用 2 mixin smthsmthSelector 而不是只使用一个带参数的。第一个解决方案看起来很有希望,我会寻找有关 @at-rootselector-nest 的信息
  • 你的第一个解决方案对我不起作用,这样做的全部目的是避免在最终的 css 上重复相同的选择器。因为@at-root$selector 为假时,我们将有两次相同的选择器。
  • @Ghetolay “不起作用”是对问题的无用描述。 Sassmeister 说它工作正常:sassmeister.com/gist/25ebc0956f781ff6746d
  • 我不只是说“它不起作用”,我已经解释了(或至少尝试过)为什么它对我不起作用。这是你的 sassmeister 的一个分支,展示了我试图解释的案例:sassmeister.com/gist/d3d2a4a7cd5940cb5109
猜你喜欢
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 2016-08-08
  • 1970-01-01
  • 2013-09-18
  • 2013-11-01
相关资源
最近更新 更多