Przed pojawieniem się CSS Custom Properties (znane też jako CSS Variables) implementacja takich funkcjonalności jak różne motywy, tryb ciemny czy danie możliwości konfigurowania kolorystyki dynamicznie była dość uciążliwa. Preproesory takie jak SCSS wspomagały ten proces poprzez własną implementację zmiennych i możliwość pisania funkcji generujących np różne klasy dla różnych motywów – ale efektem takich działań była spora ilość generowanego kodu, który musiał powstać by zrekompensować brak dynamiki.
CSS Variables pozwalają zmieniać wartości w stylach w pełni dynamicznie – a ten post pokaże, do czego tą właściwość można wykorzystać.
Czym są CSS Variables?
Pokrótce – CSS Variables to zmienne zawierające wartości, których możemy używać w różnych miejscach stylów CSS oraz które możemy dynamicznie zmieniać, z poziomu CSS lub JS. Dodatkowo możliwość nazywania zmiennych pozwala nadawać im kontekst.
Przykładowo, zdeklarujmy zmienne definiujące główny oraz poboczny kolor tekstu w aplikacji wraz z kolorem tła:
Aczkolwiek prostota ich wykorzystania powoduje że w łatwy sposób można stworzyć nawet edytor wizualny – co będzie tematem tego rozdziału.
Implementacja edytora wizualnego do CSS Variables
Zacznijmy od zdefiniowania zmiennych na elemencie
html
html:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
html{
--text-color-main: #000000;
--text-color-secondary: #808080;
/* inne zmienne*/
}
html {
--text-color-main: #000000;
--text-color-secondary: #808080;
/* inne zmienne*/
}
html {
--text-color-main: #000000;
--text-color-secondary: #808080;
/* inne zmienne*/
}
Dlaczego na elemencie
html
html a nie
:root
:root jak przeważnie jest w przykładach? Ponieważ deklaracja na elemencie html spowoduje, że wartości CSS Variables dzięki temu będzie prościej wczytać w JS.
A po co będziemy potrzebować wczytać te wartości w JS? Ponieważ będziemy chcieli te wartości ustawić jako domyślne w formularzu, który pozwoli je na żywo edytować.
Kod formularza wyglądać będzie następująco:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<form>
<labelfor="--text-color-main">Text color main</label><inputid="--text-color-main"type="color"><br>
<labelfor="--text-color-secondary">Text color secondary</label><inputid="--text-color-secondary"type="color"><br>
<!-- Inne pola-->
<buttontype="submit">
Download changes
</button>
</form>
<form>
<label for="--text-color-main">Text color main</label><input id="--text-color-main" type="color"><br>
<label for="--text-color-secondary">Text color secondary</label><input id="--text-color-secondary" type="color"><br>
<!-- Inne pola-->
<button type="submit">
Download changes
</button>
</form>
<form>
<label for="--text-color-main">Text color main</label><input id="--text-color-main" type="color"><br>
<label for="--text-color-secondary">Text color secondary</label><input id="--text-color-secondary" type="color"><br>
<!-- Inne pola-->
<button type="submit">
Download changes
</button>
</form>
ID inputa odpowiada nazwie zmiennej CSS, dzięki czemu w prosty sposób po załadowaniu się strony możemy wpisać w formularz domyślne wartości:
html, pobieramy wartości styli. Następnie pobieramy wszystkie pola formularza, filtrujemy je tak by mieć tylko te z ID odpowiadającym nazwie zmiennej CSS. Po czym budujemy obiekt gdzie nazwa zmiennej będzie kluczem, a wartość pod kluczem odpowiadać będzie wartości tej zmiennej.
Samo zaaplikowanie zmiennych wyglądać będzie tak:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const applyVariables = variables =>{
for(const propertyName in variables){
if(variables.hasOwnProperty(propertyName)){
const pureValue = variables[propertyName];
const value = isNaN(parseInt(pureValue)) ? pureValue : parseInt(pureValue);
form.addEventListener('submit', e => {
e.preventDefault();
const result = {};
for (const input of e.currentTarget) {
if (input.id.startsWith('--')) {
const pureValue = input.value;
result[input.id] = isNaN(parseInt(pureValue)) ? pureValue : `${pureValue}px`;
}
}
const useNewSave = document.querySelector('#new-way-to-save').checked;
const blob = new Blob([JSON.stringify(result, null, 2)], {type: 'text/application/json'});
if (useNewSave) {
saveNew(blob);
}
else {
saveOld(blob);
}
});
form.addEventListener('submit', e => {
e.preventDefault();
const result = {};
for (const input of e.currentTarget) {
if (input.id.startsWith('--')) {
const pureValue = input.value;
result[input.id] = isNaN(parseInt(pureValue)) ? pureValue : `${pureValue}px`;
}
}
const useNewSave = document.querySelector('#new-way-to-save').checked;
const blob = new Blob([JSON.stringify(result, null, 2)], {type: 'text/application/json'});
if (useNewSave) {
saveNew(blob);
}
else {
saveOld(blob);
}
});
W momencie submitu formularza pobieramy wszystkie inputy które zawierają wartości dla zmiennych CSS, tworzymy z nich bloba który zostanie zapisany jako plik JSON.
W formularzu istnieje pole odpowiedzialne za wybór sposobu zapisu. Dostępne są 2 sposoby – „nowy” i „stary”.
CSS Variables mogą bardzo istotnie wspomóc proces tworzenia różnych tematów w projektach komercyjnych, dając możliwość konfiguracji nawet klientom końcowym. W połączeniu z szerokim już dziś wsparciem wydają się być podstawowym narzędziem pracy przy tworzeniu nowoczesnego, elastycznego designu. Dlatego warto je znać i stosować w rzeczywistych projektach.
Jeden komentarz do “CSS Variables – czemu warto je znać?”
Jeden komentarz do “CSS Variables – czemu warto je znać?”
Możliwość komentowania została wyłączona.