跳到內容

@extend

Stylus @extend 指令的靈感來自於 (且基本上與) SASS 實作 相同,只有少數細微的差異。此功能大幅簡化繼承自其他語意規則集的語意規則集的維護。

使用混合「擴充」

雖然你可以使用混合來達成類似的效果,但這可能會導致重複的 CSS。典型的模式是定義幾個類別,如下所示,然後將它們組合在元素上,例如「警告訊息」。

雖然此技術運作良好,但它難以維護。

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

.warning {
  color: #E2E21E;
}
.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;
}
.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
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;
}
.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.
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]
    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;
}
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
  color: red

.b
  width: 100px

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

產生

.a,
.c {
  color: #f00;
}
.b,
.c {
  width: 100px;
}
.c {
  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
$foo
  color: #FFF

$foo2
  color: red

.bar
  background: #000
  @extends $foo

.baz
  @extends $foo

產生

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

請注意,如果選取器未延伸,它將不會出現在結果的 CSS 中,因此這是建立可延伸程式碼庫的有力方式。雖然您可以透過混入插入程式碼,但每次使用它們時,它們都會插入相同的程式碼,而延伸佔位符會提供精簡的輸出。

選擇性延伸

有時,根據上下文,能夠擴充可能存在或不存在的東西會很有用。你可以使用 !optional 為任何選擇器加上後綴來達成此目的

$specialDesign
  color: #FFF

.btn
  @extend .design !optional, $specialDesign !optional
$specialDesign
  color: #FFF

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

產生

.btn {
  color: #fff;
}
.btn {
  color: #fff;
}