Utforsk kraften i CSS @property for å definere egendefinerte property-typer, som muliggjør avansert styling, animasjoner og sømløse overganger. Denne guiden dekker syntaks, bruk og praktiske eksempler for moderne webutvikling.
Lås opp CSS-magi: En dypdykk i @property og definisjoner av egendefinerte property-typer
CSS egendefinerte properties (også kjent som CSS-variabler) har revolusjonert måten vi skriver og vedlikeholder CSS på. De tilbyr gjenbrukbarhet, fleksibilitet og vedlikeholdbarhet, noe som gjør våre stilark mer dynamiske og håndterbare. Men inntil nylig manglet egendefinerte properties evnen til å definere sine forventede datatyper, noe som begrenset deres potensial for avansert styling og animasjoner. Gå inn i @property-regelen – en game-changer som lar oss eksplisitt definere type, syntaks og startverdi for våre egendefinerte properties.
Hva er @property-regelen?
@property-regelen er en del av CSS Houdini-familien av APIer, som har som mål å eksponere det indre arbeidet i CSS-motoren for utviklere. Spesifikt er @property en del av Custom Properties and Values API. Den lar deg registrere en egendefinert property med nettleseren, og spesifisere dens:
- name: Navnet på den egendefinerte propertyen (f.eks.
--min-farge). - syntax: Den forventede datatypen for propertyen (f.eks.
<color>,<number>,<length>). - inherits: Om propertyen skal arve verdien fra sitt overordnede element (
trueellerfalse). - initial-value: Standardverdien for propertyen hvis ingen annen verdi er spesifisert.
Ved å definere disse egenskapene får du større kontroll over hvordan egendefinerte properties brukes og hvordan de oppfører seg, spesielt i animasjoner og overganger.
Hvorfor bruke @property? Fordelene
Å bruke @property gir flere betydelige fordeler:
1. Typesikkerhet og validering
Uten @property behandler CSS alle egendefinerte properties som strenger. Dette kan føre til uventet oppførsel når du prøver å bruke dem i beregninger eller animasjoner som krever spesifikke datatyper. For eksempel, hvis du har tenkt at en egendefinert property skal representere et tall, men ved et uhell tilordner den en strengverdi, kan animasjonene dine bryte eller gi feil resultater.
@property løser dette ved å la deg spesifisere den forventede syntaksen (datatypen) for den egendefinerte propertyen. Nettleseren vil deretter validere den tildelte verdien mot denne syntaksen, og sikre at den samsvarer med den forventede typen. Hvis verdien ikke samsvarer med syntaksen, vil nettleseren bruke startverdien (hvis oppgitt) eller behandle propertyen som ugyldig.
2. Sømløse animasjoner og overganger
Den virkelige kraften til @property skinner når det gjelder animasjoner og overganger. Uten den kan det være vanskelig å animere egendefinerte properties fordi nettleseren ikke vet hvordan den skal interpolere mellom forskjellige verdier av en generisk streng. Du må kanskje ty til JavaScript-hack eller bruke begrensede CSS-funksjoner for å oppnå ønsket effekt.
Ved å definere syntaksen til en egendefinert property, forteller du nettleseren hvordan den skal interpolere mellom verdiene under animasjoner og overganger. For eksempel, hvis du definerer en egendefinert property med <color>-syntaksen, vet nettleseren at den skal interpolere mellom fargene ved hjelp av en jevn fargegradient. På samme måte, hvis du definerer en property med <number>-syntaksen, vet nettleseren at den skal interpolere mellom tallene ved hjelp av en lineær progresjon.
3. Forbedret kodelesbarhet og vedlikeholdbarhet
@property forbedrer lesbarheten og vedlikeholdbarheten til CSS-koden din ved å gjøre det klart hvilken datatype en egendefinert property er ment å representere. Dette hjelper andre utviklere (og ditt fremtidige jeg) å forstå formålet med propertyen og hvordan den skal brukes.
Videre, ved eksplisitt å definere startverdien til en egendefinert property, gir du en klar fallback-verdi som vil bli brukt hvis ingen annen verdi er spesifisert. Dette kan forhindre uventede visuelle feil og gjøre koden din mer robust.
4. Forbedret ytelse
I noen tilfeller kan bruk av @property forbedre ytelsen til CSS-koden din. Ved å gi nettleseren mer informasjon om de forventede datatypene til dine egendefinerte properties, lar du den optimalisere gjengivelsesprosessen. Dette kan føre til raskere animasjoner og overganger, spesielt på komplekse layouter.
Syntaksen til @property
@property-regelen er definert ved hjelp av følgende syntaks:
@property --property-name {
syntax: <type>;
inherits: true | false;
initial-value: <value>;
}
La oss bryte ned hver av disse komponentene:
--property-name: Dette er navnet på den egendefinerte propertyen du definerer. Den må starte med to bindestreker (--) og kan inneholde alle gyldige CSS-identifikator-tegn. For eksempel:--primary-color,--font-size,--spacing-unit.syntax: Dette spesifiserer den forventede datatypen til den egendefinerte propertyen. Den er definert ved hjelp av en CSS-verdi-type deskriptor. Noen vanlige syntaksverdier inkluderer:<color>: Representerer en fargeverdi (f.eks.#ffffff,rgb(255, 255, 255),hsl(0, 0%, 100%),white).<number>: Representerer en numerisk verdi (f.eks.1,3.14,-42).<length>: Representerer en lengdeverdi (f.eks.10px,2em,50vh,1rem).<percentage>: Representerer en prosentverdi (f.eks.50%,100%,25.5%).<string>: Representerer en strengverdi (f.eks."Hello","World").<image>: Representerer en bildeverdi (f.eks.url("image.jpg"),linear-gradient(...)).<angle>: Representerer en vinkelverdi (f.eks.45deg,0.5rad,1turn).*: Representerer en hvilken som helst gyldig CSS-verdi. Bruk med forsiktighet, da det opphever formålet med typekontroll.- Egendefinert syntaks: Lar deg definere komplekse syntakser ved hjelp av regulære uttrykk-lignende mønstre.
inherits: Denne boolske verdien bestemmer om den egendefinerte propertyen skal arve verdien fra sitt overordnede element. Hvis satt tiltrue, vil propertyen arve. Hvis satt tilfalse, vil propertyen ikke arve og vil bruke startverdien hvis ikke eksplisitt definert på elementet. Standardverdien erfalse.initial-value: Dette spesifiserer standardverdien for den egendefinerte propertyen. Hvis propertyen ikke er eksplisitt satt på et element, vil den bruke denne verdien. Startverdien må være en gyldig verdi i henhold til den spesifiserte syntaksen. Hvis ingen startverdi er oppgitt og ingen annen verdi er satt, vil propertyen bli behandlet som om den har sin unset-verdi.
Praktiske eksempler på @property i aksjon
La oss se på noen praktiske eksempler på hvordan du kan bruke @property i CSS-koden din.
Eksempel 1: Animere en farge
I dette eksemplet skal vi lage en egendefinert property kalt --background-color og animere den ved hjelp av CSS-overganger. Vi definerer syntaksen som <color> for å sikre at nettleseren interpolerer mellom fargene riktig.
@property --background-color {
syntax: <color>;
inherits: false;
initial-value: #ffffff; /* Hvit */
}
.box {
width: 200px;
height: 200px;
background-color: var(--background-color);
transition: --background-color 0.5s ease-in-out;
}
.box:hover {
--background-color: #007bff; /* Blå */
}
I denne koden:
- Vi definerer en egendefinert property
--background-colormed syntaksen<color>, setterinheritstilfalse, og setterinitial-valuetil hvit (#ffffff). - Vi bruker denne propertyen på
background-colortil et.box-element ved hjelp avvar(--background-color). - Vi legger til en overgang til
--background-color-propertyen slik at den animeres jevnt når verdien endres. - Vi endrer verdien av
--background-colortil blå (#007bff) ved hover, og skaper en jevn fargeovergangseffekt.
Eksempel 2: Animere et tall
I dette eksemplet skal vi lage en egendefinert property kalt --blur-radius og animere den ved hjelp av CSS-overganger. Vi definerer syntaksen som <length> for å sikre at nettleseren interpolerer mellom lengdeverdiene riktig. Dette eksemplet viser også et populært brukstilfelle av å bruke lengder: pikselverdier. Dette kan enkelt oversettes til andre enhetstyper også. Det er også viktig å merke seg at å sette startverdien til `0px` er avgjørende, da nettleseren trenger en baseenhet for å utføre overganger riktig.
@property --blur-radius {
syntax: <length>;
inherits: false;
initial-value: 0px;
}
.image {
width: 300px;
height: 200px;
background-image: url("image.jpg");
filter: blur(var(--blur-radius));
transition: --blur-radius 0.3s ease-in-out;
}
.image:hover {
--blur-radius: 5px;
}
I denne koden:
- Vi definerer en egendefinert property
--blur-radiusmed syntaksen<length>, setterinheritstilfalse, og setterinitial-valuetil0px. - Vi bruker denne propertyen på
filter: blur()-funksjonen til et.image-element ved hjelp avvar(--blur-radius). - Vi legger til en overgang til
--blur-radius-propertyen slik at den animeres jevnt når verdien endres. - Vi endrer verdien av
--blur-radiustil5pxved hover, og skaper en jevn blur-effekt.
Eksempel 3: Opprette et tema-UI med arvede properties
I dette eksemplet skal vi lage et enkelt tema-UI ved hjelp av arvede egendefinerte properties. Vi definerer en egendefinert property kalt --theme-color og setter den på :root-elementet. Dette vil tillate alle barnelementer å arve temafargen.
@property --theme-color {
syntax: <color>;
inherits: true;
initial-value: #4caf50; /* Grønn */
}
:root {
--theme-color: #4caf50;
}
.button {
background-color: var(--theme-color);
color: white;
padding: 10px 20px;
border: none;
cursor: pointer;
}
.button:hover {
--theme-color: #388e3c; /* Mørkere grønn */
}
I denne koden:
- Vi definerer en egendefinert property
--theme-colormed syntaksen<color>, setterinheritstiltrue, og setterinitial-valuetil grønn (#4caf50). - Vi setter verdien av
--theme-colorpå:root-elementet, og gjør den tilgjengelig for alle elementer i dokumentet. - Vi bruker denne propertyen til å sette
background-colortil et.button-element. - Vi endrer verdien av
--theme-colortil en mørkere grønn (#388e3c) ved hover, og demonstrerer hvordan arvede properties enkelt kan oppdateres for å endre temaet for UI-et.
Eksempel 4: Definere en egendefinert syntaks
syntax-propertyen kan også akseptere en streng for å definere et mer spesifikt mønster, som er spesielt nyttig for å validere mer komplekse verdier. Syntaksen bruker et regulært uttrykk-lignende system, dokumentert på MDN (Mozilla Developer Network). Dette eksemplet illustrerer hvordan du definerer og bruker en egendefinert syntaks for en bakgrunnsposisjon som aksepterer både `top`, `bottom`, `left` og `right` nøkkelordalternativer som gyldige verdier.
@property --background-position {
syntax: "[ top | bottom | left | right ]{1,2}";
inherits: false;
initial-value: top left;
}
.container {
width: 300px;
height: 300px;
background-image: url('image.jpg');
background-position: var(--background-position);
}
/* Valid positions */
.container.top-right {
--background-position: top right;
}
.container.bottom-left {
--background-position: bottom left;
}
/* Invalid position (will fallback to initial-value) */
.container.invalid {
--background-position: center;
}
Her er `syntax` spesifisert ved hjelp av en strengrepresentasjon av de gyldige nøkkelordene. `[ ]`-notasjonen definerer et sett med alternativer, `|`-symbolet skiller dem, og `{1,2}` begrenser antall tillatte verdier til ett eller to nøkkelord. Hvis en ugyldig verdi som `center` brukes, vil nettleseren gå tilbake til `initial-value` av `top left`.
Nettleserstøtte
Nettleserstøtte for @property er generelt god i moderne nettlesere, inkludert:
- Chrome (versjon 64 og nyere)
- Edge (versjon 79 og nyere - basert på Chromium)
- Firefox (versjon 72 og nyere)
- Safari (versjon 14.1 og nyere)
Det er imidlertid alltid en god idé å sjekke de nyeste nettleserkompatibilitetstabellene på nettsteder som Can I use... for å sikre at funksjonene du bruker støttes i nettleserne brukerne dine sannsynligvis vil bruke.
For eldre nettlesere som ikke støtter @property, vil nettleseren ignorere @property-regelen og bare behandle den egendefinerte propertyen som en vanlig CSS-variabel. Dette betyr at animasjoner og overganger kanskje ikke fungerer som forventet, men koden vil fortsatt være funksjonell.
Beste praksis for bruk av @property
Her er noen beste fremgangsmåter å huske på når du bruker @property:
- Definer alltid syntaksen: Sørg for å alltid definere
syntaxfor dine egendefinerte properties for å sikre typesikkerhet og muliggjøre sømløse animasjoner og overganger. - Sett en startverdi: Gi en
initial-valuefor å gi en standardverdi og forhindre uventede visuelle feil. - Bruk beskrivende navn: Velg beskrivende navn for dine egendefinerte properties som tydelig indikerer deres formål og datatype. Bruk for eksempel
--button-background-colori stedet for--color. - Vurder arv: Bestem om dine egendefinerte properties skal arve fra sine overordnede elementer eller ikke. Bruk
inherits: truefor properties som skal deles på tvers av UI-et, for eksempel temafarger eller skriftstørrelser. - Test grundig: Test koden din i forskjellige nettlesere for å sikre at den fungerer som forventet. Bruk fallback-mekanismer for eldre nettlesere som ikke støtter
@property. - Dokumenter dine egendefinerte properties: Legg til kommentarer i CSS-koden din for å forklare formålet og bruken av dine egendefinerte properties. Dette vil gjøre det lettere for andre utviklere (og ditt fremtidige jeg) å forstå koden din. Verktøy som Stylelint kan også konfigureres til å håndheve disse beste fremgangsmåtene.
@property og CSS Houdini
Som nevnt tidligere, er @property en del av CSS Houdini-familien av APIer. CSS Houdini er en samling lavnivå-APIer som eksponerer det indre arbeidet i CSS-motoren for utviklere, slik at de kan utvide CSS med egendefinerte funksjoner og atferd.
Andre Houdini-APIer inkluderer:
- Paint API: Lar deg definere egendefinerte bakgrunnsbilder, kanter og masker ved hjelp av JavaScript.
- Animation Worklet API: Lar deg lage høyytelsesanimasjoner ved hjelp av JavaScript.
- Layout API: Lar deg definere egendefinerte layoutalgoritmer for elementer, for eksempel rutenettsystemer eller murverkslayouter.
- Parser API: Lar deg parse og manipulere CSS-kode ved hjelp av JavaScript.
Ved å kombinere @property med andre Houdini-APIer, kan du lage virkelig kraftige og tilpassbare CSS-løsninger.
Konklusjon
@property-regelen er et kraftig tillegg til CSS som lar deg definere egendefinerte property-typer, og muliggjør avansert styling, animasjoner og overganger. Ved å bruke @property kan du forbedre typesikkerheten, lesbarheten, vedlikeholdbarheten og ytelsen til CSS-koden din.
Selv om nettleserstøtten generelt er god, er det viktig å teste koden din i forskjellige nettlesere og gi fallback-mekanismer for eldre nettlesere som ikke støtter @property.
Ved å følge de beste fremgangsmåtene som er skissert i denne artikkelen, kan du utnytte kraften i @property til å skape virkelig fantastiske nettopplevelser.