@mixin und @include
Mixins ermöglichen es Ihnen, Stile zu definieren, die in Ihrer gesamten Stylesheet wiederverwendet werden können. Sie erleichtern die Vermeidung der Verwendung nicht-semantischer Klassen wie .float-left und die Verteilung von Stilkollektionen in Bibliotheken.
Mixins werden mit der @mixin-Regel definiert, die entweder als @mixin <name> { ... } oder als @mixin name(<argumente...>) { ... } geschrieben wird. Der Name eines Mixins kann ein beliebiger Sass-Bezeichner sein, der nicht mit -- beginnt, und er kann jede Anweisung außer Top-Level-Anweisungen enthalten. Sie können verwendet werden, um Stile zu kapseln, die in eine einzige Stilregel eingefügt werden können; sie können eigene Stilregeln enthalten, die in andere Regeln verschachtelt oder auf der obersten Ebene des Stylesheets eingeschlossen werden können; oder sie können einfach dazu dienen, Variablen zu modifizieren .
Mixins werden mit der @include-Regel in den aktuellen Kontext eingefügt, die entweder als @include <name> oder als @include <name>(<argumente...>) geschrieben wird, wobei der Name des einzufügenden Mixins angegeben ist .
SCSS-Syntax
@mixin reset-list {
margin: 0;
padding: 0;
list-style: none;
}
@mixin horizontal-list {
@include reset-list;
li {
display: inline-block;
margin: {
left: -2px;
right: 2em;
}
}
}
nav ul {
@include horizontal-list;
}
Sass-Syntax
@mixin reset-list
margin: 0
padding: 0
list-style: none
@mixin horizontal-list
@include reset-list
li
display: inline-block
margin:
left: -2px
right: 2em
nav ul
@include horizontal-list
CSS-Ausgabe
nav ul {
margin: 0;
padding: 0;
list-style: none;
}
nav ul li {
display: inline-block;
margin-left: -2px;
margin-right: 2em;
}
💡 Lustige Tatsache
Mixin-Namen behandeln, wie alle Sass-Bezeichner, Bindestriche und Unterstriche als identisch. Das bedeutet, dass reset-list und reset_list beide auf dasselbe Mixin verweisen. Dies ist ein historischer Überbleibsel aus den Anfängen von Sass, als es nur Unterstriche in Bezeichnernamen erlaubte. Als Sass die Unterstützung für Bindestriche zur Anpassung an die CSS-Syntax hinzufügte, wurden die beiden gleichgesetzt, um die Migration zu erleichtern.
ArgumenteArgumente Permalink
Mixins können auch Argumente entgegennehmen, was es ermöglicht, ihr Verhalten bei jedem Aufruf anzupassen. Die Argumente werden in der @mixin-Regel nach dem Namen des Mixins als Liste von Variablennamen in Klammern angegeben. Das Mixin muss dann mit der gleichen Anzahl von Argumenten in Form von SassScript-Ausdrücken eingeschlossen werden. Die Werte dieser Ausdrücke sind innerhalb des Körpers des Mixins als entsprechende Variablen verfügbar.
SCSS-Syntax
@mixin rtl($property, $ltr-value, $rtl-value) {
#{$property}: $ltr-value;
[dir=rtl] & {
#{$property}: $rtl-value;
}
}
.sidebar {
@include rtl(float, left, right);
}
Sass-Syntax
@mixin rtl($property, $ltr-value, $rtl-value)
#{$property}: $ltr-value
[dir=rtl] &
#{$property}: $rtl-value
.sidebar
@include rtl(float, left, right)
CSS-Ausgabe
.sidebar {
float: left;
}
[dir=rtl] .sidebar {
float: right;
}
💡 Lustige Tatsache
Argumentlisten können auch abschließende Kommas haben! Dies erleichtert die Vermeidung von Syntaxfehlern bei der Refaktorierung Ihrer Stylesheets.
Optionale ArgumenteOptionale Argumente Permalink
Normalerweise muss jedes Argument, das ein Mixin deklariert, beim Einschließen des Mixins übergeben werden. Sie können ein Argument jedoch optional machen, indem Sie einen Standardwert definieren, der verwendet wird, wenn das Argument nicht übergeben wird. Standardwerte verwenden dieselbe Syntax wie Variablendeklarationen: der Variablenname, gefolgt von einem Doppelpunkt und einem SassScript-Ausdruck. Dies erleichtert die Definition flexibler Mixin-APIs, die auf einfache oder komplexe Weise verwendet werden können.
SCSS-Syntax
@mixin replace-text($image, $x: 50%, $y: 50%) {
text-indent: -99999em;
overflow: hidden;
text-align: left;
background: {
image: $image;
repeat: no-repeat;
position: $x $y;
}
}
.mail-icon {
@include replace-text(url("/images/mail.svg"), 0);
}
Sass-Syntax
@mixin replace-text($image, $x: 50%, $y: 50%)
text-indent: -99999em
overflow: hidden
text-align: left
background:
image: $image
repeat: no-repeat
position: $x $y
.mail-icon
@include replace-text(url("/images/mail.svg"), 0)
CSS-Ausgabe
.mail-icon {
text-indent: -99999em;
overflow: hidden;
text-align: left;
background-image: url("/images/mail.svg");
background-repeat: no-repeat;
background-position: 0 50%;
}
💡 Lustige Tatsache
Standardwerte können beliebige SassScript-Ausdrücke sein und sogar frühere Argumente referenzieren!
SchlüsselwortargumenteSchlüsselwortargumente Permalink
Beim Einschließen eines Mixins können Argumente zusätzlich zur Übergabe anhand ihrer Position in der Argumentliste auch namentlich übergeben werden. Dies ist besonders nützlich für Mixins mit mehreren optionalen Argumenten oder mit booleschen Argumenten, deren Bedeutung ohne einen zugehörigen Namen nicht offensichtlich ist. Schlüsselwortargumente verwenden dieselbe Syntax wie Variablendeklarationen und optionale Argumente.
SCSS-Syntax
@mixin square($size, $radius: 0) {
width: $size;
height: $size;
@if $radius != 0 {
border-radius: $radius;
}
}
.avatar {
@include square(100px, $radius: 4px);
}
Sass-Syntax
@mixin square($size, $radius: 0)
width: $size
height: $size
@if $radius != 0
border-radius: $radius
.avatar
@include square(100px, $radius: 4px)
CSS-Ausgabe
.avatar {
width: 100px;
height: 100px;
border-radius: 4px;
}
⚠️ Vorsicht!
Da jedes Argument namentlich übergeben werden kann, seien Sie vorsichtig, wenn Sie die Argumente eines Mixins umbenennen... es könnte die Benutzer brechen! Es kann hilfreich sein, den alten Namen eine Weile als optionales Argument beizubehalten und eine Warnung auszugeben, wenn jemand ihn übergibt, damit er weiß, dass er auf das neue Argument migrieren muss.
Beliebige Argumente entgegennehmenBeliebige Argumente entgegennehmen Permalink
Manchmal ist es nützlich, wenn ein Mixin eine beliebige Anzahl von Argumenten entgegennehmen kann. Wenn das letzte Argument in einer @mixin-Deklaration mit ... endet, werden alle zusätzlichen Argumente an dieses Argument als Liste übergeben. Dieses Argument wird als Argumentliste bezeichnet .
SCSS-Syntax
@mixin order($height, $selectors...) {
@for $i from 0 to length($selectors) {
#{nth($selectors, $i + 1)} {
position: absolute;
height: $height;
margin-top: $i * $height;
}
}
}
@include order(150px, "input.name", "input.address", "input.zip");
Sass-Syntax
@mixin order($height, $selectors...)
@for $i from 0 to length($selectors)
#{nth($selectors, $i + 1)}
position: absolute
height: $height
margin-top: $i * $height
@include order(150px, "input.name", "input.address", "input.zip")
CSS-Ausgabe
input.name {
position: absolute;
height: 150px;
margin-top: 0px;
}
input.address {
position: absolute;
height: 150px;
margin-top: 150px;
}
input.zip {
position: absolute;
height: 150px;
margin-top: 300px;
}
Beliebige Schlüsselwortargumente entgegennehmenBeliebige Schlüsselwortargumente entgegennehmen Permalink
Argumentlisten können auch verwendet werden, um beliebige Schlüsselwortargumente entgegenzunehmen. Die meta.keywords()-Funktion nimmt eine Argumentliste entgegen und gibt alle zusätzlichen Schlüsselwörter, die an das Mixin übergeben wurden, als Map von Argumentnamen (ohne $) zu den Werten dieser Argumente zurück.
SCSS-Syntax
@use "sass:meta";
@mixin syntax-colors($args...) {
@debug meta.keywords($args);
// (string: #080, comment: #800, variable: #60b)
@each $name, $color in meta.keywords($args) {
pre span.stx-#{$name} {
color: $color;
}
}
}
@include syntax-colors(
$string: #080,
$comment: #800,
$variable: #60b,
)
Sass-Syntax
@use "sass:meta"
@mixin syntax-colors($args...)
@debug meta.keywords($args)
// (string: #080, comment: #800, variable: #60b)
@each $name, $color in meta.keywords($args)
pre span.stx-#{$name}
color: $color
@include syntax-colors($string: #080, $comment: #800, $variable: #60b)
CSS-Ausgabe
pre span.stx-string {
color: #080;
}
pre span.stx-comment {
color: #800;
}
pre span.stx-variable {
color: #60b;
}
💡 Lustige Tatsache
Wenn Sie der meta.keywords()-Funktion nie eine Argumentliste übergeben, lässt diese Argumentliste keine zusätzlichen Schlüsselwortargumente zu. Dies hilft Aufrufern Ihres Mixins sicherzustellen, dass sie keine Argumentnamen versehentlich falsch geschrieben haben .
Beliebige Argumente übergebenBeliebige Argumente übergeben Permalink
So wie Argumentlisten es Mixins ermöglichen, beliebige positions- oder schlüsselwortbasierte Argumente entgegenzunehmen, kann dieselbe Syntax verwendet werden, um positions- und schlüsselwortbasierte Argumente an ein Mixin zu übergeben. Wenn Sie eine Liste gefolgt von ... als letztes Argument eines Includes übergeben, werden ihre Elemente als zusätzliche Positionsargumente behandelt. Ebenso wird eine Map gefolgt von ... als zusätzliche Schlüsselwortargumente behandelt. Sie können sogar beides gleichzeitig übergeben !
SCSS-Syntax
$form-selectors: "input.name", "input.address", "input.zip" !default;
@include order(150px, $form-selectors...);
Sass-Syntax
$form-selectors: "input.name", "input.address", "input.zip" !default
@include order(150px, $form-selectors...)
💡 Lustige Tatsache
Da eine Argumentliste sowohl Positions- als auch Schlüsselwortargumente verfolgt, verwenden Sie sie, um beide gleichzeitig an ein anderes Mixin zu übergeben. Das macht es extrem einfach, einen Alias für ein Mixin zu definieren!
SCSS-Syntax
@mixin btn($args...) {
@warn "The btn() mixin is deprecated. Include button() instead.";
@include button($args...);
}
Sass-Syntax
@mixin btn($args...)
@warn "The btn() mixin is deprecated. Include button() instead."
@include button($args...)
InhaltsblöckeInhaltsblöcke Permalink
Neben der Entgegennahme von Argumenten kann ein Mixin einen gesamten Stilblock entgegennehmen, der als Inhaltsblock bezeichnet wird. Ein Mixin kann deklarieren, dass es einen Inhaltsblock entgegennimmt, indem es die @content-Regel in seinem Körper verwendet. Der Inhaltsblock wird mit geschweiften Klammern wie jeder andere Block in Sass übergeben und an der Stelle der @content-Regel eingefügt.
SCSS-Syntax
@mixin hover {
&:not([disabled]):hover {
@content;
}
}
.button {
border: 1px solid black;
@include hover {
border-width: 2px;
}
}
Sass-Syntax
@mixin hover
&:not([disabled]):hover
@content
.button
border: 1px solid black
@include hover
border-width: 2px
CSS-Ausgabe
.button {
border: 1px solid black;
}
.button:not([disabled]):hover {
border-width: 2px;
}
💡 Lustige Tatsache
Ein Mixin kann mehrere @content-Regeln enthalten. Wenn es dies tut, wird der Inhaltsblock für jede @content separat eingefügt.
⚠️ Vorsicht!
Ein Inhaltsblock ist lexikalisch gescopet, was bedeutet, dass er nur lokale Variablen im Geltungsbereich sehen kann, in dem das Mixin eingeschlossen ist. Er kann keine Variablen sehen, die in dem Mixin definiert sind, an das er übergeben wird, selbst wenn sie vor dem Aufruf des Inhaltsblocks definiert werden .
Argumente an Inhaltsblöcke übergebenArgumente an Inhaltsblöcke übergeben Permalink
- Dart Sass
- seit 1.15.0
- LibSass
- ✗
- Ruby Sass
- ✗
Ein Mixin kann Argumente an seinen Inhaltsblock übergeben, genauso wie es Argumente an ein anderes Mixin übergeben würde, indem es @content(<argumente...>) schreibt. Der Benutzer, der den Inhaltsblock schreibt, kann Argumente akzeptieren, indem er @include <name> using (<argumente...>) schreibt. Die Argumentliste für einen Inhaltsblock funktioniert genauso wie die Argumentliste eines Mixins, und die an ihn von @content übergebenen Argumente funktionieren genauso wie das Übergeben von Argumenten an ein Mixin.
⚠️ Vorsicht!
Wenn ein Mixin Argumente an seinen Inhaltsblock übergibt, muss dieser Inhaltsblock deklarieren, dass er diese Argumente akzeptiert. Das bedeutet, dass es eine gute Idee ist, nur Argumente nach Position zu übergeben (nicht namentlich) und dass das Übergeben von mehr Argumenten eine breaking Change darstellt.
Wenn Sie flexibel sein möchten, welche Informationen Sie an einen Inhaltsblock übergeben, sollten Sie ihm eine Map übergeben, die Informationen enthält, die er möglicherweise benötigt !
SCSS-Syntax
@mixin media($types...) {
@each $type in $types {
@media #{$type} {
@content($type);
}
}
}
@include media(screen, print) using ($type) {
h1 {
font-size: 40px;
@if $type == print {
font-family: Calluna;
}
}
}
Sass-Syntax
@mixin media($types...)
@each $type in $types
@media #{$type}
@content($type)
@include media(screen, print) using ($type)
h1
font-size: 40px
@if $type == print
font-family: Calluna
CSS-Ausgabe
@media screen {
h1 {
font-size: 40px;
}
}
@media print {
h1 {
font-size: 40px;
font-family: Calluna;
}
}
Eingerückte Mixin-SyntaxEingerückte Mixin-Syntax Permalink
Die eingerückte Syntax hat eine spezielle Syntax für die Definition und Verwendung von Mixins, zusätzlich zu den Standard-@mixin und @include. Mixins werden mit dem Zeichen = definiert und mit + eingeschlossen. Obwohl diese Syntax kürzer ist, ist sie auch auf den ersten Blick schwerer zu verstehen und Benutzer werden ermutigt, sie zu vermeiden .
Sass-Syntax
=reset-list
margin: 0
padding: 0
list-style: none
=horizontal-list
+reset-list
li
display: inline-block
margin:
left: -2px
right: 2em
nav ul
+horizontal-list
CSS-Ausgabe
nav ul {
margin: 0;
padding: 0;
list-style: none;
}
nav ul li {
display: inline-block;
margin-left: -2px;
margin-right: 2em;
}