@property: aggiungere superpoteri alle variabili CSS

CSS Houdini è un termine generico che descrive un insieme di API di basso livello che espongono parti del motore di rendering CSS e consentono agli sviluppatori di accedere al modello degli oggetti CSS. Si tratta di un cambiamento enorme per l'ecosistema CSS, in quanto consente agli sviluppatori di indicare al browser come leggere e analizzare il CSS personalizzato senza attendere che i fornitori di browser forniscano il supporto integrato per queste funzionalità. Che emozione!

Una delle aggiunte più interessanti al CSS nell'ambito di Houdini è l'API Properties and Values.

Questa API potenzia le proprietà personalizzate CSS (chiamate anche variabili CSS) dando loro un significato semantico (definito da una sintassi) e persino valori di riserva, consentendo i test CSS.

Scrittura di proprietà personalizzate Houdini

Ecco un esempio di impostazione di una proprietà personalizzata (ad es. una variabile CSS), ma ora con una sintassi (tipo), un valore iniziale (valore predefinito) e un booleano di ereditarietà (eredita il valore dall'elemento principale o meno?). Il modo attuale per farlo è tramite CSS.registerProperty() in JavaScript, ma nei browser supportati puoi utilizzare @property:

File JavaScript separato (Chromium 78)
CSS.registerProperty({
  name: '--colorPrimary',
  syntax: '<color>',
  initialValue: 'magenta',
  inherits: false
});
Incluso nel file CSS (Chromium 85)
@property --colorPrimary {
  syntax: '<color>';
  initial-value: magenta;
  inherits: false;
}

Ora puoi accedere a --colorPrimary come a qualsiasi altra proprietà CSS personalizzata tramite var(--colorPrimary). Tuttavia, la differenza è che --colorPrimary non viene solo letto come stringa. Ha dei dati.

Valori di riserva

Come per qualsiasi altra proprietà personalizzata, puoi recuperare (utilizzando var) o impostare (scrivere/riscrivere) i valori, ma con le proprietà personalizzate di Houdini, se imposti un valore falsey quando lo sostituisci, il motore di rendering CSS invierà il valore iniziale (il valore di riserva) anziché ignorare la riga.

Considera l'esempio riportato di seguito. La variabile --colorPrimary ha un initial-value pari a magenta. Tuttavia, lo sviluppatore ha assegnato il valore non valido "23". Senza @property, il parser CSS ignorerebbe il codice non valido. Ora il parser passa a magenta. Ciò consente di eseguire test e fallback veri all'interno del CSS. Ottimo!

.card {
  background-color: var(--colorPrimary); /* magenta */
}

.highlight-card {
  --colorPrimary: yellow;
  background-color: var(--colorPrimary); /* yellow */
}

.another-card {
  --colorPrimary: 23;
  background-color: var(--colorPrimary); /* magenta */
}

Sintassi

Con la funzionalità di sintassi, ora puoi scrivere CSS semantico specificando un tipo. I tipi attualmente consentiti sono:

  • length
  • number
  • percentage
  • length-percentage
  • color
  • image
  • url
  • integer
  • angle
  • time
  • resolution
  • transform-list
  • transform-function
  • custom-ident (una stringa identificatore personalizzata)

L'impostazione di una sintassi consente al browser di controllare il tipo di proprietà personalizzata. Questo approccio presenta molti vantaggi.

Per illustrare questo punto, ti mostrerò come animare un gradiente. Al momento, non è possibile animare (o interpolare) in modo uniforme tra i valori del gradiente, poiché ogni dichiarazione del gradiente viene analizzata come stringa.

Se utilizzi una proprietà personalizzata con sintassi "numero", il gradiente a sinistra mostra una transizione fluida tra i valori di interruzione. Il gradiente a destra utilizza una proprietà personalizzata predefinita (nessuna sintassi definita) e mostra una transizione brusca.

In questo esempio, la percentuale di interruzione del gradiente viene animata da un valore iniziale del 40% a un valore finale del 100% tramite un'interazione con il passaggio del mouse. Dovresti vedere una transizione graduale del colore del gradiente superiore verso il basso.

Il browser a sinistra supporta l'API Houdini Properties and Values, consentendo una transizione graduale delle interruzioni del gradiente. Il browser a destra no. Il browser non supportato è in grado di comprendere questa modifica solo come una stringa che va dal punto A al punto B. Non è possibile interpolare i valori, pertanto non viene visualizzata la transizione graduale.

Tuttavia, se dichiari il tipo di sintassi quando scrivi le proprietà personalizzate e poi le utilizzi per attivare l'animazione, vedrai la transizione. Puoi creare un'istanza della proprietà personalizzata --gradPoint in questo modo:

@property --gradPoint {
  syntax: '<percentage>';
  inherits: false;
  initial-value: 40%;
}

Quando è il momento di animarlo, puoi aggiornare il valore da 40% iniziale a 100%:

.post:hover,
.post:focus {
  --gradPoint: 100%;
}

In questo modo verrà attivata la transizione graduale del gradiente.

Bordi con sfumatura con transizione graduale. Guarda la demo su Glitch

Conclusione

La regola @property rende un'entusiasmante tecnologia ancora più accessibile consentendoti di scrivere CSS semanticamente significativi all'interno del CSS stesso. Per saperne di più su CSS Houdini e sull'API Properties and Values, consulta queste risorse:

Foto di Cristian Escobar su Unsplash.