Variablen
Sass-Variablen sind einfach: Sie weisen einem Namen, der mit $ beginnt, einen Wert zu und können dann auf diesen Namen statt auf den Wert selbst verweisen. Aber trotz ihrer Einfachheit sind sie eines der nützlichsten Werkzeuge, die Sass zu bieten hat. Variablen ermöglichen es, Wiederholungen zu reduzieren, komplexe Berechnungen durchzuführen, Bibliotheken zu konfigurieren und vieles mehr.
Eine Variablendeklaration sieht einer Eigenschaftsdeklaration sehr ähnlich: Sie wird als <variable>: <expression> geschrieben. Im Gegensatz zu einer Eigenschaft, die nur in einer Stilregel oder At-Regel deklariert werden kann, können Variablen überall deklariert werden, wo Sie möchten. Um eine Variable zu verwenden, fügen Sie sie einfach in einen Wert ein.
SCSS-Syntax
$base-color: #c6538c;
$border-dark: rgba($base-color, 0.88);
.alert {
border: 1px solid $border-dark;
}
Sass-Syntax
$base-color: #c6538c
$border-dark: rgba($base-color, 0.88)
.alert
border: 1px solid $border-dark
CSS-Ausgabe
.alert {
border: 1px solid rgba(198, 83, 140, 0.88);
}
⚠️ Vorsicht!
CSS hat eigene Variablen, die sich völlig von Sass-Variablen unterscheiden. Kennen Sie die Unterschiede!
-
Sass-Variablen werden alle von Sass kompiliert. CSS-Variablen werden in der CSS-Ausgabe enthalten.
-
CSS-Variablen können unterschiedliche Werte für verschiedene Elemente haben, aber Sass-Variablen haben immer nur einen Wert zur Zeit.
-
Sass-Variablen sind imperativ, was bedeutet, dass, wenn Sie eine Variable verwenden und dann ihren Wert ändern, die frühere Verwendung gleich bleibt. CSS-Variablen sind deklarativ, was bedeutet, dass, wenn Sie den Wert ändern, dies sowohl frühere als auch spätere Verwendungen betrifft.
SCSS-Syntax
$variable: value 1;
.rule-1 {
value: $variable;
}
$variable: value 2;
.rule-2 {
value: $variable;
}
Sass-Syntax
$variable: value 1
.rule-1
value: $variable
$variable: value 2
.rule-2
value: $variable
CSS-Ausgabe
.rule-1 {
value: value 1;
}
.rule-2 {
value: value 2;
}
💡 Lustige Tatsache
Sass-Variablen behandeln, wie alle Sass-Identifikatoren, Bindestriche und Unterstriche als identisch. Das bedeutet, dass $font-size und $font_size beide auf dieselbe Variable verweisen. Dies ist ein historischer Überbleibsel aus der sehr frühen Zeit von Sass, als nur Unterstriche in Bezeichnernamen erlaubt waren. Sobald Sass Bindestriche zur Anpassung an die CSS-Syntax unterstützte, wurden die beiden gleichgesetzt, um die Migration zu erleichtern.
StandardwerteStandardwerte Permalink
Normalerweise, wenn Sie einer Variable einen Wert zuweisen und diese Variable bereits einen Wert hatte, wird ihr alter Wert überschrieben. Wenn Sie jedoch eine Sass-Bibliothek schreiben, möchten Sie vielleicht, dass Ihre Benutzer die Variablen Ihrer Bibliothek konfigurieren können, bevor Sie sie zur Generierung von CSS verwenden.
Um dies zu ermöglichen, bietet Sass das Flag !default. Dies weist einer Variable einen Wert zu, nur wenn diese Variable nicht definiert ist oder ihr Wert null ist. Andernfalls wird der vorhandene Wert verwendet.
Module konfigurierenModule konfigurieren Permalink
- Dart Sass
- seit 1.23.0
- LibSass
- ✗
- Ruby Sass
- ✗
Nur Dart Sass unterstützt derzeit @use. Benutzer anderer Implementierungen müssen stattdessen die @import-Regel verwenden.
Mit !default definierte Variablen können beim Laden eines Moduls mit der @use-Regel konfiguriert werden. Sass-Bibliotheken verwenden häufig !default-Variablen, damit ihre Benutzer die CSS der Bibliothek konfigurieren können.
Um ein Modul mit Konfiguration zu laden, schreiben Sie @use <url> with (<variable>: <value>, <variable>: <value>). Die konfigurierten Werte überschreiben die Standardwerte der Variablen. Nur Variablen, die auf der obersten Ebene des Stylesheets mit einem !default-Flag geschrieben wurden, können konfiguriert werden.
SCSS-Syntax
// _library.scss
$black: #000 !default;
$border-radius: 0.25rem !default;
$box-shadow: 0 0.5rem 1rem rgba($black, 0.15) !default;
code {
border-radius: $border-radius;
box-shadow: $box-shadow;
}
// style.scss
@use 'library' with (
$black: #222,
$border-radius: 0.1rem
);
Sass-Syntax
// _library.sass
$black: #000 !default
$border-radius: 0.25rem !default
$box-shadow: 0 0.5rem 1rem rgba($black, 0.15) !default
code
border-radius: $border-radius
box-shadow: $box-shadow
// style.sass
@use 'library' with ($black: #222, $border-radius: 0.1rem)
CSS-Ausgabe
code {
border-radius: 0.1rem;
box-shadow: 0 0.5rem 1rem rgba(34, 34, 34, 0.15);
}
Eingebaute VariablenEingebaute Variablen Permalink
Variablen, die von einem eingebauten Modul definiert werden, können nicht modifiziert werden.
GültigkeitsbereichGültigkeitsbereich Permalink
Variablen, die auf der obersten Ebene eines Stylesheets deklariert werden, sind global. Das bedeutet, dass sie überall in ihrem Modul nach ihrer Deklaration zugänglich sind. Aber das gilt nicht für alle Variablen. Diejenigen, die in Blöcken (geschweifte Klammern in SCSS oder eingerückter Code in Sass) deklariert sind, sind normalerweise lokal und nur innerhalb des Blocks zugänglich, in dem sie deklariert wurden.
SCSS-Syntax
$global-variable: global value;
.content {
$local-variable: local value;
global: $global-variable;
local: $local-variable;
}
.sidebar {
global: $global-variable;
// This would fail, because $local-variable isn't in scope:
// local: $local-variable;
}
Sass-Syntax
$global-variable: global value
.content
$local-variable: local value
global: $global-variable
local: $local-variable
.sidebar
global: $global-variable
// This would fail, because $local-variable isn't in scope:
// local: $local-variable
CSS-Ausgabe
.content {
global: global value;
local: local value;
}
.sidebar {
global: global value;
}
ÜberschattungÜberschattung Permalink
Lokale Variablen können sogar mit demselben Namen wie eine globale Variable deklariert werden. Wenn dies geschieht, gibt es tatsächlich zwei verschiedene Variablen mit demselben Namen: eine lokale und eine globale. Dies hilft sicherzustellen, dass ein Autor, der eine lokale Variable schreibt, nicht versehentlich den Wert einer globalen Variable ändert, die ihm nicht einmal bewusst ist.
SCSS-Syntax
$variable: global value;
.content {
$variable: local value;
value: $variable;
}
.sidebar {
value: $variable;
}
Sass-Syntax
$variable: global value
.content
$variable: local value
value: $variable
.sidebar
value: $variable
CSS-Ausgabe
.content {
value: local value;
}
.sidebar {
value: global value;
}
Wenn Sie den Wert einer globalen Variable aus einem lokalen Gültigkeitsbereich (z. B. in einem Mixin) festlegen müssen, können Sie das Flag !global verwenden. Eine als !global gekennzeichnete Variablendeklaration weist immer dem globalen Gültigkeitsbereich zu.
SCSS-Syntax
$variable: first global value;
.content {
$variable: second global value !global;
value: $variable;
}
.sidebar {
value: $variable;
}
Sass-Syntax
$variable: first global value
.content
$variable: second global value !global
value: $variable
.sidebar
value: $variable
CSS-Ausgabe
.content {
value: second global value;
}
.sidebar {
value: second global value;
}
⚠️ Vorsicht!
- Dart Sass
- seit 2.0.0
- LibSass
- ✗
- Ruby Sass
- ✗
Ältere Sass-Versionen erlaubten die Verwendung von !global für eine Variable, die noch nicht existierte. Dieses Verhalten wurde als veraltet eingestuft, um sicherzustellen, dass jedes Stylesheet dieselben Variablen deklariert, unabhängig davon, wie es ausgeführt wird.
Das Flag !global darf nur zum Festlegen einer Variable verwendet werden, die bereits auf der obersten Ebene einer Datei deklariert wurde. Es darf nicht zum Deklarieren einer neuen Variable verwendet werden.
Ablaufsteuerung GültigkeitsbereichAblaufsteuerung Gültigkeitsbereich Permalink
In Ablaufsteuerungsregeln deklarierte Variablen haben spezielle Geltungsbereichsregeln: Sie überschatten keine Variablen auf derselben Ebene wie die Ablaufsteuerungsregel. Stattdessen weisen sie diesen Variablen einfach Werte zu. Dies erleichtert das bedingte Zuweisen eines Wertes zu einer Variable oder das Aufbauen eines Wertes als Teil einer Schleife erheblich.
SCSS-Syntax
$dark-theme: true !default;
$primary-color: #f8bbd0 !default;
$accent-color: #6a1b9a !default;
@if $dark-theme {
$primary-color: darken($primary-color, 60%);
$accent-color: lighten($accent-color, 60%);
}
.button {
background-color: $primary-color;
border: 1px solid $accent-color;
border-radius: 3px;
}
Sass-Syntax
$dark-theme: true !default
$primary-color: #f8bbd0 !default
$accent-color: #6a1b9a !default
@if $dark-theme
$primary-color: darken($primary-color, 60%)
$accent-color: lighten($accent-color, 60%)
.button
background-color: $primary-color
border: 1px solid $accent-color
border-radius: 3px
CSS-Ausgabe
.button {
background-color: rgb(116.96, 12.04, 48.16);
border: 1px solid rgb(245.4696132597, 235.4309392265, 251.5690607735);
border-radius: 3px;
}
⚠️ Vorsicht!
Variablen im Ablaufsteuerungs-Geltungsbereich können bestehenden Variablen im äußeren Geltungsbereich Werte zuweisen, aber neue Variablen, die im Ablaufsteuerungs-Geltungsbereich deklariert werden, sind im äußeren Geltungsbereich nicht zugänglich. Stellen Sie sicher, dass die Variable bereits deklariert ist, bevor Sie ihr einen Wert zuweisen, auch wenn Sie sie als null deklarieren müssen.
Erweiterte VariablenfunktionenErweiterte Variablenfunktionen Permalink
Die Sass-Kernbibliothek bietet einige erweiterte Funktionen für die Arbeit mit Variablen. Die Funktion meta.variable-exists() gibt zurück, ob eine Variable mit dem angegebenen Namen im aktuellen Gültigkeitsbereich existiert, und die Funktion meta.global-variable-exists() tut dasselbe, aber nur für den globalen Geltungsbereich.
⚠️ Vorsicht!
Benutzer möchten gelegentlich Interpolation verwenden, um einen Variablennamen basierend auf einer anderen Variable zu definieren. Sass erlaubt dies nicht, da es erheblich erschwert, auf einen Blick zu erkennen, welche Variablen wo definiert sind. Was Sie jedoch tun können, ist die Definition einer Map von Namen zu Werten, auf die Sie dann mithilfe von Variablen zugreifen können.
SCSS-Syntax
@use "sass:map";
$theme-colors: (
"success": #28a745,
"info": #17a2b8,
"warning": #ffc107,
);
.alert {
// Instead of $theme-color-#{warning}
background-color: map.get($theme-colors, "warning");
}
Sass-Syntax
@use "sass:map"
$theme-colors: ("success": #28a745, "info": #17a2b8, "warning": #ffc107)
.alert
// Instead of $theme-color-#{warning}
background-color: map.get($theme-colors, "warning")
CSS-Ausgabe
.alert {
background-color: #ffc107;
}