SCSS扩展嵌套选择器并覆盖嵌套规则集

时间:2013-04-18 14:57:22

标签: css sass

好的,我有一个带有嵌套选择器的占位符:

%block {
  .title {
    font-size:12px;
  }
}

我想扩展它并添加到.title类:

.superblock {
  @extend %block;
  .title {
    font-weight:bold;
  }
}

我想要的答案是:

.superblock .title {
  font-size: 12px;
  font-weight: bold; }

然而,我得到的答案是:

.superblock .title {
  font-size: 12px; }

.superblock .title {
  font-weight: bold; }

我做错了什么或者这是怎么回事?澄清我想合并它。如果我直接在.superblock中添加内容并添加另一个.superblock2,这也会扩展%block,它们合并时没有任何问题。

4 个答案:

答案 0 :(得分:30)

Sass没有“合并”重复选择器的功能。在编译CSS之后,您需要找到另一个实用程序来执行此操作。

@extend指令不仅仅是一种使用类代替mixins的方法(类似于LESS风格的mixin调用)。当您扩展普通类而不是扩展类时,为什么@extend的工作方式变得清晰:

.block {
  font-size:12px;
}

.foo {
    @extend .block;
    font-weight: bold;
}

输出:

.block, .foo {
  font-size: 12px;
}

.foo {
  font-weight: bold;
}

使用extend类只会抑制原始类名的发射。

现在你已经看到为什么@extend按照它的方式工作,你还想要@extend提供什么吗?如果答案是否定的,那么你需要使用mixin:

@mixin block {
    // styles
    .title {
        font-size: 12px;
        @content;
    }
}

.superblock {
    @include block {
        font-weight: bold;
    }
}

输出:

.superblock .title {
  font-size: 12px;
  font-weight: bold;
}

答案 1 :(得分:2)

这就是它。 SASS单独生成扩展声明。

它没有选择器对声明进行分组的功能,它并不那么聪明。

但你不必担心CSS清洁度。现代Web服务器提供CSS gzip压缩,所有复制都将很好地压缩。

答案 2 :(得分:0)

LESS可以做到这一点。但是你会写:

.superblock {
  .title {
    .block .title;
  }
}

不确定它是否也适用于@extend。

答案 3 :(得分:-2)

您可以使用工具,我用它来清理CSS https://github.com/addyosmani/grunt-uncss

“使用UnCSS从项目中删除未使用的CSS的艰巨任务。”