6

我有以下 sass 代码:

.class{
    label{
        color:#fff;
        .disabled &{color:#333; }
    }
}

哪个输出

.disabled .class label

有没有办法在不包含任何祖父母选择器的情况下输出父选择器?像这样:

.disabled label
4

3 回答 3

6

在使用父引用时,我不知道在 SASS 中从祖先选择器中进行选择。但是,使用您的代码,稍作重组可以得到相同的结果:

label {
    .class & {
        color: #fff;
    }

    .disabled & {
        color:#333;
    }
}

编译为:

.class label {
  color: #fff; }
.disabled label {
  color: #333; }
于 2012-07-27T14:14:14.293 回答
3

即使 hopper 没有完全错误,您实际上可以选择带有变量的祖父母。

您可以通过以下方式实现您想要的:

.class{
    label{
        color:#fff;

        $selector: nth(&,1);
        $direct-parent: nth($selector, length($selector));

        @at-root #{$direct-parent} {
          .disabled &{color:#333; }
        };
    }
}

这将生成这个css:

.class label {
  color: #fff;
}
.disabled label {
  color: #333;
}
于 2018-06-26T17:18:32.407 回答
-1

父选择器始终是对上一级嵌套中整个已解析选择器的引用。没有“父”或“祖父”的概念,尤其是在连接选择器或在最后使用父选择器时会弄得一团糟。

免责声明:除非您真的需要,否则我不建议您这样做

从 Sass 3.4 开始,您可以通过&用作变量来提取选择器的一部分。以这种方式使用时,您将获得一个字符串列表(可以循环等)。

提取选择器的一部分或切片

这里的函数使用与字符串切片函数相同的参数样式:

@function selector-slice($sel, $start: 1, $end: -1) {
    $collector: ();
    @each $s in $sel {
        // calculate our true start and end indices when given negative numbers
        $_s: if($start > 0, $start, length($s) + $start + 1);
        $_e: if($end > 0, $end, length($s) + $end + 1);
        $c: ();
        @for $i from $_s through $_e {
            $c: append($c, nth($s, $i));
        }
        // prevent duplicates from creeping in
        @if not index($collector, $c) {
            $collector: append($collector, $c);
        }
    }
    @return $collector;
}

/* complex example */
.one-a, .one-b {
    two {
        three {
            color: red;

            &:before {
                @at-root #{selector-slice(&, 2, 3)} {
                    color: green;
                }
            }
        }
    }
}

/* your example */
.class {
    label {
        color:#fff;
        @at-root #{selector-slice(&, -1, -1)} {
            .disabled & {
                color:#333;
            }
        }
    }
}

输出:

/* complex example */
.one-a two three, .one-b two three {
  color: red;
}
two three:before {
  color: green;
}

/* your example */
.class label {
  color: #fff;
}
.disabled label {
  color: #333;
}

作为额外的好处,您可以使用此函数通过在较小的索引之前传递较大的索引来反转选择器的顺序。

.one-a, .one-b {
    two {
        three {
            color: red;

            &:before {
                @at-root #{selector-slice(&, 3, 2)} {
                    color: green;
                }
            }
        }
    }
}

输出:

.one-a two three, .one-b two three {
  color: red;
}
three:before two {
  color: green;
}

相关:修改 Sass 中选择器的中间部分(添加/删除类等)

用另一个类替换一个类

selector-replace或者,如果您想要用另一个类替换一个类,您可以只使用标准库中的函数。

.class {
    label {
        color:#fff;
        @at-root #{selector-replace(&, '.class', '.disabled')} {
            color:#333;
        }
    }
}

输出:

.class label {
  color: #fff;
}
.disabled label {
  color: #333;
}
于 2016-02-14T18:06:29.673 回答