2017-08-22 3 views
0

Ich habe ein Projekt, das in die Eltern-App aufgeteilt ist, und mehrere wiederverwendbare Kind-Komponenten in separaten Repositories. Ich möchte CSS-Standardvariablen in diesen untergeordneten Komponenten definieren, die von der übergeordneten App überschrieben werden können, jedoch kann ich dafür nicht die richtige Syntax finden. Hier ist, was ich versucht habe:CSS-Variablen - Variable deklarieren, wenn nicht bereits definiert

/* parent */ 
:root { 
    --color: blue; 
} 

/* child */ 
:root { 
    --color: var(--color, green); 
} 

.test { 
    width: 200px; 
    height: 200px; 
    background: var(--color, red); 
} 

https://codepen.io/daviestar/pen/brModx

Die Farbe Blau sein sollte, aber wenn das Kind :root definiert ist, die Farbe ist eigentlich rot, zumindest in Chrome.

Gibt es einen richtigen Ansatz dafür? In SASS können Sie Ihren Kindvariablen ein !default Flag hinzufügen, was im Grunde bedeutet "deklarieren, wenn es nicht bereits deklariert ist".

Antwort

1

CSS steht für cascading style sheets, so dass Sie nichts von einem Elternteil außer Kraft setzen können ...

Der einzige Weg ist eine stärkere Regel zu erstellen.

Blick auf .c1 und .p1

.parent { 
 
    --background: red; 
 
} 
 

 
.child { 
 
    --size: 30px; 
 
    --background: green; /* this wins */ 
 

 
    background-color: var(--background); 
 
    width: var(--size); 
 
    height: var(--size); 
 
} 
 

 
.p1 .c1 { 
 
    --background: red; /* this wins */ 
 
} 
 

 
.c1 { 
 
    --size: 30px; 
 
    --background: green; 
 

 
    background-color: var(--background); 
 
    width: var(--size); 
 
    height: var(--size); 
 
}
<div class="parent"> 
 
    <div class="child"></div> 
 
</div> 
 

 
<hr /> 
 

 
<div class="p1"> 
 
    <div class="c1"></div> 
 
</div>

+0

ja! du hast mich zu meiner lösung geführt .... – daviestar

+0

passt es dir? – Hitmands

0

Dank @Hitmands Hinweis, den ich eine saubere Lösung haben:

/* parent */ 
html:root { /* <--- be more specific than :root in your parent app */ 
    --color: blue; 
} 

/* child */ 
:root { 
    --color: green; 
} 

.test { 
    width: 200px; 
    height: 200px; 
    background: var(--color); 
} 
+0

Ich verstehe nicht, warum das Verschieben von Variablen in den globalen Bereich sauberer sein könnte? – Hitmands

+0

Mein am häufigsten verwendeter Anwendungsfall für CSS-Variablen ist für globale Inhalte wie "font-size" und Themenfarben, und diese Inhalte möchte ich in der übergeordneten App überschreiben können. – daviestar

+0

Wenn Sie diesen Ansatz verwenden, müssen Sie auch keine neue CSS-Regel in der übergeordneten App hinzufügen, z. '.parent .child {/ * override * /}', können Sie die variable Spezifität das für Sie tun lassen. – daviestar

Verwandte Themen