In CSS haben einige Eigenschaften Kurzformen. Eine Eigenschaft, die getrennte Werte annimmt. Syntaktischer Zucker, wie man so schön sagt, um das Erstellen zu erleichtern. Nehmen Sie `transition`, das könnte etwa so aussehen
.element {
transition: border 0.2s ease-in-out;
}
Wir hätten es auch so schreiben können
.element {
transition-property: border;
transition-duration: 0.2s;
transition-timing-function: ease-in-out;
}
Jeder „Teil“ des Kurzformwerts hat seine eigene Eigenschaft, der er zugeordnet ist. Aber das gilt nicht für alles. Nehmen wir `box-shadow`
.element {
box-shadow: 0 0 10px #333;
}
Das ist keine Kurzform für andere Eigenschaften. Es gibt kein `box-shadow-color` oder `box-shadow-offset`.
Hier kommen Custom Properties ins Spiel und retten uns!
Wir könnten es so einrichten
:root {
--box-shadow-offset-x: 10px;
--box-shadow-offset-y: 2px;
--box-shadow-blur: 5px;
--box-shadow-spread: 0;
--box-shadow-color: #333;
}
.element {
box-shadow:
var(--box-shadow-offset-x)
var(--box-shadow-offset-y)
var(--box-shadow-blur)
var(--box-shadow-spread)
var(--box-shadow-color);
}
Vielleicht etwas langatmig, aber es erfüllt seinen Zweck.
Nachdem wir das getan haben, denken Sie daran, dass wir einige einzigartig coole Dinge bekommen
- Wir können einzelne Werte mit JavaScript ändern. Zum Beispiel
document.documentElement.style.setProperty("--box-shadow-color", "green"); - Nutzen Sie die Kaskade, wenn nötig. Wenn wir `<code>--box-shadow-color: blue auf einem Selektor setzen, der spezifischer ist als `:root`, überschreiben wir diese Farbe.
Fallback-Optionen sind ebenfalls möglich, falls die Variable gar nicht gesetzt ist
.element {
box-shadow:
var(--box-shadow-offset-x, 0)
var(--box-shadow-offset-y, 0)
var(--box-shadow-blur, 5px)
var(--box-shadow-spread, 0)
var(--box-shadow-color, black);
}
Wie sieht es mit Transforms aus? Die sind unterhaltsam, weil sie eine durch Leerzeichen getrennte Liste von Werten annehmen, sodass jeder davon eine benutzerdefinierte Eigenschaft sein könnte
:root {
--transform_1: scale(2);
--transform_2: rotate(10deg);
}
.element{
transform: var(--transform_1) var(--transform_2);
}
Was ist mit Elementen, die zwar individuelle Eigenschaften für ihre Kurzform haben, aber auch durch Kommas getrennte Mehrfachwerte anbieten? Ein weiterer großartiger Anwendungsfall
:root {
--bgImage: url(basic_map.svg);
--image_1_position: 50px 20px;
--image_2_position: bottom right;
}
.element {
background:
var(--bgImage) no-repeat var(--image_1_position),
var(--bgImage) no-repeat var(--image_2_position);
}
Oder Übergänge?
:root {
--transition_1_property: border;
--transition_1_duration: 0.2s;
--transition_1_timing_function: ease;
--transition_2_property: background;
--transition_2_duration: 1s;
--transition_2_timing_function: ease-in-out;
}
.element {
transition:
var(--transition_1_property)
var(--transition_1_duration)
var(--transition_1_timing_function),
var(--transition_2_property)
var(--transition_2_duration)
var(--transition_2_timing_function),
}
Dan Wilson hat kürzlich diese Art von Ding mit Animationen verwendet, um zu zeigen, wie einzelne Animationen pausiert werden können!
Hier ist die Browserunterstützung
Diese Daten zur Browserunterstützung stammen von Caniuse, wo es mehr Details gibt. Eine Zahl gibt an, dass der Browser die Funktion ab dieser Version unterstützt.
Desktop
| Chrome | Firefox | IE | Edge | Safari |
|---|---|---|---|---|
| 49 | 31 | Nein | 16 | 10 |
Mobil / Tablet
| Android Chrome | Android Firefox | Android | iOS Safari |
|---|---|---|---|
| 127 | 127 | 127 | 10.0-10.2 |
Ich bin mir nicht sicher, ob ich so weit gehen würde, jeden Wert von etwas wie `box-shadow` separat zu definieren. So wie ich es gemacht habe, ist es ungefähr so
--boxshadow_lg: 0 8px 6px -6px rgba(0,0,0,.15);--boxshadow_sm: 0 2px 3px -3px rgba(0,0,0,.15);Und dann kann ich diese über `box-shadow: var(--boxshadow_lg);` aufrufen und bin fertig. Es gibt sicherlich Elemente, die ich in eine Variable ändern könnte, um Redundanz weiter zu reduzieren, aber das scheint ein ziemlich effizienter Weg zu sein, um genug von einer Mischung aus "einfach zu aktualisieren" und "einfach aufzurufen" zu erhalten
Vielleicht nicht!
Aber das ist ja gerade der Punkt. Man kann `box-shadow-color` buchstäblich nicht setzen, aber mit CSS Custom Properties kann man es irgendwie.
Caniuse sagt, dass FireFox für Android Unterstützung hat. Firefox für iPhone verwendet natürlich WebKit, also wenn Mobil Safari Unterstützung hat, sollte FF es dort auch haben.
Genial!
Hallo Chris, ist es möglich (oder hast du Ideen dazu), die Variable aus einem HTML-Attribut aufzurufen? So etwas wie
root: {--align-left: left;
--align-center: center;
--align-right: right;
}
p {
text-align: var('--align-' attr(data-align));
}
Nein. Das ist auch eine schlechte Idee, da Sie Inhalt und Präsentation vermischen würden. Es gibt einen Grund, warum das `align`-Attribut als veraltet gilt.
Sie können einiges mit `attr()` und Variablen machen, wie es derzeit in Browsern unterstützt wird (wobei `attr()` immer einen String zurückgibt).
Es gibt sogar noch mehr Dinge, die Sie theoretisch tun könnten, wenn die vollständige CSS 3 `attr()`-Funktion unterstützt würde (wodurch Sie dem Browser mitteilen könnten, den Attributwert als Farbe, Länge, URL oder anderen Datentyp zu parsen).
Keines davon sieht jedoch wie Ihr Code aus. Sie können den Variablennamen nicht dynamisch zusammensetzen. `var()` kann nur die Werte ändern.
Was Sie jetzt tun können, ist, Variablen auf einem Element in einem `style`-Attribut zu setzen und diese zu verwenden, um aus Ihrem Stylesheet koordinierte Stiländerungen auszulösen.
Tolle Zusammenfassung! Ich glaube jedoch, Dan Wilson kam Ihnen mit seinem Artikel hier zuvor.
Ups, das habe ich gerade bemerkt, dass du dort bereits verlinkt hast
Wie ich in der Vergangenheit dynamisches CSS gehandhabt habe
Ich benutze `<style class="dynamic-css">` im `
` und erstelle dynamisch dessen Inhalt, indem ich Strings in JavaScript verknüpfe. Ich kann auch "Fallbacks" haben, ich schreibe sie einfach in mein reguläres Stylesheet.Das ist noch browserkompatibler, da es auf seit Langem verwendeten Techniken basiert. Ich gebe zu, dass `setProperty()` eine praktische Methode zum Setzen von CSS-Eigenschaften ist, aber zu dem Preis, dass die Browserunterstützung immer noch fehlt, insbesondere wenn es um mobile Geräte geht.
Also... wie verwende ich es wieder mit SCSS?
Custom Properties sind also nichts weiter als die Fähigkeit, Variablen zu definieren und diese Variablen dann an anderer Stelle in Ihrer CSS-Datei zu verwenden.
Gute Arbeit, Chris!