Ist es möglich, Konstanten in CSS zu definieren?

79

Ich verwende einige Farben in meinem CSS-Stylesheet. Zum Beispiel,

#testdiv{
  background: #123456;
}

Ist es möglich, diese Farbe anhand des Namens zu definieren, damit ich sie im CSS-Blatt wie folgt referenzieren kann?

#testdiv{
  background: COLORNAME;
}
zmol
quelle
1
Wenn Sie ein Framework wie SASS verwenden, erhalten Sie diese Funktion zusammen mit anderen brillanten Funktionen.
Domdomcodecode
2
Ja, sie heißen jetzt CSS benutzerdefinierte Eigenschaften
gbjbaanb
Wenn Sie so etwas erwarten, wie es const myColor="#ffg433"; jede Programmiersprache bieten würde, aber leider nicht vorhanden ist, sollten Sie einen benutzerdefinierten Stil definieren und ihn wiederverwenden.
Maheshmnj

Antworten:

14

Es ist wahrscheinlich besser, eine CSS-Klasse zu definieren und sie für jedes Element wiederzuverwenden, dem Sie die Farbe zuweisen möchten, anstatt sie einem bestimmten Element zu codieren.

Wie so:

.darkBackground {
   background: #123456;
}

.smallText {
   font-size: 8pt;
}

Es ist auch hilfreich zu wissen, dass auf ein Element mehrere Klassen angewendet werden können, sodass Sie Ihre "konstanten" Elementwerte in separate Klassen aufteilen und bei Bedarf mehr als eine anwenden können.

<div id="myDiv1" class="darkBackground smallText"></div>
<div id="myDiv2" class="darkBackground bigText"></div>
JohnFx
quelle
59
Ich mag Ihr Beispiel nicht besonders. Ich glaube, CSS-Klassen werden am besten verwendet, um die HTML-Dokumentstruktur zu klassifizieren. Eine Klasse namens darkBackground beschreibt die Struktur des Dokuments nicht und erstellt eine konzeptionelle Kopplung des Dokuments an einen Aspekt des Erscheinungsbilds - genau davon soll CSS uns abbringen. Wenn ein zukünftiger Entwickler zu hellen Hintergründen wechseln muss, muss er möglicherweise eine Menge HTML bearbeiten, um die Klasse "lightBackground" zu verwenden, oder der Bedeutung seiner Klassen trotzen, indem er die Regel "darkBackground" bearbeitet, um auf eine helle Farbe zu verweisen.
CSJ
9
Um ehrlich zu sein, Ihr Beispiel befasst sich mit dem grundlegenden Problem, das die Operation und andere erfahren: CSS liefert keine Konstanten (die Gründe dafür sind eine ganz andere Debatte). Der Umgang damit scheint sich auf drei Optionen zu beschränken: 1. (Ihr Vorschlag) Verwenden Sie CSS-Klassen, um den Stil und nicht die Struktur zu identifizieren. 2. (Antwort von Wahrscheinlichkeitszero) Verwenden Sie eine Art serverseitigen programmatischen CSS-Generator. 3. Geben Sie auf, akzeptieren Sie das Ärgernis und nehmen Sie das CSS-Paradigma so an, wie es ist. Angesichts der Tatsache, dass Ihre Antwort unbestritten angenommen wurde und ich 2 oder 3 bevorzuge, dachte ich, ich würde meine 2 Cent hinzufügen. Prost
csj
2
@Abakus. Ich habe keine separate Antwort eingereicht, da meine eigenen Ansätze bereits durch andere Antworten dargestellt wurden. Mein Ziel bei der Abgabe eines Kommentars war es vielmehr, eine Antwort, die als richtig akzeptiert wurde, direkt herauszufordern.
CSJ
3
Ich stimme zwar zu: "Es ist wahrscheinlich besser, eine CSS-Klasse zu definieren und sie für jedes Element, dem Sie die Farbe zuweisen möchten, wiederzuverwenden." Ein Problem bei diesem Ansatz besteht jedoch darin, dass die Farbe für verschiedene Attribute angewendet werden soll. Zum Beispiel habe ich ein SVG-Rect-Element, das die gleiche Farbe wie der Hintergrund für ein Li-Element haben sollte. Das SVG-Rect erfordert Füllung: Rot, während das Li-Element Hintergrund: Rot erfordert. Mit diesem Ansatz müsste ich die Farbe an zwei verschiedenen Stellen definieren.
Rom99
3
Diese Antwort beantwortet die Frage nicht wirklich, und wie andere gesagt haben, ist der Rat fraglich.
Michael Scheper
75

Nicht mit einfachem CSS, aber es gibt einige CSS-Erweiterungen, die Sie verwenden können, wie Sass oder Less- CSS .

Hier ist ein Beispiel für weniger CSS:

@color: #4D926F;

#header {
  color: @color;
}
h2 {
  color: @color;
}
Wahrscheinlichkeit Null
quelle
53
Es ist unglaublich, dass CSS3 noch keine Konstanten hinzugefügt wurden. Die Webentwicklung ist im Mittelalter.
AlikElzin-Kilaka
@ AlikElzin-kilaka Ich habe mich jahrelang so gefühlt, aber nachdem ich eine Weile weniger CSS verwendet und die Vielzahl der Funktionen erlebt hatte, die es auf den Tisch bringt, hörte ich auf, mich um die Defizite zu kümmern, die ich als CSS empfand.
CSJ
53

Ja, die Verwendung von Klassen ist ein guter Ansatz, aber es ist jetzt möglich, Variablen in CSS zu deklarieren. Und Variablen (insbesondere Farbvariablen) sind unglaublich nützlich, wenn Sie dieselbe Farbe deklarieren (eine, bei der Sie den Hex-Wert benötigen, wenn Sie eine integrierte Farbe verwenden, ist dies nicht so wichtig).

Und dies ist die Verwendung von einfachem CSS (und tbh, nicht annähernd so elegant wie die Verwendung von SASS oder lessCSS), aber es funktioniert für Zwecke von einfachem CSS. Definieren Sie zunächst die tatsächliche Variable im :rootBlock. Sie können es beispielsweise auch in einem pBlock definieren (oder in irgendetwas anderem), aber es ist nur in diesem Block verfügbar. Um sicherzustellen, dass es global zugänglich ist, legen Sie es im Stammblock ab:

:root {
  --custom-color: #f0f0f0;
}

Und mit der varMethode (ohne die var-Methode wird sie nicht als tatsächliche Referenz aufgelöst) können Sie später darauf verweisen:

p{
    color: var(--custom-color);
}

Da der :rootBlock (wie alle anderen CSS-Deklarationen) ein voll funktionsfähiger Block ist, der auf Elemente verweist, können Sie Folgendes nicht deklarieren:

:root{
    color: #00ff00;
}

Das würde auf das Farbattribut jedes einzelnen Elements verweisen und es auf (in diesem Beispiel) setzen #00ff00. Jeder von Ihnen deklarierte Variablenname muss mit beginnen --, was bedeutet, dass Sie Folgendes tun können:

:root{
    --color: #00ff00;
}

Und wieder, wenn Sie können, verwenden Sie etwas wie SASS oder lessCSS. Die Möglichkeit, sie durch Schreiben @color = #fff* und Verweisen auf @color* zu deklarieren, ist viel einfacher als der Umgang mit einfachem CSS und die Verwendung des varSchlüsselworts jedes Mal, wenn Sie auf eine benutzerdefinierte Eigenschaft zugreifen möchten.

Und Sie können mit JS auf Inline-CSS zugreifen, um die Eigenschaften abzurufen und / oder zu ändern:

//Inline CSS
element.style.getPropertyValue("--custom-color");

// get variable from wherever
getComputedStyle(element).getPropertyValue("--custom-color");

// set variable on inline style
element.style.setProperty("--custom-color", "#f0f0f0");

HINWEIS!

Dies ist eine kürzlich hinzugefügte Funktion, daher ist es wichtig, die Browserkompatibilität zu überprüfen . Insbesondere Firefox ist besondere Aufmerksamkeit wert, da es eine Lücke zwischen der Einführung der Variablendeklarationen selbst und der var()Methode gibt. caniuse schätzt derzeit, dass 91,65% der Benutzer einen Browser mit Unterstützung für die Methode ausführen. Und es ist auch erwähnenswert, dass IE das überhaupt nicht tut.

* mit lessCSS ist es @color, mit SASS ist es$color

Zoe
quelle
1
Welche Antwort akzeptiert wird, liegt ausschließlich bei OP, der seit 2011 nicht mehr online war. Akzeptieren bedeutet jedoch nur, dass es für OP funktioniert hat. Eine Änderung der akzeptierten Antwort ist daher nur dann sinnvoll, wenn sie von OP
Zoe
16

Dafür gibt es einige Vorschläge , so dass es bald passieren könnte, aber meines Wissens wurde noch nichts standardisiert.

Das Problem bei der Verwendung von CSS-Klassen besteht darin, dass sie keine Hilfe sind, wenn Sie denselben Wert für verschiedene Eigenschaften verwenden möchten, z. B. wenn Sie einen bestimmten Farbwert für einen Rahmen für ein Element und eine Hintergrundfarbe für verwenden möchten Ein weiterer.

Codebox
quelle
1
IMO, dies sollte die Antwort sein, die als richtig markiert ist. Außerdem können Sie eine CSS-Klasse nicht wie customers-process-step-color-1und automatisch auf Pseudoelemente wie anwenden :before. Sie müssen die Farbe :beforedirekt einstellen .
Peter_the_oak
7

In CSS können Sie Ihre Konstante deklarieren in : root block:

:root {
  --main-bg-color: #1596A7;
}

Und mit der var () -Methode:

.panel-header {
    background: var(--main-bg-color);
    color: ...
}
A. Hafid
quelle
2

Sie können Sass- Variablen verwenden:

$color: #4D926F;

.someclass{
  color: $color;
}
Skotee
quelle
2

Verwenden Sie Sass oder weniger .

Heutzutage ist die Verwendung von Präprozessoren wie den oben genannten eine gängige Praxis für einen besseren Front-End-Entwicklungsworkflow.

Es hilft Ihnen, besser organisiert zu sein, und Funktionen wie Variablen oder Mixins sind einige der Gründe, die es wert sind, berücksichtigt zu werden.

rot
quelle
-4

Sie können Konstanten in einer CSSDatei haben und diese wie folgt deklarieren:

*{
 -my-lightBlue: #99ccff;
 -my-lightGray: #e6e6e6;
}

Dann können Sie sie in der CSS-Datei wie folgt verwenden:

.menu-item:focused {
  -fx-background-color: -my-lightBlue;
}

Danach können Sie sie programmgesteuert wie folgt verwenden:

progressBar.setStyle("-fx-accent: -my-lightBlue;");
JohnBeGood
quelle
4
Das gilt nur für JavaFX CSS
Caleb
-7

Die Standardmethode hierfür ist PHP. Fügen Sie am Anfang Ihrer CSS-Datei #define-Anweisungen hinzu, z

#define COLORNAME: #123456;

Führen Sie an dieser Stelle ein PHP-Skript aus, anstatt eine Verknüpfung mit der CSS-Datei im Kopf Ihrer HTML-Datei herzustellen. Das Skript lädt die CSS-Datei, ersetzt alle Vorkommen von COLORNAMEby #123456und überträgt den gepatchten Text mit echooder an den Client print.

Alternativ können Sie die Quelldatei hochladen (auch mit PHP), mit PHP eine CSS-Datei erstellen, in der alle Vorkommen von #defines ersetzt werden, und diese Datei in Ihrem HTML-Code verwenden. Dies ist effizienter, da Sie die Konvertierung beim Hochladen nur einmal durchführen, anstatt jedes Mal, wenn Sie die HTML-Datei laden.

Geert Goeteyn
quelle