W starożytnym Egipcie kapłani posiadali tajemną wiedzę o magicznych formułach, które nadawały przedmiotom niezwykłe właściwości. Każda formuła miała ściśle określony typ - mogła działać na kolory, liczby lub wymiary, a jej nieprawidłowe użycie powodowało, że magia nie zadziałała. Reguła
@property w CSS działa na podobnej zasadzie - pozwala formalnie zarejestrować własną właściwość CSS, nadając jej typ, wartość początkową i zasady dziedziczenia. Dzięki temu przeglądarka "rozumie" znaczenie twojej zmiennej i potrafi ją animować.Zwykłe zmienne CSS (
--nazwa: wartość) są traktowane przez przeglądarkę jako nieprzetworzony tekst. Przeglądarka nie wie, czy --my-color to kolor, liczba czy coś innego. Konsekwencja jest taka, że nie można ich płynnie animować:1:root {
2 --gradient-start: gold;
3 --gradient-end: purple;
4}
5
6.box {
7 background: linear-gradient(var(--gradient-start), var(--gradient-end));
8 transition: --gradient-start 1s, --gradient-end 1s;
9}
10
11/* To NIE zadziała! Przeglądarka nie wie, że to kolory */
12.box:hover {
13 --gradient-start: crimson;
14 --gradient-end: navy;
15}Przeglądarka widzi zmianę z jednego ciągu tekstowego na drugi i nie potrafi obliczyć wartości pośrednich. Zamiast płynnego przejścia, kolor przeskoczy natychmiast.
Reguła
@property rejestruje właściwość z pełną definicją typu:1@property --gradient-start {
2 syntax: "<color>";
3 inherits: false;
4 initial-value: gold;
5}
6
7@property --gradient-end {
8 syntax: "<color>";
9 inherits: false;
10 initial-value: purple;
11}Teraz przeglądarka wie, że
--gradient-start i --gradient-end to kolory. Potrafi obliczyć wartości pośrednie i wykonać płynną animację!Każda deklaracja
@property wymaga trzech obowiązkowych deskryptorów:1@property --nazwa-wlasciwosci {
2 syntax: "<typ>"; /* Jakiego typu jest wartość */
3 inherits: true | false; /* Czy potomkowie dziedzicza */
4 initial-value: wartość; /* Domyślna wartość */
5}| Syntax | Opis | Przykład | |--------|------|---------| |
"<color>" | Dowolny kolor CSS | gold, #d4af37, rgb(212,175,55) |
| "<length>" | Długość z jednostką | 10px, 2rem, 50vh |
| "<number>" | Liczba bez jednostki | 0, 1.5, 360 |
| "<percentage>" | Procent | 50%, 100% |
| "<angle>" | Kąt | 45deg, 0.5turn |
| "<integer>" | Liczba całkowita | 0, 3, 100 |
| "<length-percentage>" | Długość lub procent | 10px, 50% |
| "<custom-ident>" | Niestandardowy identyfikator | ease-in, forwards |true - potomkowie dziedziczą wartość (tak jak zwykłe Custom Properties)false - potomkowie NIE dziedziczą; każdy element używa initial-valueTo najbardziej spektakularne zastosowanie
@property - animowanie właściwości, które normalnie nie mogą być animowane:1@property --hue {
2 syntax: "<number>";
3 inherits: false;
4 initial-value: 45;
5}
6
7.egyptian-glow {
8 --hue: 45;
9 background: linear-gradient(
10 135deg,
11 hsl(var(--hue), 80%, 50%),
12 hsl(calc(var(--hue) + 60), 70%, 40%)
13 );
14 transition: --hue 0.8s ease;
15}
16
17.egyptian-glow:hover {
18 --hue: 200;
19}Dzięki
@property, przeglądarka wie, że --hue to liczba i potrafi płynnie przejść z 45 do 200, animując cały gradient!1@property --angle {
2 syntax: "<angle>";
3 inherits: false;
4 initial-value: 0deg;
5}
6
7.rotating-border {
8 --angle: 0deg;
9 border: 3px solid transparent;
10 border-image: linear-gradient(
11 var(--angle),
12 #d4af37,
13 #1e3a5f,
14 #d4af37
15 ) 1;
16 animation: rotate-gradient 3s linear infinite;
17}
18
19@keyframes rotate-gradient {
20 to {
21 --angle: 360deg;
22 }
23}1@property --bg-color {
2 syntax: "<color>";
3 inherits: false;
4 initial-value: #d4af37;
5}
6
7.pharaoh-card {
8 background: var(--bg-color);
9 transition: --bg-color 0.5s ease;
10}
11
12.pharaoh-card:hover {
13 --bg-color: #1e3a5f;
14}1@property --progress {
2 syntax: "<percentage>";
3 inherits: false;
4 initial-value: 0%;
5}
6
7.pyramid-progress {
8 background: linear-gradient(
9 to right,
10 #d4af37 var(--progress),
11 #e8d7b0 var(--progress)
12 );
13 transition: --progress 1s ease;
14}
15
16.pyramid-progress.complete {
17 --progress: 100%;
18}1@property --color-a {
2 syntax: "<color>";
3 inherits: false;
4 initial-value: #d4af37;
5}
6
7@property --color-b {
8 syntax: "<color>";
9 inherits: false;
10 initial-value: #8b6914;
11}
12
13.magic-gradient {
14 background: linear-gradient(135deg, var(--color-a), var(--color-b));
15 transition: --color-a 0.6s ease, --color-b 0.6s ease;
16}
17
18.magic-gradient:hover {
19 --color-a: #1e3a5f;
20 --color-b: #30d5c8;
21}| Cecha | Custom Properties | @property | |-------|------------------|-----------| | Deklaracja |
--name: value | @property --name { ... } |
| Typ | Brak (tekst) | Określony (color, length...) |
| Animacja | Niemożliwa | Możliwa! |
| Dziedziczenie | Zawsze | Konfigurowalne |
| Wartość domyślna | Przez var(--name, fallback) | Przez initial-value |
| Walidacja | Brak | Przeglądarka waliduje typ |@property jest wspierane od Chrome 85 (2020), Edge 85, Safari 15.4 (2022) i Firefox 128 (2024). Możesz bezpiecznie używać go w nowoczesnych projektach. Dla starszych przeglądarek, właściwość po prostu zachowa się jak zwykła Custom Property - bez animacji, ale z poprawną wartością.1/* Fallback - zawsze dziala */
2.element {
3 --my-color: gold;
4 background: var(--my-color);
5}
6
7/* @property - dodaje możliwość animacji */
8@property --my-color {
9 syntax: "<color>";
10 inherits: false;
11 initial-value: gold;
12}@property to jak magiczna formuła egipskich kapłanów - nadaje twoim zmiennym CSS prawdziwą moc, pozwalając przeglądarce rozumieć ich znaczenie i tworzyć płynne, spektakularne animacje tam, gdzie wcześniej było to niemożliwe.