Stato del CSS 2022

Funzionalità di stile web di oggi e di domani, come mostrato a Google IO 2022, oltre ad alcune extra.

Il 2022 sarà uno dei migliori anni per CSS, sia per quanto riguarda le funzionalità che per i rilasci di funzionalità dei browser, con l'obiettivo di implementare 14 funzionalità in collaborazione.

Panoramica

Questo post è l'articolo del discorso tenuto a Google IO 2022. Non deve essere una guida approfondita per ogni funzionalità, piuttosto un'introduzione e una breve panoramica per stuzzicare il tuo interesse, fornendone l'ampiezza anziché la profondità. Se il tuo interesse è suscitato, controlla la fine di una sezione con link a risorse che rimandano a ulteriori informazioni.

Sommario

Utilizza l'elenco di seguito per passare agli argomenti di interesse:

Compatibilità del browser

Uno dei motivi principali per cui molte funzionalità CSS sono impostate per essere rilasciate in modo collaborativo è dovuto all'impegno di Interop 2022. Prima di esaminare le iniziative di interoperabilità, è importante esaminare le iniziative di Compat 2021.

Compatto 2021

Gli obiettivi per il 2021, basati sul feedback degli sviluppatori tramite i sondaggi, erano quelli di stabilizzare le funzionalità attuali, migliorare la suite di test e aumentare il punteggio di superamento dei browser per cinque funzionalità:

  1. Posizionamento sticky
  2. Dimensioni di aspect-ratio
  3. Layout flex
  4. Layout grid
  5. Posizionamento e animazione transform

I punteggi dei test sono stati alzati su tutta la linea, dimostrando stabilità e affidabilità migliorate. Grandi congratulazioni ai team.

Interoperabilità 2022

Quest'anno i browser si sono riuniti per discutere delle funzionalità e delle priorità su cui intendevano lavorare, unendo le loro iniziative. Ha pianificato di fornire le seguenti funzionalità web agli sviluppatori:

  1. @layer
  2. Spazi colore e funzioni
  3. Contenimento
  4. <dialog>
  5. Compatibilità dei moduli
  6. Scorrimento
  7. Griglia
  8. Tipografia
  9. Unità area visibile
  10. Compatibilità web

Si tratta di un elenco entusiasmante e ambizioso che non vedo l'ora di scoprire.

Novità del 2022

Non sorprende che lo stato di CSS 2022 sia notevolmente influenzato dal lavoro di Interoperabilità 2022.

Livelli a cascata

Supporto dei browser

  • 99
  • 99
  • 97
  • 15,4

Fonte

Prima del giorno @layer, l'ordine rilevato dei fogli di stile caricati era molto importante, poiché gli stili caricati per ultimi possono sovrascrivere quelli caricati in precedenza. Ciò ha portato alla gestione meticolosa dei fogli di stile delle voci, in cui gli sviluppatori dovevano caricare prima gli stili meno importanti e quelli più importanti in seguito. Esistono intere metodologie per aiutare gli sviluppatori a gestire questa importanza, ad esempio ITCSS.

Con @layer, il file di input può predefinire i livelli e il loro ordine in anticipo. Quindi, man mano che gli stili vengono caricati, caricati o definiti, possono essere inseriti all'interno di un livello, consentendo di preservare l'importanza della sostituzione dello stile, ma senza l'orchestrazione del caricamento meticolosamente gestita.

Il video mostra in che modo i livelli definiti a cascata consentono un processo di creazione e caricamento più liberato e a stile libero, mantenendo al contempo la cascata come necessario.

Chrome DevTools è utile per visualizzare gli stili da cui provengono i livelli:

Screenshot della barra laterale Stili di Chrome DevTools, che evidenzia come vengono visualizzati gli stili all&#39;interno di nuovi gruppi di livelli.

Risorse

Griglia

Supporto dei browser

  • 117
  • 117
  • 71
  • 16

Fonte

Prima del giorno subgrid, una griglia all'interno di un'altra griglia non poteva allinearsi alle celle o alle linee della griglia principali. Ogni layout a griglia era unico. Molti designer posizionano un'unica griglia sopra l'intero design e allineano costantemente gli elementi al suo interno, cosa che non è possibile fare in CSS.

Dopo subgrid, un elemento secondario di una griglia può adottare le colonne o le righe principali come proprie e allinearsi a loro o ai file secondari.

Nella demo seguente, l'elemento body crea una griglia classica di tre colonne: la colonna centrale è denominata main e le colonne sinistra e destra assegnano un nome alle linee fullbleed. A questo punto, ogni elemento nel corpo, <nav> e <main>, adotta le righe con nome del corpo impostando grid-template-columns: subgrid.

​​body {
  display: grid;
  grid-template-columns:
    [fullbleed-start]
    auto [main-start] min(90%, 60ch) [main-end] auto
    [fullbleed-end]
  ;
}

body > * {
  display: grid;
  grid-template-columns: subgrid;
}

Infine, gli elementi secondari di <nav> o <main> possono allinearsi o ridimensionarsi utilizzando le righe e le colonne fullbleed e main.

.main-content {
  grid-column: main;
}

.fullbleed {
  grid-column: fullbleed;
}

DevTools può aiutarti a visualizzare le linee e le sottogriglie (al momento solo Firefox). Nell'immagine seguente, la griglia principale e le reti secondarie sono state sovrapposte. Ora ricorda il layout che i designer stavano pensando.

Screenshot di una demo di una griglia, che utilizza gli strumenti di overlay griglia di Chrome DevTools per mostrare le righe definite da CSS.

Nel riquadro Elementi di DevTools puoi vedere quali elementi sono griglie e sottogriglie, il che è molto utile per il debug o la convalida del layout.

Screenshot del riquadro Elementi di Chrome DevTools che etichetta gli elementi con layout a griglia o a griglia.
Screenshot di Firefox DevTools

Risorse

Query container

Supporto dei browser

  • 105
  • 105
  • 110
  • 16

Fonte

Prima del giorno @container, gli elementi di una pagina web potevano rispondere solo alle dimensioni dell'intera area visibile. È un'ottima soluzione per i layout macro, ma per i layout micro, dove il container esterno non corrisponde all'intera area visibile, è impossibile che il layout si adatti di conseguenza.

Dopo @container, gli elementi possono rispondere a una dimensione o a uno stile del contenitore principale. L'unico avvertimento è che i container devono autodichiararsi come possibili target delle query, il che è un piccolo requisito per un grande vantaggio.

/* establish a container */
.day {
  container-type: inline-size;
  container-name: calendar-day;
}

Questi stili consentono di eseguire query nelle colonne Lun, Mar, Mer, Gio e Ven nel seguente video per eseguire query da parte degli elementi evento.

Demo di Una Kravets

Ecco il CSS per eseguire query al contenitore calendar-day in merito alle sue dimensioni, quindi regolare un layout e le dimensioni dei caratteri:

@container calendar-day (max-width: 200px) {
  .date {
    display: block;
  }

  .date-num {
    font-size: 2.5rem;
    display: block;
  }
}

Ecco un altro esempio: un componente libro si adatta automaticamente allo spazio disponibile nella colonna in cui viene trascinato:

Demo di Max Böck

Una ha ragione nel valutare la situazione come il nuovo adattabile. È necessario prendere molte decisioni di progettazione entusiasmanti e significative quando si utilizza @container.

Risorse

accent-color

Supporto dei browser

  • 93
  • 93
  • 92
  • 15,4

Fonte

Prima del giorno accent-color, quando volevi un modulo con colori corrispondenti ai brand, potresti ritrovarti con librerie o soluzioni CSS complesse diventate difficili da gestire con il passare del tempo. Nonostante le fornissero tutte le opzioni e, speriamo, includessero l'accessibilità, la scelta di utilizzare i componenti integrati o adottarne uno proprio diventa noiosa.

Dopo il giorno accent-color, una riga di CSS applica un colore del brand ai componenti integrati. Oltre alla tinta, il browser sceglie in modo intelligente i colori contrastanti appropriati per le parti accessorie del componente e si adatta agli schemi di colori del sistema (chiaro o scuro).

/* tint everything */
:root {
  accent-color: hotpink;
}

/* tint one element */
progress {
  accent-color: indigo;
}

Elementi HTML con accenti chiari e scuri affiancati per il confronto.

Per scoprire di più su accent-color, consulta il mio post su web.dev, dove analizzo molti altri aspetti di questa utile proprietà CSS.

Risorse

Livello di colore 4 e 5

Negli ultimi decenni il web è stato dominato da sRGB, ma in un mondo digitale in espansione di display ad alta definizione e dispositivi mobili dotati di schermi OLED o QLED, sRGB non è sufficiente. Inoltre, sono previste pagine dinamiche che si adattano alle preferenze degli utenti e la gestione dei colori è sempre più preoccupata da progettisti, sistemi di progettazione e gestori del codice.

Tuttavia, non nel 2022. CSS offre una serie di nuove funzioni colore e nuovi spazi: - Colori che si adattano alle funzionalità cromatiche HD dei display. - Spazi colore che corrispondono a un intent, come l'uniformità percettiva. - Spazi colore per gradienti che cambiano drasticamente i risultati dell'interpolazione. - Funzioni per il colore che ti aiutano a combinare e contrastare i colori e a scegliere lo spazio in cui lavorare.

Prima di tutte queste caratteristiche dei colori, i sistemi di progettazione dovevano precalcolare i colori contrastanti adeguati e garantire una tavolozza di colori appropriati, il tutto mentre i preprocessori o JavaScript si occupavano del lavoro pesante.

Dopo tutte queste caratteristiche relative ai colori, il browser e il CSS possono fare tutto il lavoro, in modo dinamico e giusto in tempo. Invece di inviare molti kB di CSS e JavaScript agli utenti per attivare i colori dei temi e della visualizzazione dei dati, CSS può occuparsi dell'orchestrazione e dei calcoli. Inoltre, CSS è più adatto a verificare l'assistenza prima dell'utilizzo o a gestire agevolmente i fallback.

@media (dynamic-range: high) {
  .neon-pink {
    --neon-glow: color(display-p3 1 0 1);
  }
}

@supports (color: lab(0% 0 0)) {
  .neon-pink {
    --neon-glow: lab(150% 160 0);
  }
}

hwb()

Supporto dei browser

  • 101
  • 101
  • 96
  • 15

Fonte

HWB sta per tonalità, bianco e nero. Si presenta come un modo semplice per articolare i colori, in quanto è solo una tonalità e una quantità di bianco o nero che illuminano o scuriscono. Gli artisti che mescolano i colori con il bianco o il nero potrebbero scoprire apprezzare l'aggiunta di questa sintassi.

L'uso di questa funzione colore consente di ottenere i colori dello spazio colore sRGB, gli stessi di HSL e RGB. In termini di novità per il 2022, questo non dà nuovi colori, ma potrebbe semplificare alcune attività per chi ama la sintassi e il modello mentale.

Risorse

Spazi colore

Il modo in cui vengono rappresentati i colori avviene tramite uno spazio colore. Ogni spazio colore offre varie funzionalità e compromessi per lavorare con i colori. Alcuni possono combinare tutti i colori vivaci insieme; altri li allineano per primi in base alla loro leggerezza.

Per il 2022 il CSS offrirà 10 nuovi spazi colore, ognuno con funzionalità uniche per aiutare designer e sviluppatori a visualizzare, scegliere e mischiare i colori. In precedenza, sRGB era l'unica opzione per lavorare con i colori, ma ora CSS sblocca un nuovo potenziale e un nuovo spazio colore predefinito, LCH.

color-mix()

Supporto dei browser

  • 111
  • 111
  • 113
  • 16.2

Fonte

Prima del giorno color-mix(), sviluppatori e progettisti avevano bisogno di preprocessori come Sass per mescolare i colori prima che il browser li vedesse. Inoltre, la maggior parte delle funzioni di combinazione dei colori non offriva la possibilità di specificare lo spazio colore in cui eseguire la combinazione, il che a volte generava risultati confusi.

Dopo il giorno color-mix(), sviluppatori e designer potranno combinare colori nel browser insieme a tutti gli altri stili, senza eseguire processi di compilazione o includere JavaScript. Inoltre, possono specificare lo spazio colore in cui eseguire la combinazione oppure utilizzare lo spazio colore di combinazione predefinito di LCH.

Spesso viene utilizzato un colore del brand come base e ne vengono create varianti, ad esempio colori più chiari o più scuri per gli stili al passaggio del mouse. Ecco come si presenta con color-mix():

.color-mix-example {
  --brand: #0af;

  --darker: color-mix(var(--brand) 25%, black);
  --lighter: color-mix(var(--brand) 25%, white);
}

and if you wanted to mix those colors in a different color space, like srgb, change it:

.color-mix-example {
  --brand: #0af;

  --darker: color-mix(in srgb, var(--brand) 25%, black);
  --lighter: color-mix(in srgb, var(--brand) 25%, white);
}

Segue una demo sulla tematizzazione con color-mix(). Prova a cambiare il colore del brand e guarda l'aggiornamento del tema:

Divertiti a mescolare i colori in vari spazi cromatici nei tuoi fogli di stile nel 2022.

Risorse

color-contrast()

Supporto dei browser

  • x
  • x
  • x

Fonte

Prima del giorno color-contrast(), gli autori dei fogli di stile dovevano conoscere in anticipo i colori accessibili. Spesso una tavolozza mostrava testo in bianco o nero su un campione di colore per indicare a un utente del sistema di colori quale colore del testo sarebbe necessario per creare un contrasto adeguato con il campione.

Screenshot di 3 tavolozze dei materiali, con 14 colori e i rispettivi colori di contrasto bianco o nero per il testo.
Esempio dalle tavolozze dei colori di Material Design 2014

Dopo il giorno color-contrast(), gli autori dei fogli di stile possono trasferire completamente l'attività al browser. Non solo puoi utilizzare il browser per scegliere automaticamente un colore bianco o nero, ma puoi anche fornire un elenco di colori adatti al sistema di progettazione e scegliere il primo per trasmettere il rapporto di contrasto desiderato.

Ecco uno screenshot di una demo del set di tavolozze dei colori HWB in cui i colori del testo vengono scelti automaticamente dal browser in base al colore campione:

Screenshot della demo HWB in cui ogni tavolozza ha una diversa combinazione di testo chiaro o scuro, come stabilito dal browser.
Prova la demo

L'aspetto di base della sintassi è il seguente, dove il grigio viene passato alla funzione e il browser determina se il bianco o il nero hanno il contrasto maggiore:

color: color-contrast(gray);

La funzione può anche essere personalizzata con un elenco di colori, da cui verrà selezionato il colore con il maggiore contrasto tra quelli selezionati:

color: color-contrast(gray vs indigo, rebeccapurple, hotpink);

Infine, nel caso in cui sia preferibile non scegliere il colore con il più alto contrasto dall'elenco, è possibile fornire un rapporto di contrasto target e scegliere il primo colore da passare:

color: color-contrast(
  var(--bg-blue-1)
  vs
  var(--text-lightest), var(--text-light), var(--text-subdued)
  to AA /* 4.5 could also be passed */
);

Questa funzione può essere utilizzata per qualcosa di più del semplice colore del testo, anche se ritengo che sarà il suo caso d'uso principale. Pensa a quanto sarà più semplice fornire interfacce accessibili e leggibili una volta che la scelta di colori a contrasto appropriati sarà incorporata nel linguaggio CSS stesso.

Risorse

Sintassi dei colori relativa

Supporto dei browser

  • 111
  • 111
  • 113
  • 15

Fonte

Prima della sintassi relativa dei colori, per calcolare i colori e apportare modifiche, i canali colore dovevano essere inseriti singolarmente nelle proprietà personalizzate. Questa limitazione ha anche reso HSL la funzione di colore principale per la manipolazione dei colori, perché la tonalità, la saturazione o la luminosità potevano essere regolate in modo semplice con calc().

Dopo la relativa sintassi, ogni colore in qualsiasi spazio può essere scomposto, modificato e restituito come colore, il tutto in un'unica riga di CSS. Non ci sono più limitazioni a HSL: è possibile eseguire le manipolazioni in qualsiasi spazio colore desiderato e occorre creare molte meno proprietà personalizzate per semplificare l'operazione.

Nell'esempio di sintassi riportato di seguito viene fornito un esadecimale di base e vengono creati due nuovi colori relativi. Il primo colore --absolute-change crea un nuovo colore in LCH rispetto al colore di base, quindi sostituisce la luminosità del colore di base con 75%, mantenendo il cromatico (c) e la tonalità (h). Il secondo colore --relative-change crea un nuovo colore in LCH rispetto al colore di base, ma questa volta riduce la crominanza (c) del 20%.

.relative-color-syntax {
  --color: #0af;
  --absolute-change: lch(from var(--color) 75% c h);
  --relative-change: lch(from var(--color) l calc(c-20%) h);
}

È come mescolare i colori, ma è più simile alle alterazioni che al mescolare. Puoi trasmettere un colore di un altro colore, avere accesso ai tre valori dei canali indicati dalla funzione colore utilizzata, con la possibilità di regolare questi canali. Nel complesso, questa è una sintassi per il colore molto potente ed efficace.

Nella demo seguente ho usato la sintassi relativa del colore per creare varianti più chiare e più scure di un colore di base e ho usato color-contrast() per garantire il contrasto corretto delle etichette:

Screenshot con 3 colonne, ciascuna delle quali è più scura o più chiara rispetto alla colonna centrale.
Prova la demo

Questa funzione può essere utilizzata anche per la generazione della tavolozza dei colori. Ecco una demo in cui vengono generate intere tavolozze da un colore di base specificato. Questo insieme di CSS è alla base di tutte le diverse tavolozze, ciascuna delle quali offre semplicemente una base diversa. Come bonus, dato che ho usato LCH, guarda come sono percepite anche le tavolozze: non si vedono punti caldi o morti, grazie a questo spazio colore.

:root {
  --_color-base: #339af0;

  --color-0:  lch(from var(--_color-base) 98% 10 h);
  --color-1:  lch(from var(--_color-base) 93% 20 h);
  --color-2:  lch(from var(--_color-base) 85% 40 h);
  --color-3:  lch(from var(--_color-base) 75% 46 h);
  --color-4:  lch(from var(--_color-base) 66% 51 h);
  --color-5:  lch(from var(--_color-base) 61% 52 h);
  --color-6:  lch(from var(--_color-base) 55% 57 h);
  --color-7:  lch(from var(--_color-base) 49% 58 h);
  --color-8:  lch(from var(--_color-base) 43% 55 h);
  --color-9:  lch(from var(--_color-base) 39% 52 h);
  --color-10: lch(from var(--_color-base) 32% 48 h);
  --color-11: lch(from var(--_color-base) 25% 45 h);
  --color-12: lch(from var(--_color-base) 17% 40 h);
  --color-13: lch(from var(--_color-base) 10% 30 h);
  --color-14: lch(from var(--_color-base) 5% 20 h);
  --color-15: lch(from var(--_color-base) 1% 5 h);
}
Screenshot di 15 tavolozze, tutte generate dinamicamente dal CSS.
Prova la demo

Spero che a questo punto sia possibile vedere come gli spazi colore e le diverse funzioni colore possono essere utilizzati per scopi diversi, in base ai loro punti di forza e di debolezza.

Risorse

Spazi colore con gradiente

Prima degli spazi colore a gradiente, sRGB era lo spazio colore predefinito utilizzato. sRGB è generalmente affidabile, ma presenta alcuni punti deboli come la zona morta grigia.

4 gradienti in una griglia, tutti dal ciano al deeppink. LCH e LAB hanno una vivacità più coerente, dove sRGB diventa un po&#39; desaturato al centro.

Dopo gli spazi colore a gradiente, indica al browser quale spazio colore utilizzare per l'interpolazione dei colori. In questo modo, sviluppatori e progettisti possono scegliere la sfumatura che preferiscono. Anche lo spazio colore predefinito diventa LCH anziché sRGB.

L'aggiunta della sintassi va dopo la direzione del gradiente, utilizza la nuova sintassi in ed è facoltativa:

background-image: linear-gradient(
  to right in hsl,
  black, white
);

background-image: linear-gradient(
  to right in lch,
  black, white
);

Ecco un gradiente di base ed essenziale dal nero al bianco. Osserva l'intervallo di risultati in ogni spazio colore. Alcune diventano il nero scuro prima di altre, altre svaniscono al bianco troppo tardi.

11 spazi colore mostrati rispetto al bianco e al nero.

Nel prossimo esempio, il nero passa al blu perché è uno spazio problematico per i gradienti. La maggior parte degli spazi colore diventa viola durante l'interpolazione dei colori o, come mi piace, quando i colori viaggiano all'interno dello spazio colore dal punto A al punto B. Dal momento che il gradiente prenderà una linea retta dal punto A al punto B, la forma dello spazio colore cambia drasticamente le fermate del percorso lungo il percorso.

11 spazi colore mostrati rispetto al blu e al nero.

Per esplorazioni, esempi e commenti più approfonditi, leggi questo thread di Twitter.

Risorse

inert

Supporto dei browser

  • 102
  • 102
  • 112
  • 15.5

Fonte

Prima del giorno inert era buona norma indirizzare l'attenzione dell'utente su aree della pagina o dell'app che richiedevano attenzione immediata. Questa strategia basata su focus guidato è diventata nota come focus trap perché gli sviluppatori dovevano concentrarsi su uno spazio interattivo, ascoltare gli eventi di cambiamento dell'attenzione e, se l'attenzione lasciava lo spazio interattivo, dovevano essere riproposti in modo forzato. Gli utenti che utilizzano tastiere o screen reader vengono indirizzati nuovamente allo spazio interattivo per assicurarsi che l'attività sia completata prima di proseguire.

Dopo il giorno inert, non è più necessario bloccare i contenuti perché puoi bloccare o proteggere intere sezioni della pagina o dell'app. I clic e i tentativi di modifica dello stato attivo non sono semplicemente disponibili mentre quelle parti di un documento sono inerti. Potresti pensare a questo servizio come a un servizio di guardia anziché a una trappola, in cui a inert non interessa far sì che la tua casa rimanga in qualche modo, piuttosto che rendere non disponibili altri luoghi.

Un buon esempio è la funzione alert() di JavaScript:

Il sito web viene visualizzato come interattivo, viene chiamato alert() e la pagina non è più attiva.

Come puoi vedere nel video precedente, la pagina era accessibile tramite mouse e tastiera fino alla chiamata di un elemento alert(). Quando è stata mostrata la finestra popup di avviso, il resto della pagina è stato bloccato, o inert. L'elemento attivo dell'utente viene inserito nella finestra di dialogo dell'avviso e non c'è altro da fare. Una volta che l'utente interagisce e completa la richiesta di funzione di avviso, la pagina diventa di nuovo interattiva. inert consente agli sviluppatori di ottenere facilmente questa stessa esperienza di concentrazione guidata.

Ecco un piccolo esempio di codice che illustra il funzionamento:

<body>
  <div class="modal">
    <h2>Modal Title</h2>
    <p>...<p>
    <button>Save</button>
    <button>Discard</button>
  </div>
  <main inert>
    <!-- cannot be keyboard focused or clicked -->
  </main>
</body>

Una finestra di dialogo è un ottimo esempio, ma inert è utile anche per cose come l'esperienza utente del menu laterale a scorrimento. Quando un utente fa scorrere il menu laterale fuori dalla pagina, non va bene lasciare che il mouse o la tastiera interagiscano con la pagina visualizzata; la situazione è un po' complessa per gli utenti. Invece, quando il menu laterale è visualizzato, rendi la pagina inerte; ora gli utenti devono chiudere o navigare all'interno del menu laterale e non si troveranno mai in un altro punto della pagina con un menu aperto.

Risorse

Caratteri COLRv1

Prima dei caratteri COLRv1, il web aveva i caratteri OT-SVG, anche un formato aperto per i caratteri con gradienti e colori ed effetti integrati. Le dimensioni erano molto grandi e, sebbene fosse consentito modificare il testo, la personalizzazione non era sufficiente.

Dopo i caratteri COLRv1, il web ha caratteri di dimensioni ridotte, scala vettoriale, riposizionabili, con gradiente e in modalità di combinazione, che accettano parametri per personalizzare il carattere in base ai casi d'uso o a un brand.

Visualizzazione di confronto e grafico a barre che mostrano come i caratteri COLRv1 sono più nitidi e più piccoli.
Immagine proveniente da https://developer.chrome.com/blog/colrv1-fonts/

Ecco un esempio tratto dal post del blog per sviluppatori di Chrome sulle emoji. Forse hai notato che, se aumenti le dimensioni del carattere di un'emoji, il risultato non viene mantenuto. È un'immagine e non un'arte vettoriale. Spesso nelle applicazioni in cui si usa un'emoji, viene sostituita con un asset di qualità superiore. Con i caratteri COLRv1, le emoji sono vettoriali e belle:

I caratteri delle icone possono fare delle cose straordinarie con questo formato, offrendo tavolozze dei colori a due tonalità personalizzate e altro ancora. Il caricamento di un carattere COLRv1 è come qualsiasi altro file carattere:

@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

La personalizzazione del carattere COLRv1 viene eseguita con @font-palette-values, una regola CSS speciale per raggruppare e assegnare un nome a un insieme di opzioni di personalizzazione in un bundle per utilizzarli in seguito. Osserva come specifichi un nome personalizzato, proprio come una proprietà personalizzata, a partire da --:

@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

@font-palette-values --colorized {
  font-family: "Bungee Spice";
  base-palette: 0;
  override-colors: 0 hotpink, 1 cyan, 2 white;
}

Con --colorized come alias per le personalizzazioni, l'ultimo passaggio consiste nell'applicare la tavolozza a un elemento che utilizza la famiglia di caratteri colorati:

@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

@font-palette-values --colorized {
  font-family: "Bungee Spice";
  base-palette: 0;
  override-colors: 0 hotpink, 1 cyan, 2 white;
}

.spicy {
  font-family: "Bungee Spice";
  font-palette: --colorized;
}
Screenshot del carattere Bungee Spice con la parola DUNE.
Carattere Bungee Spice mostrato con colori personalizzati, fonte da https://developer.chrome.com/blog/colrv1-fonts/

Con la disponibilità di un numero sempre maggiore di caratteri e caratteri a colori variabili, la tipografia web si trova su un percorso magnifico verso una personalizzazione ed un'espressione creativa avanzate.

Risorse

Unità area visibile

Grafico che mostra come la schermata del dispositivo, la finestra del browser e un iframe hanno aree visibili diverse.

Prima delle nuove varianti dell'area visibile, il web offriva unità fisiche utili per adattare le aree visibili. Ce n'era uno per altezza, larghezza, dimensioni minime (vmin) e lato più grande (vmax). Hanno funzionato bene per molti aspetti, ma i browser mobile hanno introdotto una complessità.

Sui dispositivi mobili, quando si carica una pagina, viene mostrata la barra di stato con l'URL, che occupa parte dello spazio dell'area visibile. Dopo alcuni secondi e un po' di interattività, la barra di stato potrebbe scomparire per consentire all'utente di avere un'esperienza più ampia dell'area visibile. Tuttavia, quando la barra esce dall'area, l'altezza dell'area visibile è cambiata e tutte le unità vh si spostano e ridimensionano quando le dimensioni di destinazione cambiano. Negli anni successivi, l'unità vh doveva specificatamente decidere quale delle due dimensioni dell'area visibile doveva utilizzare, perché causava problemi di layout visivo fastidiosi sui dispositivi mobili. È stato stabilito che vh rappresenterà sempre l'area visibile più grande.

.original-viewport-units {
  height: 100vh;
  width: 100vw;
  --size: 100vmin;
  --size: 100vmax;
}

Dopo aver reso disponibili le nuove varianti dell'area visibile, le unità dell'area visibile piccola, grande e dinamica sono state rese disponibili, con l'aggiunta di equivalenti logici a quelli fisici. L'idea è dare a sviluppatori e designer la possibilità di scegliere quale unità utilizzare per il loro scenario specifico. Forse va bene avere una piccola variazione del layout fastidioso quando la barra di stato scompare, in modo da poter utilizzare l'altezza dell'area visibile dinamica dvh senza preoccupazioni.

Un&#39;immagine con tre telefoni per mostrare DVH, LVH e SVH. Lo smartphone di esempio DVH ha due linee verticali, una tra la parte inferiore della barra di ricerca e la parte inferiore dell&#39;area visibile e una tra sopra la barra di ricerca (sotto la barra di stato del sistema) e la parte inferiore dell&#39;area visibile; mostra come DVH può avere una di queste due lunghezze. LVH è mostrato al centro con una linea tra la parte inferiore della barra di stato del dispositivo e il pulsante dell&#39;area visibile del telefono. L&#39;ultimo è l&#39;esempio di unità SVH, che mostra una linea dalla parte inferiore della barra di ricerca del browser alla parte inferiore dell&#39;area visibile

Di seguito è riportato un elenco completo di tutte le nuove opzioni di unità dell'area visibile rese disponibili con le nuove varianti dell'area visibile:

Unità area visibile altezza
​​.new-height-viewport-units {
  height: 100vh;
  height: 100dvh;
  height: 100svh;
  height: 100lvh;
  block-size: 100vb;
  block-size: 100dvb;
  block-size: 100svb;
  block-size: 100lvb;
}
Unità area visibile larghezza
.new-width-viewport-units {
  width: 100vw;
  width: 100dvw;
  width: 100svw;
  width: 100lvw;
  inline-size: 100vi;
  inline-size: 100dvi;
  inline-size: 100svi;
  inline-size: 100lvi;
}
Unità laterali più piccole per l'area visibile
.new-min-viewport-units {
  --size: 100vmin;
  --size: 100dvmin;
  --size: 100svmin;
  --size: 100lvmin;
}
Unità laterali più grande dell'area visibile
.new-max-viewport-units {
  --size: 100vmax;
  --size: 100dvmax;
  --size: 100svmax;
  --size: 100lvmax;
}

Ci auguriamo che offrano a sviluppatori e designer la flessibilità necessaria per realizzare design adattabili per l'area visibile.

Risorse

:has()

Supporto dei browser

  • 105
  • 105
  • 121
  • 15,4

Fonte

Prima di :has(), l'oggetto di un selettore era sempre alla fine. Ad esempio, l'oggetto di questo selettore è un elemento dell'elenco: ul > li. Gli pseudo selettori possono modificare il selettore, ma non modificano l'oggetto: ul > li:hover o ul > li:not(.selected).

Dopo :has(), un soggetto più in alto nell'albero degli elementi può rimanere soggetto fornendo una query sugli elementi secondari: ul:has(> li). È facile capire in che modo :has() ha un nome comune di "selettore padre", poiché in questo caso il soggetto del selettore è ora l'elemento padre.

Ecco un esempio di sintassi di base in cui la classe .parent rimane l'oggetto ma viene selezionata solo se un elemento secondario ha la classe .child:

.parent:has(.child) {...}

Ecco un esempio in cui un elemento <section> è il soggetto, ma il selettore corrisponde solo se uno degli elementi secondari ha :focus-visible:

section:has(*:focus-visible) {...}

Il selettore :has() inizia a diventare un'utilità fantastica quando diventano evidenti altri casi d'uso pratici. Ad esempio, al momento non è possibile selezionare i tag <a> quando aggregano le immagini, il che rende difficile insegnare all'anchor tag come modificare i propri stili in questo caso d'uso. È possibile con :has(), tuttavia:

a:has(> img) {...}

Questi sono tutti esempi in cui :has() sembra solo un selettore principale. Considera il caso d'uso delle immagini all'interno degli elementi <figure> e regola gli stili sulle immagini se la figura ha un <figcaption>. Nel seguente esempio, vengono selezionate le figure con sottotitoli codificati e poi le immagini all'interno di quel contesto. Viene utilizzato :has() e non cambia l'oggetto, in quanto l'oggetto scelto come target è costituito da immagini, non da figure:

figure:has(figcaption) img {...}

Le combinazioni sono praticamente infinite. Combina :has() con le query sulla quantità e modifica i layout della griglia CSS in base al numero di elementi secondari. Combina :has() con stati di pseudo-classi interattive e crea applicazioni che rispondono in modi nuovi e creativi.

La verifica dell'assistenza è semplice grazie a @supports e alla sua funzione selector(), che verifica se il browser comprende la sintassi prima di utilizzarlo:

@supports (selector(:has(works))) {
  /* safe to use :has() */
}

Risorse

2022 e oltre

Ci sono ancora una serie di cose che saranno difficili da fare una volta che queste funzionalità sorprendenti arriveranno nel 2022. Nella prossima sezione esamineremo alcuni dei problemi rimanenti e le soluzioni che si stanno sviluppando attivamente per risolverli. Queste soluzioni sono sperimentali, anche se possono essere specificate o disponibili dietro flag dei browser.

Il risultato delle sezioni successive dovrebbe essere conforto sul fatto che molte persone di molte aziende cercano una soluzione ai problemi elencati, ma non che queste soluzioni verranno rilasciate nel 2023.

Proprietà personalizzate digitate in modo non corretto

Supporto dei browser

  • 85
  • 85
  • 16.4

Fonte

Le proprietà personalizzate CSS sono straordinarie. Consentono di archiviare tutti i tipi di elementi all'interno di una variabile con nome, che può essere estesa, calcolata, condivisa e altro ancora. In effetti, sono così flessibili che sarebbe bello averne alcuni meno flessibili.

Considera uno scenario in cui box-shadow utilizza proprietà personalizzate per i propri valori:

box-shadow: var(--x) var(--y) var(--blur) var(--spread) var(--color);

Tutto questo funziona bene fino a quando una delle proprietà non viene modificata in un valore non accettato da CSS, ad esempio --x: red. L'intera ombra si interrompe se una delle variabili nidificate non è presente o è impostata su un tipo di valore non valido.

È qui che entra in gioco @property: --x può diventare una proprietà personalizzata digitata, non più larga e flessibile, ma sicura con alcuni limiti definiti:

@property --x {
  syntax: '<length>';
  initial-value: 0px;
  inherits: false;
}

Ora, quando box-shadow utilizza var(--x) e la versione successiva di --x: red, red verrà ignorata perché non è un <length>. Ciò significa che l'ombra continua a funzionare, anche se a una delle sue proprietà personalizzate è stato assegnato un valore non valido. Anziché non funzionare, viene ripristinata la metrica initial-value di 0px.

Animazione

Oltre alla funzionalità di sicurezza tipo, apre anche molte porte per l'animazione. La flessibilità della sintassi CSS rende impossibile l'animazione di alcuni elementi, ad esempio i gradienti. @property è utile in questo caso perché la proprietà CSS digitata può informare il browser sull'intenzione di uno sviluppatore all'interno di un'interpolazione altrimenti troppo complessa. Sostanzialmente limita l'ambito di possibilità, dal momento che un browser può animare aspetti di uno stile che prima non era possibile.

Considera questo esempio dimostrativo, in cui viene utilizzato un gradiente radiale per creare una porzione di un overlay, creando un effetto di messa a fuoco in evidenza. JavaScript imposta x e y del mouse quando viene premuto il tasto Alt/opt, quindi modifica la dimensione focale impostando un valore inferiore, ad esempio 25%, creando il cerchio di messa a fuoco in evidenza nella posizione del mouse:

Prova la demo
.focus-effect {
  --focal-size: 100%;
  --mouse-x: center;
  --mouse-y: center;

  mask-image: radial-gradient(
    circle at var(--mouse-x) var(--mouse-y),
    transparent 0%,
    transparent var(--focal-size),
    black 0%
  );
}

Tuttavia, i gradienti non possono essere animati. Sono troppo flessibili e troppo complesse per essere solo nel modo in cui vuoi che si animano. Con @property, tuttavia, una proprietà può essere digitata e animata in modo isolato, in modo che il browser possa comprendere facilmente l'intento.

I videogiochi che usano questo effetto di messa a fuoco animano sempre il cerchio, da un cerchio grande a uno stenopeico. Ecco come utilizzare @property con la nostra demo in modo che il browser anima la maschera sfumatura:

@property --focal-size {
  syntax: '<length-percentage>';
  initial-value: 100%;
  inherits: false;
}

.focus-effect {
  --focal-size: 100%;
  --mouse-x: center;
  --mouse-y: center;

  mask-image: radial-gradient(
    circle at var(--mouse-x) var(--mouse-y),
    transparent 0%,
    transparent var(--focal-size),
    black 0%
  );

  transition: --focal-size .3s ease;
}
Prova la demo

Ora il browser è in grado di animare la dimensione del gradiente perché abbiamo ridotto l'area della modifica a una sola proprietà e abbiamo digitato il valore in modo che il browser possa interpolare in modo intelligente le lunghezze.

@property può fare molto di più, ma queste piccole abilitazioni possono fare la differenza.

Risorse

Era in min-width o max-width

Prima degli intervalli di query supporti, una query supporti CSS utilizza min-width e max-width per articolare le condizioni sopra e sotto. Potrebbe avere il seguente aspetto:

@media (min-width: 320px) {
  …
}

Dopo gli intervalli di query supporti, la stessa query supporti potrebbe avere il seguente aspetto:

@media (width >= 320px) {
  …
}

Una query multimediale CSS che utilizza sia min-width sia max-width potrebbe avere il seguente aspetto:

@media (min-width: 320px) and (max-width: 1280px) {
  …
}

Dopo gli intervalli di query supporti, la stessa query supporti potrebbe avere il seguente aspetto:

@media (320px <= width <= 1280px) {
  …
}

A seconda delle tue conoscenze di programmazione, una di queste sarà molto più leggibile dell'altra. Grazie alle aggiunte di specifiche, gli sviluppatori potranno scegliere quello che preferiscono o persino utilizzarli in modo intercambiabile.

Risorse

Nessuna variabile di query supporti

Prima del giorno @custom-media, le query supporti dovevano ripetersi più volte o fare affidamento sui preprocessori per generare l'output corretto in base alle variabili statiche durante il tempo di build.

Dopo @custom-media, il CSS consente l'aliasing delle query multimediali e il relativo riferimento, proprio come una proprietà personalizzata.

L'assegnazione di un nome è molto importante: è in grado di allineare lo scopo alla sintassi, rendendo le cose più facili da condividere e da usare nei team. Ecco alcune query multimediali personalizzate che mi seguono tra un progetto e l'altro:

@custom-media --OSdark  (prefers-color-scheme: dark);
@custom-media --OSlight (prefers-color-scheme: light);

@custom-media --pointer (hover) and (pointer: coarse);
@custom-media --mouse   (hover) and (pointer: fine);

@custom-media --xxs-and-above (width >= 240px);
@custom-media --xxs-and-below (width <= 240px);

Ora che sono definiti, posso utilizzarne uno nel seguente modo:

@media (--OSdark) {
  :root {
    …
  }
}

Trova un elenco completo delle query multimediali personalizzate che utilizzo nella libreria delle proprietà personalizzate del mio CSS Open Props.

Risorse

La nidificazione dei selettori è perfetta

Prima del giorno @nest, i fogli di stile venivano ripetuti più volte. Era particolarmente poco gestibile quando i selettori erano lunghi e ciascuno puntava a piccole differenze. La comodità della nidificazione è uno dei motivi più comuni per l'adozione di un preprocessore.

Dopo il giorno @nest, la ripetizione non è più disponibile. Quasi tutte le funzionalità di nidificazione abilitata per il preprocessore saranno rese disponibili integrate in CSS.

article {
  color: darkgray;
}

article > a {
  color: var(--link-color);
}

/* with @nest becomes */

article {
  color: darkgray;

  & > a {
    color: var(--link-color);
  }
}

L'aspetto più importante della nidificazione per me, oltre a non ripetere article nel selettore nidificato, è che il contesto dello stile rimane all'interno di un blocco di stile. Invece di passare da un selettore e i suoi stili a un altro selettore con stili (esempio 1), il lettore può rimanere nel contesto di un articolo e vedere che l'articolo possiede i link al suo interno. La relazione e l'intenzione di stile sono insieme, in modo che article appaia come proprietario dei suoi stili.

La proprietà può essere considerata anche come centralizzazione. Invece di cercare stili pertinenti nei fogli di stile, puoi trovarli tutti nidificati all'interno di un contesto. Questo approccio funziona nelle relazioni da padre a figlio, ma anche con le relazioni padre-figlio.

Considera un componente figlio che vuole regolarsi automaticamente in un contesto principale diverso, anziché cambiare l'elemento principale che possiede lo stile e modificare l'asset secondario:

/* parent owns this, adjusting children */
section:focus-within > article {
  border: 1px solid hotpink;
}

/* with @nest becomes */

/* article owns this, adjusting itself when inside a section:focus-within */
article {
  @nest section:focus-within > & {
     border: 1px solid hotpink;
  }
}

@nest favorisce complessivamente con uno stile più salutare l'organizzazione, la centralizzazione e la proprietà. I componenti possono raggruppare e possedere i propri stili, anziché essere distribuiti tra gli altri blocchi di stile. Può sembrare piccolo, ma può avere effetti molto importanti, sia per quanto riguarda la convenienza che per la leggibilità.

Risorse

Gli stili di ambito sono davvero difficili

Supporto dei browser

  • 118
  • 118
  • x
  • 17,4

Prima del giorno @scope, esistevano molte strategie perché gli stili in CSS si basano su sistemi a cascata, ereditano e hanno un ambito globale per impostazione predefinita. Queste funzionalità di CSS sono molto utili per molte cose, ma nel caso di applicazioni e siti complessi, con molti stili di componenti diversi, lo spazio globale e la natura della cascata possono far percepire gli stili.

Dopo @scope, non solo sarà possibile limitare l'ambito degli stili solo all'interno di un contesto, ad esempio una classe, ma anche spiegare dove terminano e non continuano a cascata o ereditare.

Nell'esempio seguente, l'ambito della convenzione di denominazione BEM può essere invertito nell'intent effettivo. Il selettore BEM sta tentando di limitare il colore di un elemento header a un container .card con convenzioni di denominazione. Ciò richiede l'inserimento di questo nome della classe nell'intestazione, in modo da completare l'obiettivo. Con @scope, non sono necessarie convenzioni di denominazione per completare lo stesso obiettivo senza eseguire il markup dell'elemento di intestazione:

.card__header {
  color: var(--text);
}

/* with @scope becomes */

@scope (.card) {
  header {
    color: var(--text);
  }
}

Ecco un altro esempio, meno specifico per i componenti e più dettagli sulla natura in ambito globale di CSS. I temi chiaro e scuro devono coesistere all'interno di un foglio di stile, dove l'ordine è importante per determinare uno stile vincente. Generalmente, ciò significa che gli stili di tema scuro vengono dopo il tema chiaro e che il tema chiaro viene impostato come predefinito e scuro come facoltativo. Evita di scontrare gli ordini e l'ambito con @scope:

​​@scope (.light-theme) {
  a { color: purple; }
}

@scope (.dark-theme) {
  a { color: plum; }
}

Per completare la storia in questo caso, @scope consente anche di stabilire dove termina l'ambito dello stile. Questa operazione non può essere eseguita con alcuna convenzione di denominazione o preprocessore; è speciale e solo qualcosa del CSS integrato nel browser può fare. Nell'esempio seguente, gli stili img e .content vengono applicati esclusivamente quando un elemento secondario di .media-block è l'elemento di pari livello o l'elemento padre di .content:

@scope (.media-block) to (.content) {
  img {
    border-radius: 50%;
  }

  .content {
    padding: 1em;
  }
}

Risorse

Nessun modo CSS per un layout in muratura

Prima della creazione in muratura CSS con griglia, JavaScript era il modo migliore per ottenere un layout in muratura, poiché qualsiasi metodo CSS con colonne o flexbox rappresenta in modo impreciso l'ordine dei contenuti.

Dopo la creazione in muratura CSS con griglia, non saranno necessarie librerie JavaScript e l'ordine dei contenuti verrà corretto.

Screenshot del layout in muratura che mostra dei numeri che viaggiano verso la parte superiore e poi scendono.
Immagine e demo di Smashing Magazine
https://www.smashingmagazine.com/native-css-masonry-layout-css-grid/

La demo precedente viene ottenuta con il seguente CSS:

.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: masonry;
}

È confortante sapere che questa è una strategia di layout mancante. In più, puoi provarla oggi stesso con Firefox.

Risorse

Il CSS non può aiutare gli utenti a ridurre i dati

Supporto dei browser

  • x
  • x

Fonte

Prima della query multimediale prefers-reduced-data, JavaScript e un server potevano modificare il proprio comportamento in base all'opzione "Risparmio dati" del sistema operativo o del browser di un utente, ma non CSS.

Dopo la query multimediale prefers-reduced-data, il CSS può partecipare al miglioramento dell'esperienza utente e contribuire al salvataggio dei dati.

@media (prefers-reduced-data: reduce) {
  picture, video {
    display: none;
  }
}

Il codice CSS precedente viene utilizzato in questo componente di scorrimento multimediale e il risparmio può essere enorme. A seconda delle dimensioni dell'area visibile per la visita, maggiore sarà il risparmio con il caricamento pagina. Il risparmio continua man mano che gli utenti interagiscono con le barre di scorrimento dei contenuti multimediali. Tutte le immagini hanno attributi loading="lazy" e questo, combinato con il CSS che nasconde completamente l'elemento, significa che non viene mai effettuata una richiesta di rete per l'immagine.

Screenshot dell&#39;interfaccia di un carosello di un programma TV con molte miniature e titoli.

Per il mio test, su un'area visibile di medie dimensioni sono stati inizialmente caricati 40 richieste e 700 kB di risorse. Man mano che un utente scorre la selezione dei contenuti multimediali, vengono caricate altre richieste e risorse. Con CSS e la query multimediale ridotta per i dati vengono caricati 10 richieste e 172 kB di risorse. Ciò equivale a mezzo megabyte di risparmio e l'utente non ha neanche fatto scorrere i contenuti multimediali e, a quel punto, non ci vengono richieste aggiuntive.

Screenshot dell&#39;interfaccia di un carosello di un programma TV senza miniature e con molti titoli visualizzati.

Questa esperienza con i dati ridotta presenta altri vantaggi oltre al risparmio dei dati. È possibile vedere più titoli e non ci sono immagini di copertina che distraggono per attirare l'attenzione. Molti utenti utilizzano la modalità Risparmio dati perché pagano per megabyte di dati. È davvero bello vedere che CSS è in grado di aiutarti.

Risorse

Le funzionalità di agganciamento di scorrimento sono troppo limitate

Prima di queste proposte di scorrimento, scrivere il tuo codice JavaScript per gestire un carosello, un dispositivo di scorrimento o una galleria poteva diventare rapidamente complesso, con tutti gli osservatori e la gestione dello stato. Inoltre, se non fai attenzione, le velocità di scorrimento naturali potrebbero essere normalizzate dallo script, rendendo l'interazione dell'utente un po' innaturale e potenzialmente poco chiara.

Nuove API

snapChanging()

L'evento si attiva non appena il browser rilascia uno Snap figlio. Ciò consente all'interfaccia utente di riflettere la mancanza di un elemento figlio di agganciamento e lo stato di aggancio indeterminato dello scorrimento, poiché ora è in uso e si troverà in una nuova posizione.

document.querySelector('.snap-carousel').addEventListener('snapchanging', event => {
  console.log('Snap is changing', event.snappedTargetsList);
});
snapChanged()

Questo evento si attiva non appena il browser si è agganciato a un nuovo bambino e la barra di scorrimento è bloccata. In questo modo, qualsiasi UI che dipende dall'elemento figlio agganciato può aggiornarsi e riflettere la connessione.

document.querySelector('.snap-carousel').addEventListener('snapchanged', event => {
  console.log('Snap changed', event.snappedTargetsList);
});
scroll-start

Lo scorrimento non inizia sempre dall'inizio. Considera i componenti a scorrimento in cui lo scorrimento verso sinistra o destra attiva eventi diversi oppure una barra di ricerca che quando viene caricata la pagina viene inizialmente nascosta finché non scorri verso l'alto. Questa proprietà CSS consente agli sviluppatori di specificare che uno scorrimento deve iniziare in un punto specifico.

:root { --nav-height: 100px }

.snap-scroll-y {
  scroll-start-y: var(--nav-height);
}
:snap-target

Questo selettore CSS corrisponderà agli elementi in un contenitore di agganciamento di scorrimento attualmente agganciati dal browser.

.card {
  --shadow-distance: 5px;
  box-shadow: 0 var(--shadow-distance) 5px hsl(0 0% 0% / 25%);
  transition: box-shadow 350ms ease;
}

.card:snapped {
  --shadow-distance: 30px;
}

Dopo queste proposte di scorrimento dello scorrimento, creare un dispositivo di scorrimento, un carosello o una galleria è molto più semplice, poiché il browser ora offre praticità per l'attività, eliminando osservatori e codice di orchestrazione dello scorrimento in favore dell'utilizzo delle API integrate.

Queste funzionalità CSS e JS sono ancora agli inizi, ma a breve presta attenzione ai polyfill, che potrebbero facilitarne l'adozione e il test.

Risorse

Ciclo tra gli stati noti

Prima del giorno toggle(), solo gli stati integrati nel browser potevano essere già utilizzati per lo stile e l'interazione. L'input della casella di controllo, ad esempio, contiene :checked, uno stato del browser gestito internamente per l'input che CSS può utilizzare per modificare visivamente l'elemento.

Dopo il giorno toggle(), potrai creare stati personalizzati su qualsiasi elemento in modo che il CSS possa modificarlo e utilizzarlo per lo stile. Consente gruppi, ciclismo, attivazione/disattivazione diretta e altro ancora.

Nell'esempio seguente, si ottiene lo stesso effetto di una voce dell'elenco barrata al completamento, ma senza elementi delle caselle di controllo:

<ul class='ingredients'>
   <li>1 banana
   <li>1 cup blueberries
  ...
</ul>

E gli stili CSS toggle() pertinenti:

li {
  toggle-root: check self;
}

li:toggle(check) {
  text-decoration: line-through;
}

Se hai familiarità con le macchine a stati, potresti notare la quantità di crossover con toggle(). Questa funzionalità consentirà agli sviluppatori di integrare una quantità maggiore del loro stato in CSS, il che si spera in modi più chiari e semantici di orchestrare interazione e stato.

Risorse

Personalizzazione di elementi selezionati

Prima del giorno <selectmenu>, il CSS non aveva la possibilità di personalizzare gli elementi <option> con RTF o di modificare molto la visualizzazione di un elenco di opzioni. Questo ha portato gli sviluppatori a caricare librerie esterne che ricreavano gran parte delle funzionalità di un elemento <select>, il che si è rivelato molto impegnativo.

Dopo il giorno <selectmenu>, gli sviluppatori potranno fornire codice HTML avanzato per gli elementi delle opzioni e personalizzarli secondo le loro esigenze, pur rispettando i requisiti di accessibilità e fornendo HTML semantico.

Nell'esempio seguente, tratto dalla pagina esplicativa <selectmenu>, viene creato un nuovo menu di selezione con alcune opzioni di base:

<selectmenu>
  <option>Option 1</option>
  <option>Option 2</option>
  <option>Option 3</option>
</selectmenu>

Il CSS può scegliere come target e definire lo stile delle parti dell'elemento:

.my-select-menu::part(button) {
  color: white;
  background-color: red;
  padding: 5px;
  border-radius: 5px;
}

.my-select-menu::part(listbox) {
  padding: 10px;
  margin-top: 5px;
  border: 1px solid red;
  border-radius: 5px;
}

Un menu con contenuti selezionati con colori intensi di rosso.

Puoi provare l'elemento <selectmenu> su Chromium in Canary con il flag degli esperimenti web attivato. Aspetti da considerare nel 2023 e non solo per gli elementi di menu selezionati personalizzabili.

Risorse

Ancorare un elemento a un altro

Prima del giorno anchor(), le strategie di posizione assoluta e relativa erano offerte agli sviluppatori per far spostare gli elementi secondari all'interno di un elemento principale.

Dopo il giorno anchor(), gli sviluppatori potranno posizionare elementi in altri elementi, a prescindere dal fatto che siano o meno secondari. Consente inoltre agli sviluppatori di specificare il bordo in base al quale posizionare il posizionamento e altri aspetti utili per creare relazioni di posizione tra gli elementi.

Se ti interessa saperne di più, nel video esplicativo troverai alcuni ottimi esempi di codice ed esempi di codice.

Risorse