SASS和Bootstrap - mixins vs. @extend

Ell*_*ael 23 css sass twitter-bootstrap

我正在使用BootstrapSASS端口,我想知道使用预定义的mixins和使用SASS之间是否有任何区别@extend.

例如,如果我有:

<div class="wrapper">
    Some content here....
</div>
Run Code Online (Sandbox Code Playgroud)

这样做有什么区别吗?

.wrapper {
    @include make-row();
}
Run Code Online (Sandbox Code Playgroud)

.wrapper {
    @extend .row;
}
Run Code Online (Sandbox Code Playgroud)

如果没有区别,是否有其他mixin不等同于单个@extend语句?如果没有这样的mixins,为什么mixin甚至存在?

Ton*_*igh 91

@extend和mixin 之间的最大区别在于编译css的方式.在简单的例子中看起来并不多,但差异和影响是显着的,如果不小心使用,可能会在野外真正令人头疼.@extend有点像傻瓜,起初看起来很棒,但......

我们来看一个简单的例子:

@延伸

.row {
    width: 50px;
}
.new-row {
    @extend .row;
}
.another-row {
    @extend .row;
}
Run Code Online (Sandbox Code Playgroud)

编译成:

.row,
.new-row,
.another-row {
     width: 50px;
}
Run Code Online (Sandbox Code Playgroud)

混入

@mixin row() {
    width: 50px;
}
.new-row {
    @include row();
}
.another-row {
    @include row();
}
Run Code Online (Sandbox Code Playgroud)

编译成:

.new-row {
   width: 50px;
}
.another-row {
   width: 50px;
}
Run Code Online (Sandbox Code Playgroud)

mixin包含它所到之处的属性 - 每次复制它们 - 而@extend对选择器进行分组并定义属性一次.这不是很明显,因为差异在于编译的css,但它有一些重要的含义:

加载订单

随着@extend选择器将被分组在他们遇到的sass的第一点,这可能导致一些奇怪的超越.如果您定义了一个选择器并且用于@extend引入属性并尝试覆盖先前在sass中定义的属性,但是在扩展属性在css中分组的点之后,覆盖将不起作用.这可能非常令人困惑.

考虑这个逻辑上有序的css定义集和可能的HTML <div class='row highlight-row'></div>::

.red-text {
    color: red;
}
.row {
    color: green;
}
.highlight-row {
    @extend .red-text;
}
Run Code Online (Sandbox Code Playgroud)

编译成:

.red-text,
.highlight-row {
    color: red;
}
.row {
    color: green;
}
Run Code Online (Sandbox Code Playgroud)

因此,即使sas​​s排序使得行颜色看起来像红色,编译的css也会使其变为绿色

分组不佳

@extend可能会导致生成的CSS中选择器分组不良.例如,你最终可能会共享三十或四十个不相关的东西.使用@extendfor fonts就是一个很好的例子.

嵌套

如果您正在使用深度嵌套的sass(这不是很好,顺便说一下)并且您使用的@extend话,您将为每个@extend使用的复制完全嵌套的选择器,从而导致膨胀的CSS.我见过这么多:

.selector-1 .selector-2 .selector-3 .selector-4,
.selector-1 .selector-2 .selector-3 .selector-4 a,
.selector-1 .selector-2 .selector-3 .selector-4 li,
.selector-1 .selector-2 .selector-3 .selector-4 td {
    font-family: ariel;
}
Run Code Online (Sandbox Code Playgroud)

如果你是SASS的新手,那么查看已编译的css是值得的.

媒体查询

@extend 不在媒体查询中工作,因为媒体查询不是选择器.

结论

我的经验法则是,@extend如果你没有参数,你可以使用over over mixin ,如果你可以合理地定义@extend并在sass附近存在的几个紧密相关的选择器中共享它,例如,在定义的同一个文件中一个sass模块.按钮是很好用的@extend的一个很好的例子:

%button {
    padding: 10px;
}
.call-to-action {
    @extend %button;
    background-color: $green;
}
.submit {
    @extend %button;
    background-color: $grey;
}
Run Code Online (Sandbox Code Playgroud)

有助于做出选择的最佳文章就在这里

PS,%标志是占位符扩展的使用

  • 也许,他们必须阅读很多,并犯了很多错误,我做到了这么远! (7认同)
  • 扩展和混合之间存在许多细微差别,因此答案很长,加上示例使它看起来更大! (6认同)
  • 我也认为可以通过紧密耦合的部分对问题进行详细解答,因此长期答案并不总是意味着一个广泛的问题 (3认同)
  • 从这篇文章链接到的文章中,我认为一个非常有用的概念是 mixins 实际上并没有打破 DRY 规则;正确理解,这意味着不要在您的来源中重复自己,即保持单一的事实来源。只要来自单一来源,编译版本中的重复就不错。 (2认同)