Stato del CSS 2022

Le funzionalità di stile web di oggi e di domani, come mostrato alla conferenza Google IO 2022, oltre ad alcuni extra.

Il 2022 è destinato a essere uno degli anni migliori per i CSS, per quanto riguarda il rilascio di funzionalità e funzionalità del browser cooperative, con l'obiettivo collaborativo di implementare 14 funzionalità.

Panoramica

Questo post è la versione in articolo del talk tenuto al Google IO 2022. Non deve essere una guida approfondita su ogni funzionalità, ma un'introduzione e una breve panoramica per suscitare l'interesse, fornendo ampiezza anziché profondità. Se il tema ti interessa, controlla la fine di una sezione per trovare i link alle risorse con ulteriori informazioni.

Sommario

Utilizza l'elenco di seguito per passare agli argomenti che ti interessano:

Compatibilità del browser

Uno dei motivi principali per cui così tante funzionalità CSS sono impostate per essere rilasciate in collaborazione è dovuto agli sforzi di Interop 2022. Prima di studiare gli sforzi di Interop, è importante esaminare gli sforzi di Compat 2021.

Compat 2021

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

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

I punteggi dei test sono stati migliorati in modo complessivo, a dimostrazione di un miglioramento della stabilità e dell'affidabilità. 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 forze. L'azienda prevedeva di fornire agli sviluppatori le seguenti funzionalità web:

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

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

Novità per il 2022

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

Livelli in cascata

Supporto dei browser

  • Chrome: 99.
  • Edge: 99.
  • Firefox: 97.
  • Safari: 15.4.

Origine

Prima di @layer, l'ordine scoperto degli stili CSS caricati era molto importante, poiché gli stili caricati per ultimi possono sovrascrivere quelli caricati in precedenza. Ciò ha portato a stili di fogli di stile di entrata gestiti meticolosamente, in cui gli sviluppatori dovevano caricare prima gli stili meno importanti e poi quelli più importanti. Esistono intere metodologie per aiutare gli sviluppatori nella gestione di questa importanza, come ITCSS.

Con @layer, il file di immissione può predefinire i livelli e il relativo ordine in anticipo. Poi, man mano che gli stili vengono caricati o definiti, possono essere inseriti in un livello, consentendo di preservare l'importanza dell'override dello stile, ma senza l'orchestrazione del caricamento gestita meticolosamente.

Il video mostra come i livelli di struttura a cascata definiti consentano un processo di creazione e caricamento più libero e personalizzato, mantenendo al contempo la struttura a cascata necessaria.

Chrome DevTools è utile per visualizzare gli stili provenienti da ciascun livello:

Screenshot della barra laterale Stili di Chrome DevTools che mostra come vengono visualizzati gli stili nei nuovi gruppi di livelli.

Risorse

Sottostruttura

Supporto dei browser

  • Chrome: 117.
  • Edge: 117.
  • Firefox: 71.
  • Safari: 16.

Origine

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

Dopo subgrid, un elemento secondario di una griglia può adottare le colonne o le righe dell'elemento padre come proprie e allinearsi a sé stesso o a quelle secondarie.

Nella seguente demo, l'elemento body crea una griglia classica di tre colonne: la colonna centrale è chiamata main e le colonne sinistra e destra hanno linee con lo stesso nome fullbleed. Quindi, ogni elemento del corpo, <nav> e <main>, adotta le linee 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 colonne e le righe fullbleed e main.

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

.fullbleed {
  grid-column: fullbleed;
}

DevTools può aiutarti a vedere le linee e le sottogriglie (al momento solo in Firefox). Nell'immagine seguente, la griglia principale e le sottogriglie sono sovrapposte. Ora ricorda l'idea dei designer riguardo al layout.

Screenshot di una demo della griglia secondaria, che utilizza gli strumenti di overlay della griglia di Chrome DevTools per mostrare le linee definite dal CSS.

Nel riquadro degli 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 sottogriglia.
Screenshot da Firefox DevTools

Risorse

Query sui contenitori

Supporto dei browser

  • Chrome: 105.
  • Edge: 105.
  • Firefox: 110.
  • Safari: 16.

Origine

Prima di @container, gli elementi di una pagina web potevano adattarsi solo alle dimensioni dell'intera area visibile. Questo è ottimo per i layout macro, ma per i layout micro, dove il contenitore esterno non è l'intero viewport, è impossibile per il layout adattarsi di conseguenza.

Dopo @container, gli elementi possono adattarsi alle dimensioni o allo stile di un contenitore principale. L'unico svantaggio è che i container devono dichiararsi come possibili target di query, 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 sulle colonne Lun, Mar, Mer, Gio e Ven nel video seguente tramite gli elementi evento.

Demo di Una Kravets

Ecco il CSS per eseguire query al contenitore calendar-day per determinarne le dimensioni e per modificare il 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 del libro si adatta allo spazio disponibile nella colonna in cui viene trascinato:

Demo di Max Böck

Una ha ragione nel valutare la situazione come nuova nuova risposta. Esistono molte decisioni di design interessanti e significative da prendere quando si utilizza @container.

Risorse

accent-color

Supporto dei browser

  • Chrome: 93.
  • Edge: 93.
  • Firefox: 92.
  • Safari: 15.4.

Origine

Prima del giorno accent-color, per creare un modulo con colori corrispondenti ai brand, potresti ritrovarti con librerie o soluzioni CSS complesse che diventavano difficili da gestire nel corso del tempo. Anche se hanno offerto tutte le opzioni e, possibilmente, incluso l'accessibilità, la scelta di utilizzare i componenti integrati o di adottare i propri diventa noiosa continuare a scegliere.

Dopo il giorno accent-color, una riga di CSS conferisce un colore del brand ai componenti integrati. Oltre a una tinta, il browser sceglie in modo intelligente i colori di contrasto appropriati per le parti accessorie del componente e si adatta alle combinazioni di colori del sistema (chiare o scure).

/* 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 esploro molti altri aspetti di questa utile proprietà CSS.

Risorse

Livello di colore 4 e 5

Il web è stato dominato da sRGB negli ultimi decenni, ma in un mondo digitale in espansione di display ad alta definizione e dispositivi mobili preequipaggiati con schermi OLED o QLED, sRGB non è sufficiente. Inoltre, sono previste pagine dinamiche che si adattano alle preferenze degli utenti e la gestione del colore è un problema crescente per designer, sistemi di design e gestori del codice.

Tuttavia, non nel 2022, CSS offre una serie di nuove funzioni e nuovi spazi per i colori: - Colori disponibili per le funzionalità dei colori HD dei display. - Spazi di colore che corrispondono a un'intenzione, ad esempio l'uniformità percettiva. - Spazi di colore per le sfumature che modificano drasticamente i risultati dell'interpolazione. - Funzioni di colore per aiutarti a mescolare e creare contrasto e scegliere lo spazio in cui lavorare.

Prima di tutte queste funzionalità di colore, i sistemi di progettazione dovevano precalcolare i colori di contrasto appropriati e garantire tavolozze vivaci in modo appropriato, il tutto mentre i precompilatori o JavaScript facevano il lavoro più difficile.

Dopo tutte queste funzionalità di colore, il browser e il CSS possono fare tutto il lavoro, dinamicamente e just in time. Anziché inviare molti KB di CSS e JavaScript agli utenti per attivare i temi e i colori di visualizzazione dei dati, il CSS può eseguire l'orchestrazione e i calcoli. Il CSS è anche più adatto a verificare il supporto prima dell'utilizzo o a gestire i fallback in modo elegante.

@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

  • Chrome: 101.
  • Edge: 101.
  • Firefox: 96.
  • Safari: 15.

Origine

HWB sta per tonalità, bianco e nero. Si presenta come un modo di esprimere il colore in modo intuitivo, poiché è solo una tonalità e una quantità di bianco o nero da schiarire o scurire. Gli artisti che mischiano i colori con il bianco o il nero potrebbero apprezzare questa aggiunta alla sintassi dei colori.

L'utilizzo di questa funzione di colore genera colori nello spazio colore sRGB, come per HSL e RGB. In termini di novità per il 2022, non offre nuovi colori, ma potrebbe semplificare alcune attività per gli appassionati di sintassi e modello mentale.

Risorse

Spazi colore

Il modo in cui i colori vengono rappresentati avviene con uno spazio colore. Ogni spazio di colore offre varie funzionalità e compromessi per lavorare con i colori. Alcuni potrebbero riunire tutti i colori brillanti, mentre altri potrebbero allinearli prima in base alla loro leggerezza.

Il CSS 2022 offrirà 10 nuovi spazi di colore, ciascuno con funzionalità uniche per aiutare designer e sviluppatori a visualizzare, scegliere e mescolare i colori. In precedenza, sRGB era l'unica opzione per lavorare con i colori, ma ora il CSS offre nuove potenzialità e un nuovo spazio colore predefinito, LCH.

color-mix()

Supporto dei browser

  • Chrome: 111.
  • Edge: 111.
  • Firefox: 113.
  • Safari: 16.2.

Origine

Prima di color-mix(), gli sviluppatori e i designer avevano bisogno di preprocessori come Sass per mescolare i colori prima che il browser li vedesse. La maggior parte delle funzioni di miscelazione dei colori non offriva inoltre la possibilità di specificare lo spazio colore in cui eseguire la miscelazione, causando a volte risultati confusi.

Dopo color-mix(), gli sviluppatori e i designer possono mescolare i 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 miscelazione o utilizzare lo spazio colore di miscelazione predefinito LCH.

Spesso, un colore del brand viene utilizzato come base da cui vengono create varianti, ad esempio colori più chiari o più scuri per gli stili al passaggio del mouse. Ecco come funziona concolor-mix():

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

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

Se volessi mescolare quei colori in uno spazio colore diverso, ad esempio s web, modificalo:

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

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

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

Nel 2022 potrai mescolare i colori in vari spazi di colore nei tuoi fogli di stile.

Risorse

color-contrast()

Supporto dei browser

  • Chrome: non supportato.
  • Edge: non supportato.
  • Firefox: non supportato.
  • Safari: dietro una bandiera.

Origine

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

Screenshot di 3 tavolozze di materiali, che mostrano 14 colori e i colori a contrasto bianco o nero appropriati per il testo.
Esempio tratto dalle tavolozze dei colori di Material Design del 2014

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

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

Screenshot della demo HWB in cui ogni tavolozza ha una combinazione diversa di testo chiaro o scuro, a seconda del browser.
Prova la demo

Le nozioni di base della sintassi sono le seguenti, dove il grigio viene passato alla funzione e il browser determina se il nero o il bianco hanno il maggiore contrasto:

color: color-contrast(gray);

La funzione può anche essere personalizzata con un elenco di colori, dal quale sceglierà il colore con il contrasto più elevato:

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

Infine, nel caso in cui sia preferibile non scegliere il colore di contrasto più elevato nell'elenco, è possibile fornire un rapporto di contrasto target e viene scelto 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 più di un colore di testo, anche se ritengo che questo sarà il suo caso d'uso principale. Pensa a quanto sarà più facile creare interfacce accessibili e leggibili una volta che la scelta di colori a contrasto adeguati sarà integrata nel linguaggio CSS stesso.

Risorse

Sintassi del colore relativo

Supporto dei browser

  • Chrome: 111.
  • Edge: 111.
  • Firefox: 113.
  • Safari: 15.

Origine

Prima della sintassi dei colori relativa, per eseguire calcoli sul colore e apportare modifiche, i canali di colore dovevano essere inseriti singolarmente nelle proprietà personalizzate. Questa limitazione ha reso HSL anche 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 sintassi dei colori relativa, qualsiasi colore in qualsiasi spazio può essere decostruito, modificato e restituito come colore, il tutto in una riga di CSS. Non ci sono più limitazioni al modello HSL: le manipolazioni possono essere eseguite in qualsiasi spazio di colore e per semplificarle è necessario creare molte meno proprietà personalizzate.

Nel seguente esempio di sintassi, viene fornito un codice esadecimale di base e vengono creati due nuovi colori in base a questo. Il primo colore --absolute-change crea un nuovo colore in LCH dal colore di base, quindi sostituisce la luminosità del colore di base con 75%, mantenendo la cromia (c) e la tonalità (h). Il secondo colore --relative-change crea un nuovo colore in LCH dal colore di base, ma questa volta riduce la cromia (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);
}

È simile alla miscelazione dei colori, ma è più simile alle alterazioni che alla miscelazione. Puoi trasmettere un colore da un altro colore, ottenendo l'accesso ai tre valori di canale come descritti dalla funzione di colore utilizzata, con la possibilità di aggiustare questi canali. Nel complesso, si tratta di una sintassi molto interessante e potente per il colore.

Nella seguente demo ho utilizzato la sintassi dei colori relativa per creare varianti più chiare e più scure di un colore di base e ho utilizzato color-contrast() per garantire che le etichette abbiano un contrasto adeguato:

Screenshot con 3 colonne, ciascuna più scura o più chiara della colonna centrale.
Prova la demo

Questa funzione può essere utilizzata anche per la generazione di tavolozze di colori. Ecco una demo in cui intere tavolozze vengono generate a partire da un colore di base fornito. Questo unico insieme di CSS è alla base di tutte le varie tavolozze, ognuna delle quali fornisce semplicemente una base diversa. Come bonus, dato che ho utilizzato LCH, guarda quanto sono percettibilmente uniformi le palette: non ci sono punti caldi o morti, grazie a questo spazio di 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 da CSS.
Prova la demo

A questo punto, spero che tu abbia capito come gli spazi di colore e le diverse funzioni di colore possano essere utilizzati per scopi diversi, in base ai loro punti di forza e di debolezza.

Risorse

Spazi di colore gradiente

Prima degli spazi colore sfumati, 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 magenta scuro. LCH e LAB hanno una vivacità più costante, con sRGB leggermente desaturato al centro.

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

L'aggiunta di sintassi avviene 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 una sfumatura di base ed essenziale dal nero al bianco. Esamina l'intervallo di risultati in ogni spazio di colore. Alcune raggiungono il nero scuro prima di altre, altre diventano bianche troppo tardi.

11 spazi di colore mostrati confrontando il nero con il bianco.

In questo esempio, il nero passa al blu perché è un problema noto per i gradienti. La maggior parte degli spazi di colore assume una tonalità viola durante l'interpolazione del colore o, come mi piace pensare, quando i colori si spostano all'interno del loro spazio di colore dal punto A al punto B. Poiché il gradiente prenderà una linea retta dal punto A al punto B, la forma dello spazio colore modifica drasticamente le fermate lungo il percorso.

11 spazi di colore mostrati confrontando il blu con il nero.

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

Risorse

inert

Supporto dei browser

  • Chrome: 102.
  • Edge: 102.
  • Firefox: 112.
  • Safari: 15.5.

Origine

Prima del giorno inert, era buona norma indirizzare l'attenzione dell'utente verso aree della pagina o dell'app che richiedevano attenzione immediata. Questa strategia di stato attivo guidato è stata conosciuta come inganno dello stato attivo perché gli sviluppatori inserivano lo stato attivo in uno spazio interattivo, ascoltavano gli eventi di modifica dello stato attivo e, se lo stato attivo usciva dallo spazio interattivo, veniva reinserito forzatamente. Gli utenti che utilizzano tastiere o screen reader vengono nuovamente indirizzati allo spazio interattivo per assicurarsi che l'attività sia completata prima di procedere.

Dopo inert, non è necessario alcun blocco perché puoi bloccare o proteggere intere sezioni della pagina o dell'app. I clic e i tentativi di modifica dell'attenzione non sono semplicemente disponibili mentre queste parti di un documento sono inattive. Si potrebbe anche pensare a questo come a delle guardie anziché a una trappola, in cui inert non è interessato a farti rimanere da qualche parte, ma piuttosto a rendere non disponibili altri posti.

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

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

Nel video precedente, noterai che la pagina era accessibile con il mouse e la tastiera fino a quando non è stato chiamato un alert(). Dopo aver visualizzato il popup della finestra di dialogo di avviso, il resto della pagina è stato bloccato o inert. Lo stato attivo degli utenti è posizionato all'interno della finestra di dialogo dell'avviso e non può essere spostato altrove. Quando l'utente interagisce e completa la richiesta della funzione di avviso, la pagina diventa di nuovo interattiva. inert consente agli sviluppatori di ottenere con facilità questa stessa esperienza di concentrazione guidata.

Ecco un piccolo esempio di codice che mostra come funziona:

<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 aspetti come l'esperienza utente del menu laterale scorrevole. Quando un utente scorre fuori dal menu laterale, non consente al mouse o alla tastiera di interagire con la pagina visualizzata. Questo è un po' complicato per gli utenti. Invece, quando viene visualizzato il menu laterale, la pagina deve essere inattiva. Gli utenti devono quindi chiudere o navigare nel menu laterale e non si perderanno mai altrove nella pagina con un menu aperto.

Risorse

Caratteri COLRv1

Prima dei caratteri COLRv1, sul web erano disponibili i caratteri OT-SVG, un altro formato aperto per i caratteri con gradienti ed effetti e colori integrati. Tuttavia, potevano diventare molto grandi e, sebbene consentissero di modificare il testo, non c'era molto spazio per la personalizzazione.

Dopo i caratteri COLRv1, il web ha caratteri di dimensioni ridotte, scalabili vettoriali, riposizionabili, con gradiente e modalità misto che accettano parametri per personalizzare il carattere in base al caso d'uso o per adattarlo a un brand.

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

Ecco un esempio tratto dal post del blog per sviluppatori di Chrome sugli emoji. Forse hai notato che se aumenti le dimensioni del carattere di un'emoji, questa non rimane nitida. Si tratta di un'immagine e non di un'illustrazione vettoriale. Spesso nelle applicazioni, quando viene utilizzata un'emoji, viene sostituita con un asset di qualità superiore. Con i caratteri COLRv1, le emoji sono vettori e bellissime:

I caratteri icona potrebbero fare cose straordinarie con questo formato, offrendo tavolozze di colori duotone personalizzate e altro ancora. Il caricamento di un carattere COLRv1 è come qualsiasi altro file di caratteri:

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

La personalizzazione del carattere COLRv1 viene eseguita con @font-palette-values, un'istruzione at-rule CSS speciale per raggruppare e assegnare un nome a un insieme di opzioni di personalizzazione in un bundle per riferimento futuro. Tieni presente che specifichi un nome personalizzato come una proprietà personalizzata, iniziando con --:

@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 a colori:

@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.
Font 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 variabili e a colori, la tipografia web è sulla strada per una personalizzazione avanzata e un'espressione creativa.

Risorse

Unità dell'area visibile

Illustrazione che mostra come lo schermo del dispositivo, la finestra del browser e un iframe abbiano tutti viewport diversi.

Prima delle nuove varianti dell'area visibile, il web offriva unità fisiche per agevolare l'adattamento delle aree visibili. Ce n'erano uno per altezza, larghezza, dimensione più piccola (vmin) e lato più grande (vmax). Questi metodi hanno funzionato bene per molte cose, ma i browser mobile hanno introdotto una complessità.

Sui dispositivi mobili, quando viene caricata una pagina, viene visualizzata 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 scivolare via per offrire all'utente un'esperienza di visualizzazione più ampia. Tuttavia, quando la barra viene estratta, l'altezza dell'area visibile cambia e le eventuali unità vh si spostano e ridimensionano in base alle dimensioni target modificate. Negli anni successivi, l'unità vh aveva bisogno nello specifico di decidere quale delle due dimensioni dell'area visibile avrebbe utilizzato, perché causava problemi di layout visivo sgradevoli sui dispositivi mobili. È stato stabilito che vh rappresenterà sempre la visualizzazione più grande.

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

Dopo le nuove varianti dell'area visibile, vengono messe a disposizione unità di area visibile piccole, grandi e dinamiche, con l'aggiunta di equivalenti logici a quelle fisiche. L'idea è dare a sviluppatori e designer la possibilità di scegliere l'unità da utilizzare per il proprio scenario. Potrebbe essere accettabile una piccola variazione del layout in modo fastidioso quando la barra di stato scompare, quindi è possibile utilizzare dvh (altezza dell'area visibile dinamica) senza problemi.

Un&#39;immagine con tre telefoni per illustrare DVH, LVH e SVH. Lo smartphone di esempio con DVH ha due linee verticali, una tra la parte inferiore della barra di ricerca e la parte inferiore del viewport e una tra la parte superiore della barra di ricerca (sotto la barra di stato del sistema) e la parte inferiore del viewport. Questo mostra che il DVH può avere una di queste due lunghezze. LVH viene mostrato al centro con una linea tra la parte inferiore della barra di stato del dispositivo e il pulsante della visualizzazione dello smartphone. L&#39;ultima è l&#39;unità SVH di esempio, 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à di visualizzazione rese disponibili con le nuove varianti di visualizzazione:

Unità di misura dell'altezza dell'area visibile
​​.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à di larghezza dell'area visibile
.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 dell'area visibile più piccole
.new-min-viewport-units {
  --size: 100vmin;
  --size: 100dvmin;
  --size: 100svmin;
  --size: 100lvmin;
}
Unità laterali del viewport più grandi
.new-max-viewport-units {
  --size: 100vmax;
  --size: 100dvmax;
  --size: 100svmax;
  --size: 100lvmax;
}

Ci auguriamo che queste informazioni offrano agli sviluppatori e ai designer la flessibilità necessaria per realizzare i loro design responsive del viewport.

Risorse

:has()

Supporto dei browser

  • Chrome: 105.
  • Edge: 105.
  • Firefox: 121.
  • Safari: 15.4.

Origine

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

Dopo :has(), un soggetto più in alto nella struttura ad albero degli elementi può rimanere soggetto fornendo una query sui figli: ul:has(> li). È facile capire come :has() abbia ricevuto il nome comune di "selettore principale", poiché l'oggetto del selettore ora è il principale in questo caso.

Di seguito è riportato 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) {...}

Di seguito è riportato un esempio in cui un elemento <section> è l'oggetto, ma il selettore corrisponde solo se uno degli elementi secondari ha :focus-visible:

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

Il selettore :has() diventa un'utilità fantastica quando si manifestano casi d'uso più pratici. Ad esempio, al momento non è possibile selezionare i tag <a> quando inseriscono un a capo nelle immagini, il che rende difficile insegnare al tag di ancoraggio come modificare i relativi stili in questo caso d'uso. Con :has() è possibile:

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

Si tratta di esempi in cui :has() sembra essere solo un selettore principale. Considera il caso d'uso delle immagini all'interno di elementi <figure> e la modifica degli stili sulle immagini se la figura ha un <figcaption>. Nell'esempio seguente, vengono selezionate le figure con le figcaption e poi le immagini all'interno di questo contesto. :has() viene utilizzato e non cambia l'oggetto, poiché l'oggetto scelto come target sono le immagini e non le figure:

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

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

Il controllo del supporto è semplificato con @supports e la sua funzione selector(), che verifica se il browser comprende la sintassi prima di utilizzarla:

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

Risorse

2022 e oltre

Ci sono ancora molte cose che saranno difficili da fare dopo che tutte queste straordinarie caratteristiche saranno introdotte nel 2022. La sezione successiva esamina alcuni dei problemi rimanenti e le soluzioni in fase di sviluppo per risolverli. Queste soluzioni sono sperimentali, anche se possono essere specificate o disponibili dietro ai flag dei browser.

Il risultato delle sezioni successive dovrebbe essere la certezza che i problemi elencati hanno molte persone di molte aziende che cercano una soluzione, non che queste soluzioni verranno rilasciate nel 2023.

Proprietà personalizzate digitate a mano libera

Supporto dei browser

  • Chrome: 85.
  • Edge: 85.
  • Firefox: 128.
  • Safari: 16.4.

Origine

Le proprietà personalizzate CSS sono fantastiche. Consentono di memorizzare qualsiasi tipo di elemento all'interno di una variabile etichettata, che può essere estesa, calcolata, condivisa e altro ancora. In effetti, sono così flessibili che sarebbe bello averne di meno flessibili.

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

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

Tutto funziona bene finché una delle proprietà non viene modificata in un valore non accettato dal CSS, ad esempio --x: red. L'intera ombra viene interrotta 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 con tipi, non più libera 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 viene tentato --x: red in un secondo momento,red verrà ignorato perché non è un <length>. Ciò significa che l'ombra continua a funzionare anche se è stato assegnato un valore non valido a una delle sue proprietà personalizzate. Anziché non riuscire, torna al suo initial-value di 0px.

Animazione

Oltre alla sicurezza della digitazione, apre anche molte porte per l'animazione. La flessibilità della sintassi CSS rende impossibile l'animazione di alcuni elementi, come 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 eccessivamente complessa. In sostanza, limita l'ambito delle possibilità in quanto un browser può animare aspetti di uno stile che prima non poteva.

Considera questo esempio di demo, in cui viene utilizzato un gradiente radiale per creare una parte di un overlay, creando un effetto di messa a fuoco con faretto. JavaScript imposta le coordinate x e y del mouse quando viene premuto il tasto Alt/Opzione, quindi modifica la dimensione focale in un valore inferiore, ad esempio il 25%, creando il cerchio di messa a fuoco del faretto 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%
  );
}

I gradienti non possono essere animati. Sono troppo flessibili e complessi per essere "semplicemente dedotti" dal browser in base a come vuoi che vengano animati. Tuttavia, con @property, una proprietà può essere digitata e animata in modo isolato, rendendo il browser facilmente comprensibile all'intento.

I videogiochi che utilizzano questo effetto di messa a fuoco animano sempre il cerchio, da uno grande a uno molto piccolo. Ecco come utilizzare @property con la nostra demo in modo che il browser animi la maschera con gradiente:

@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 le dimensioni del gradiente perché abbiamo ridotto la superficie 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 attivazione possono fare molto.

Risorse

Hai visitato min-width o max-width

Prima degli intervalli di query sui dispositivi, una query sui dispositivi CSS utilizza min-width e max-width per esprimere le condizioni superiore e inferiore. Potrebbe avere il seguente aspetto:

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

Dopo gli intervalli di query sui contenuti multimediali, la stessa query sui contenuti multimediali potrebbe avere il seguente aspetto:

@media (width >= 320px) {
  
}

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

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

Dopo gli intervalli di query sui contenuti multimediali, la stessa query sui contenuti multimediali potrebbe avere il seguente aspetto:

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

A seconda delle tue conoscenze di programmazione, uno di questi sarà molto più leggibile rispetto all'altro. Grazie alle aggiunte alle specifiche, gli sviluppatori potranno scegliere quelle che preferiscono o addirittura utilizzarle 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 a variabili statiche durante la creazione.

Dopo @custom-media, CSS consente di creare un alias delle query supporti e di farvi riferimento, proprio come per una proprietà personalizzata.

L'assegnazione di nomi agli elementi è molto importante: consente di allineare lo scopo alla sintassi, semplificando la condivisione e l'utilizzo nei team. Ecco alcune query multimediali personalizzate che mi seguono da un progetto all'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 in questo modo:

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

Puoi trovare un elenco completo di query per i contenuti multimediali personalizzati che utilizzo all'interno della mia libreria di proprietà personalizzate CSS Open Props.

Risorse

I selettori di nidificazione sono bellissimi

Prima di @nest, le stylesheet erano molto ripetitive. È diventata particolarmente difficile quando i selettori erano lunghi e ognuno prendeva di mira piccole differenze. La praticità dell'organizzazione gerarchica è uno dei motivi più comuni per adottare un preprocessore.

Dopo @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);
  }
}

Per me, l'aspetto più importante del nidificazione, oltre a non ripetere article nel selettore nidificato, è che il contesto degli stili rimane all'interno di un blocco di stili. Invece di passare da un selettore e dai relativi stili a un altro selettore con stili (esempio 1), il lettore può rimanere nel contesto di un articolo e vedere i link di proprietà dell'articolo al suo interno. La relazione e l'intenzione di stile vengono messe insieme, quindi article sembra avere i propri stili.

La proprietà può essere considerata anche come centralizzazione. Anziché cercare stili pertinenti in un foglio di stile, puoi trovarli tutti nidificati all'interno di un contesto. Questo metodo funziona con le relazioni genitore-figlio, ma anche con quelle figlio-genitore.

Prendi in considerazione un componente secondario che vuole adattarsi quando si trova in un contesto principale diverso, anziché il componente principale che possiede lo stile e modifica un componente 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 contribuisce a migliorare l'organizzazione, la centralizzazione e la proprietà degli stili. I componenti possono raggruppare e possedere i propri stili, anziché doverli distribuire tra altri blocchi di stile. In questi esempi può sembrare piccolo, ma l'impatto può essere notevole, sia per la praticità che per la leggibilità.

Risorse

È molto difficile definire l'ambito degli stili

Supporto dei browser

  • Chrome: 118.
  • Edge: 118.
  • Firefox: dietro un flag.
  • Safari: 17.4.

Origine

Prima di @scope, esistevano molte strategie perché gli stili in CSS si applicano in cascata, vengono ereditati e hanno ambito globale per impostazione predefinita. Queste funzionalità dei CSS sono molto utili per molte cose, ma per siti e applicazioni complessi, con potenzialmente molti stili di componenti diversi, lo spazio globale e la natura della cascata possono far sembrare gli stili una perdita.

Dopo @scope, gli stili non solo possono limitare l'ambito solo all'interno di un contesto, come una classe, ma possono anche essere articolati dove finiscono gli stili e non possono continuare a cascata o ereditare.

Nell'esempio seguente, l'ambito della convenzione di denominazione BEM può essere invertito nell'intento effettivo. Il selettore BEM sta tentando di applicare il colore di un elemento header a un contenitore .card con convenzioni di denominazione. Ciò richiede che l'intestazione abbia questo nome di classe e completi l'obiettivo. Con @scope, non sono necessarie convenzioni di denominazione per completare lo stesso obiettivo senza eseguire il markup dell'elemento 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ù relativo alla natura di ambito globale del CSS. I temi scuro e chiaro devono coesistere all'interno di un foglio di stile, dove l'ordine è importante per determinare uno stile vincente. In genere, gli stili del tema scuro vengono visualizzati dopo quelli del tema chiaro, in modo che il tema chiaro sia impostato come predefinito e quello scuro come facoltativo. Evita i problemi di ordinamento e ambito con @scope:

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

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

Per completare la storia, @scope consente anche di stabilire dove termina l'ambito dello stile. Non è possibile farlo con convenzioni di denominazione o preprocessori; si tratta di una funzionalità speciale che può essere eseguita solo da CSS integrato nel browser. Nel seguente esempio, gli stili img e .content vengono applicati esclusivamente quando un elemento figlio di un .media-block è un fratello o un elemento principale di .content:

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

  .content {
    padding: 1em;
  }
}

Risorse

Nessun modo CSS per un layout a mattonella

Prima del layout a mattoncini CSS con griglia, JavaScript era il modo migliore per ottenere un layout a mattoncini, poiché qualsiasi metodo CSS con colonne o flexbox rappresentava in modo inaccurato l'ordine dei contenuti.

Dopo la disposizione a mattoni CSS con griglia, non saranno necessarie librerie JavaScript e l'ordine dei contenuti sarà corretto.

Screenshot del layout in muratura che mostra dei numeri che percorrono la parte superiore e poi scendono.
Immagine e demo dalla rivista Smashing
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, inoltre puoi provarla oggi stesso in Firefox.

Risorse

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

Supporto dei browser

  • Chrome: dietro un flag.
  • Edge: dietro un segnale di stop.
  • Firefox: non supportato.
  • Safari: non supportato.

Origine

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

Dopo la query sui media prefers-reduced-data, il CSS può contribuire al miglioramento dell'esperienza utente e svolgere il proprio ruolo nel salvataggio dei dati.

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

Il CSS precedente viene utilizzato in questo componente di scorrimento dei contenuti multimediali e i risparmi possono essere enormi. A seconda delle dimensioni dell'area visibile da visitare, maggiori saranno i risparmi sul caricamento pagina. Il salvataggio continua man mano che gli utenti interagiscono con gli annunci scorrevoli di contenuti multimediali. Tutte le immagini hanno attributi loading="lazy" e, se combinate 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 programmi TV con molte miniature e titoli.

Per il mio test, su un'area visibile di medie dimensioni sono state caricate inizialmente 40 richieste e 700 kB di risorse. Quando un utente scorre la selezione di contenuti multimediali, vengono caricate altre richieste e risorse. Con il CSS e la query multimediale sui dati ridotta, vengono caricate 10 richieste e 172 kB di risorse. Si tratta di mezzo megabyte di risparmio e l'utente non ha nemmeno scorretto i contenuti multimediali, a quel punto non vengono effettuate altre richieste.

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

Questa esperienza con dati ridotti offre più vantaggi rispetto al semplice risparmio di dati. Puoi vedere più titoli e non ci sono immagini di copertina che distraggono. Molti utenti navigano in modalità Risparmio dati perché pagano per megabyte di dati. È bello vedere che CSS sia in grado di aiutarci.

Risorse

Le funzionalità di scorrimento automatico sono troppo limitate

Prima di queste proposte di snap scorrimento, scrivere il proprio codice JavaScript per gestire un carosello, un cursore 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 complicata.

Nuove API

snapChanging()

Questo evento viene attivato non appena il browser rilascia uno snap secondario. In questo modo, la UI riflette la mancanza di un elemento figlio snap e lo stato indefinito dello snap dello scorrevole, poiché ora viene utilizzato e verrà visualizzato in un nuovo punto.

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

Questo evento viene attivato non appena il browser si aggancia a un nuovo elemento secondario e lo scorrimento viene interrotto. In questo modo, qualsiasi UI che dipende dall'elemento secondario 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 al caricamento della pagina è inizialmente nascosta finché non scorri verso l'alto. Questa proprietà CSS consente agli sviluppatori di specificare che uno scorrevole 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 snap 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 snap di scorrimento, creare un cursore, un carosello o una galleria è molto più semplice perché ora il browser offre comodità per l'attività, eliminando gli osservatori e il codice di orchestrazione dello scorrimento a favore dell'utilizzo delle API integrate.

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

Risorse

In bicicletta tra stati noti

Prima di toggle(), potevano essere sfruttati solo gli stati già integrati nel browser per lo stile e l'interazione. L'input della casella di controllo, ad esempio, ha :checked, un stato del browser gestito internamente per l'input che il CSS è in grado di utilizzare per modificare l'elemento visivamente.

Dopo toggle(), è possibile creare stati personalizzati su qualsiasi elemento in modo che il CSS possa modificarli e utilizzarli per gli stili. Consente gruppi, cicli, attivazione/disattivazione dirette e altro ancora.

Nell'esempio seguente viene ottenuto lo stesso effetto di un elemento dell'elenco barrato al completamento, ma senza elementi di casella di controllo:

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

E gli stili toggle() CSS pertinenti:

li {
  toggle-root: check self;
}

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

Se hai familiarità con le macchine a stati, potresti notare quanto sia elevato il grado di sovrapposizione con toggle(). Questa funzionalità consentirà agli sviluppatori di incorporare più stato in CSS, con un conseguente miglioramento dell'orchestrazione dell'interazione e dello stato.

Risorse

Personalizzazione di alcuni elementi

Prima di <selectmenu>, il CSS non aveva la possibilità di personalizzare gli elementi <option> con HTML avanzato o di modificare in modo significativo la visualizzazione di un elenco di opzioni. Ciò ha portato gli sviluppatori a caricare librerie esterne che ricreavano gran parte della funzionalità di un <select>, il che alla fine ha richiesto molto lavoro.

Dopo <selectmenu>, gli sviluppatori possono fornire HTML avanzato per gli elementi di opzione e personalizzarli in base alle proprie esigenze, rispettando al contempo i requisiti di accessibilità e fornendo HTML semantico.

Nel seguente esempio, tratto dalla <selectmenu> pagina informativa, 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>

CSS può scegliere come target e applicare stili alle 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 selezionato con colori di accento rossi.

Puoi provare l'elemento <selectmenu> su Chromium in Canary con il flag degli esperimenti web abilitato. Nel 2023 e oltre, tieni d'occhio gli elementi del menu selezionati personalizzabili.

Risorse

Ancorare un elemento a un altro

Prima di anchor(), le strategie di posizionamento assoluto e relativo erano fornite agli sviluppatori per consentire il movimento degli elementi secondari all'interno di un elemento principale.

Dopo anchor(), gli sviluppatori possono posizionare gli elementi in altri elementi, indipendentemente dal fatto che siano elementi secondari o meno. Inoltre, consente agli sviluppatori di specificare il bordo rispetto al quale eseguire il posizionamento e altre funzionalità per creare relazioni di posizione tra gli elementi.

Nel video esplicativo vengono forniti alcuni ottimi esempi ed esempi di codice, se vuoi scoprire di più.

Risorse