【问题标题】:SASS and Data Attribute Selecting and NestingSASS 和数据属性选择和嵌套
【发布时间】:2015-11-01 17:28:15
【问题描述】:

我想将一些样式应用于具有数据属性product 的元素,但也应用于特定产品。

有没有办法做这样的事情?

// SASS
[data-product] {
  color: #000;
  &[="red"] {   // <- this line
    color: #f00;
  }
}

【问题讨论】:

    标签: sass


    【解决方案1】:

    在 Sass 3.4 之前,这根本不可能。这里的破坏性功能是将当前选择器存储到变量中的能力以及拆分字符串的能力(尽管后者可以通过 SassScript 函数创建)。

    @mixin append-attr($x) {
        $sel: &;
        $collector: ();
    
        @for $i from 1 through length($sel) {
            $s: nth($sel, $i);
            $last: nth($s, -1);
            @if str-slice($last, -1) == "]" {
                // if is just the bare attribute with no value, $offset will be -1, otherwise it will be -2
                $offset: -1;
                $current-x: $x;
    
                @if str-slice($last, -2) == '"]' {
                    // this attribute already has a value, so we need to adjust the offset
                    $offset: -2;
                } @else {
                    // no attribute value, so add the equals and quotes
                    $current-x: '="' + $x + '"';
                }
                $last: str-slice($last, 1, $offset - 1) + $current-x + str-slice($last, $offset);
                $collector: append($collector, set-nth($s, -1, $last), comma);
            } @else {
                // following line will append $x to your non-attribute selector
                $collector: append($collector, selector-append($s, $x), comma);
                // the following line will not change your non-attribute selector at all
                //$collector: append($collector, $s, comma);
            }
        }
    
        @at-root #{$collector} {
            @content;
        }
    }
    

    用法:

    [data-product] {
        color: white;
    
        @include append-attr("red") {
            color: red;
    
            @include append-attr('-green') {
                color: green;
            }
        }
    }
    
    [one], [two] {
        color: orange;
    
        @include append-attr('alpha') {
            color: yellow;
        }
    }
    
    [test], .test {
        @include append-attr('-one') {
            color: red;
        }
    }
    
    .bar input[min] {
        @include append-attr('5') {
            background: yellow;
        }
    }
    

    输出:

    [data-product] {
      color: white;
    }
    [data-product="red"] {
      color: red;
    }
    [data-product="red-green"] {
      color: green;
    }
    
    [one], [two] {
      color: orange;
    }
    [one="alpha"], [two="alpha"] {
      color: yellow;
    }
    
    [test="-one"], .test-one {
      color: red;
    }
    
    .bar input[min="5"] {
      background: yellow;
    }
    

    相关:Modifying the middle of a selector in Sass (adding/removing classes, etc.)

    【讨论】:

      【解决方案2】:

      input[data-product] {
      	color: #000;
      }
      input[data-product=red] {
      	color: #f00;
      }

      你不需要嵌套,第二个样式会覆盖第一个。

      【讨论】:

      • 这甚至是问题的答案吗?问题的重点是能够编写更短的选择器。
      猜你喜欢
      • 2017-01-26
      • 2018-01-16
      • 1970-01-01
      • 2012-08-29
      • 2021-03-13
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      相关资源
      最近更新 更多