在Sass中,您如何引用父选择器并排除任何祖父母?

时间:2012-07-27 03:37:02

标签: sass

我有以下sass代码:

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

输出

.disabled .class label

有没有办法输出父选择器而不包含任何祖父母选择器?像这样:

.disabled label

3 个答案:

答案 0 :(得分:5)

在使用父引用时,我无法在SASS中选择祖先选择器。但是,使用您的代码,稍微重组可以获得相同的结果:

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

    .disabled & {
        color:#333;
    }
}

编译为:

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

答案 1 :(得分:1)

即使漏斗没有严重错误,您实际上也可以选择带有变量的祖父母。

您可以通过此实现您想要的:

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

答案 2 :(得分:-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;
}

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

用另一个类替换

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

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

输出:

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