@property: aggiungere superpoteri alle variabili CSS

CSS Houdini è un termine generico che copre un insieme di API di basso livello che espongono parti del motore di rendering CSS e forniscono agli sviluppatori l'accesso al modello di oggetti CSS. Si tratta di un'enorme variazione 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 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à CSS personalizzate (chiamate comunemente anche variabili CSS) assegnando 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. Contiene dati.

Valori di riserva

Come con 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 valore initial-value pari a magenta. Tuttavia, lo sviluppatore ha assegnato il valore non valido "23". Senza @property, l'analizzatore sintattico CSS ignorerebbe il codice non valido. Ora, l'interprete esegue il fallback su magenta. In questo modo è possibile eseguire test e utilizzare valori di riserva 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 includono:

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

L'impostazione di una sintassi consente al browser di eseguire il controllo del tipo delle proprietà personalizzate. Questo approccio presenta numerosi 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.

Utilizzando una proprietà personalizzata con una sintassi "number", il gradiente a sinistra mostra una transizione graduale 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 che non supporta questa funzionalità è in grado di comprendere questa modifica solo come stringa che va dal punto A al punto B. Non è possibile eseguire l'interpolazione dei 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 eseguire l'inizializzazione della proprietà personalizzata --gradPoint nel seguente modo:

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

Quando è il momento di animarlo, puoi aggiornare il valore dall'iniziale 40% 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 CodePen

Conclusione

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

Foto di Cristian Escobar su Unsplash.