@property
Rejestruje zmienną CSS z typem, wartością początkową i zasadą dziedziczenia. Taką zmienną można płynnie animować, np. kąt gradientu.
Przykład
#@property --angle {
syntax: "<angle>";
inherits: false;
initial-value: 0deg;
}
.card {
border: 3px solid transparent;
border-radius: 14px;
background:
linear-gradient(#18181b, #18181b) padding-box,
conic-gradient(from var(--angle), #7c3aed, #0ea5e9, #10b981, #7c3aed) border-box;
animation: spin 4s linear infinite;
}
@keyframes spin {
to { --angle: 360deg; }
}<div class="card" style="padding: 16px 18px;">
<strong>Konto Premium</strong>
<p style="margin: 4px 0 0; color: #a1a1aa;">Wszystkie światy odblokowane, bez limitu paliwa.</p>
</div>Definicja i zastosowanie
#Zwykła zmienna CSS (--nazwa) jest dla przeglądarki tylko ciągiem znaków. Przeglądarka nie wie, czy --kat: 45deg to kąt, więc nie potrafi wyliczyć wartości pośrednich i przy animacji zmienia ją skokowo. Reguła @property rejestruje zmienną z konkretnym typem, a wtedy przeglądarka traktuje ją jak prawdziwą właściwość.
Rejestracja ma trzy deskryptory. syntax określa typ, np. "<angle>", "<color>", "<length>", "<number>", "<integer>" lub "<percentage>", a "*" oznacza dowolną wartość. inherits mówi, czy potomkowie dziedziczą wartość. initial-value to wartość domyślna, wymagana dla każdego typu poza "*". Musi być niezależna od kontekstu, więc nie może to być np. 2em. Deskryptory syntax i inherits są obowiązkowe.
Największa korzyść to animacje. W większości przeglądarek zamiana jednego gradientu na drugi następuje skokowo, ale można animować zarejestrowaną zmienną, której gradient używa: kąt w conic-gradient(), pozycję koloru albo sam kolor. Liczba typu <integer> połączona z licznikiem CSS może nawet płynnie odliczać od 0 do 100.
Zmienną można też zarejestrować z JavaScriptu przez CSS.registerProperty(). Typ działa przy okazji jak zabezpieczenie: wartość niezgodna z typem, np. liczba w zmiennej typu <color>, zostaje odrzucona i zmienna przyjmuje wartość początkową albo odziedziczoną.
Składnia
#@property --nazwa {
syntax: "<typ>";
inherits: true | false;
initial-value: <wartość>;
}Deskryptory i typy
#pasek wypełnia się płynnie
Zmienna--pustawia miejsce, w którym kończy się zielony kolor gradientu. Dzięki rejestracji z typem procentowym pasek wypełnia się płynnie.pasek skacze
Ta sama animacja bez rejestracji. Przeglądarka nie zna typu zmiennej, więc zamiast wartości pośrednich przełącza ją w połowie czasu z 0% na 100%.obracający się gradient
Zmienna z kątem steruje punktem startowym gradientu stożkowego (from var(--angle)). Animacja kąta od 0 do 360 stopni daje obracający się pierścień.licznik od 0 do 100
Liczba całkowita przekazana do licznika CSS (counter-reset) i wyświetlona przezcontent. Animacja liczy płynnie od 0 do 100.kolor w gradiencie
Samego gradientu zwykle nie przejdziesz płynnie, ale kolor zapisany w zarejestrowanej zmiennej już tak. Lewy koniec przechodzi z fioletu w bursztyn.dziecko nie dziedziczy
Rodzic ustawia--accentna zielony i ma zieloną ramkę, ale dziecko tej wartości nie dziedziczy. Dostaje wartość początkową, czyli szary. Zwykła zmienna bez rejestracji byłaby u dziecka zielona.wartość, gdy nic nie ustawiono
Zmiennej--radiusnikt nie ustawił, a mimo to ma wartość 24px zinitial-value. Bez rejestracjivar(--radius)nie miałoby czego wstawić i zaokrąglenie by zniknęło.
Deskryptory i typy w praktyce
#syntax: "<percentage>"
--p ustawia miejsce, w którym kończy się zielony kolor gradientu. Dzięki rejestracji z typem procentowym pasek wypełnia się płynnie.@property --p {
syntax: "<percentage>";
inherits: false;
initial-value: 0%;
}
.bar {
animation: fill 2s infinite alternate;
}
@keyframes fill { to { --p: 100%; } }bez @property
.bar {
animation: fill 2s infinite alternate;
}
@keyframes fill { to { --p: 100%; } }syntax: "<angle>"
from var(--angle)). Animacja kąta od 0 do 360 stopni daje obracający się pierścień.@property --angle {
syntax: "<angle>";
inherits: false;
initial-value: 0deg;
}
.ring {
animation: turn 2.5s linear infinite;
}
@keyframes turn { to { --angle: 360deg; } }syntax: "<integer>"
counter-reset) i wyświetlona przez content. Animacja liczy płynnie od 0 do 100.@property --n {
syntax: "<integer>";
inherits: false;
initial-value: 0;
}
.count {
counter-reset: n var(--n);
animation: count 3s infinite alternate;
}
@keyframes count { to { --n: 100; } }syntax: "<color>"
@property --c {
syntax: "<color>";
inherits: false;
initial-value: #7c3aed;
}
.swatch {
animation: tint 2s infinite alternate;
}
@keyframes tint { to { --c: #f59e0b; } }inherits: false
--accent na zielony i ma zieloną ramkę, ale dziecko tej wartości nie dziedziczy. Dostaje wartość początkową, czyli szary. Zwykła zmienna bez rejestracji byłaby u dziecka zielona.@property --accent {
syntax: "<color>";
inherits: false;
initial-value: #52525b;
}
.parent {
--accent: #10b981;
border: 3px solid var(--accent);
}
.child { background: var(--accent); }initial-value
--radius nikt nie ustawił, a mimo to ma wartość 24px z initial-value. Bez rejestracji var(--radius) nie miałoby czego wstawić i zaokrąglenie by zniknęło.@property --radius {
syntax: "<length>";
inherits: false;
initial-value: 24px;
}
.tile { border-radius: var(--radius); }Więcej przykładów
#@property --fill {
syntax: "<percentage>";
inherits: false;
initial-value: 0%;
}
.btn {
background: linear-gradient(90deg, #7c3aed var(--fill), #27272a var(--fill));
transition: --fill 0.4s ease-out;
}
.btn:hover {
--fill: 100%;
}<button class="btn" type="button" style="padding: 10px 18px; border: 0; border-radius: 10px; color: #fff; font: 600 15px system-ui, sans-serif; cursor: pointer;">Najedź na mnie</button>Najedź kursorem na przycisk. Zarejestrowaną zmienną można przejść także przez zwykłe transition, a nie tylko animację @keyframes.
CSS.registerProperty({
name: '--angle',
syntax: '<angle>',
inherits: false,
initialValue: '0deg'
})Działa tak samo jak reguła @property. Przydaje się, gdy zmienne rejestruje biblioteka albo gdy typ zależy od danych w skrypcie.
Obsługa przeglądarek
#Nowość w przeglądarkach · od 2024 roku
Działa w aktualnych wersjach wszystkich głównych przeglądarek. Starsze wersje mogą tego nie obsługiwać.
- Chrome
- Edge
- Firefox
- Safari
Dobre praktyki
#- Rejestruj tylko zmienne, które animujesz albo którym chcesz nadać typ. Zwykłe zmienne z kolorami motywu i odstępami rejestracji nie potrzebują.
- Zmienne do animacji rejestruj z
inherits: false. Przeglądarka nie musi wtedy przeliczać ich wartości we wszystkich potomkach. - Zadbaj o sensowny wygląd bez animacji. Starsza przeglądarka bez obsługi
@propertyzmieni zmienną skokowo, ale gradient nadal się wyświetli.
Powiązane hasła
#- var()Wstawia wartość zmiennej CSS, czyli właściwości niestandardowej zapisanej jako --nazwa. Pozwala też podać wartość zapasową.
- @keyframesDefiniuje kolejne etapy animacji, czyli klatki kluczowe.
- conic-gradient()Tworzy przejście kolorów dookoła punktu, jak wskazówka zegara. Rysuje wykresy kołowe, koła barw i obracające się obwódki.
- transitionSkrót, który sprawia, że zmiany wartości CSS następują płynnie, a nie skokowo.
- animationSkrót ustawiający wszystkie parametry animacji opartej na @keyframes.
Widzisz błąd albo brakuje przykładu? Napisz do nas.