跳到主要内容

@extend

Stylus 的 @extend 指令受到 SASS Implementation 的启发,本质上与其相同,只有一些微小的差异。这个特性显著简化了从其他语义规则集继承的语义规则集的维护。

使用 mixin 进行“扩展”

虽然您可以使用 mixin 来实现类似的效果,但这可能会导致重复的 CSS。一个典型的模式是定义几个类,如下所示,然后将它们组合在元素上,例如“警告消息”。

虽然这种技术完全可以工作,但很难维护。

.message,
.warning {
padding: 10px;
border: 1px solid #eee;
}

.warning {
color: #e2e21e;
}

使用 @extend

要使用 @extend 生成相同的输出,只需将所需的选择器传递给它(请注意,@extend@extends 是相等的,只是一个别名)。然后,Stylus 将 .warning 选择器附加到现有的 .message 规则集中。.warning 类然后从 .message 继承属性。

.message {
padding: 10px;
border: 1px solid #eee;
}

.warning {
@extend .message;
color: #E2E21E;
}

以下是一个更复杂的示例,演示了 @extend 如何级联:

red = #E33E1E
yellow = #E2E21E

.message
padding: 10px
font: 14px Helvetica
border: 1px solid #eee

.warning
@extends .message
border-color: yellow
background: yellow + 70%

.error
@extends .message
border-color: red
background: red + 70%

.fatal
@extends .error
font-weight: bold
color: red

生成以下 CSS:

.message,
.warning,
.error,
.fatal {
padding: 10px;
font: 14px Helvetica;
border: 1px solid #eee;
}
.warning {
border-color: #e2e21e;
background: #f6f6bc;
}
.error,
.fatal {
border-color: #e33e1e;
background: #f7c5bc;
}
.fatal {
font-weight: bold;
color: #e33e1e;
}

Stylus 目前与 SASS 的不同之处在于,SASS 不允许嵌套选择器使用 @extend

form
button
padding: 10px

a.button
@extend form button
Syntax error: Can't extend form button: can't extend nested selectors
on line 6 of standard input
Use --trace for backtrace.

使用 Stylus,只要选择器匹配,它就可以工作!

form
input[type=text]
padding: 5px
border: 1px solid #eee
color: #ddd

textarea
@extends form input[type=text]
padding: 10px

输出结果:

form input[type="text"],
textarea {
padding: 5px;
border: 1px solid #eee;
color: #ddd;
}
textarea {
padding: 10px;
}

扩展多个选择器

Stylus 允许您一次扩展多个选择器,只需使用逗号将它们写在一起:

.a
color: red

.b
width: 100px

.c
@extend .a, .b
height: 200px

输出结果:

.a,
.c {
color: #f00;
}
.b,
.c {
width: 100px;
}
.c {
height: 200px;
}

扩展占位符选择器

Stylus 有一个类似于 Sass 的功能——占位符选择器。

这些选择器应该以 $ 符号开头(例如 $foo),并且不会在生成的 CSS 中出现。但是您仍然可以扩展它们:

$foo
color: #FFF

$foo2
color: red

.bar
background: #000
@extends $foo

.baz
@extends $foo

输出结果:

.bar,
.baz {
color: #fff;
}
.bar {
background: #000;
}

请注意,如果选择器没有被扩展,它将不会出现在生成的 CSS 中,因此这是创建可扩展代码库的强大方式。虽然您可以通过 mixin 插入代码,但它们每次使用时都会插入相同的代码,而扩展占位符会给您紧凑的输出。

可选扩展

有时,能够扩展可能存在或不存在取决于上下文可能会很有用。您可以在任何选择器后面加上 !optional 后缀来实现这一点:

$specialDesign
color: #FFF

.btn
@extend .design !optional, $specialDesign !optional

输出结果:

.btn {
color: #fff;
}