Prova dell'origine per le API pieghevoli

Chrome sta sperimentando due API, l'API Device Posture e l'API Viewport Segment Enumeration, disponibili come prova dell'origine di Chrome 125. note collettivamente come API pieghevoli, progettate per aiutare gli sviluppatori a scegliere come target i dispositivi pieghevoli. Questo post presenta queste API e fornisce informazioni su come iniziare a testarle.

Esistono principalmente due diversi fattori di forma fisica: dispositivi con un singolo schermo flessibile (senza cuciture) e dispositivi con due schermi (con cucitura, noti anche come dispositivi Dual Screen).

Disegno schematico di un dispositivo con un singolo schermo flessibile (senza cuciture) a sinistra e un dispositivo con due schermi (con cucitura, noto anche come doppio schermo) a destra.

Questi dispositivi presentano sfide e opportunità agli sviluppatori. Forniscono altri modi per visualizzare i contenuti. Ad esempio, un utente potrebbe tenere in mano un dispositivo fluido come un libro e poi passare a utilizzarlo come un tablet con uno schermo piatto. I dispositivi con due schermi hanno un join fisico tra gli schermi che potrebbe essere necessario tenere in considerazione.

Queste nuove API consentono agli sviluppatori di offrire esperienze utente migliori per questi dispositivi. Ogni API espone le primitive della piattaforma web necessarie in due modi, tramite CSS e JavaScript.

API Device Posture

I dispositivi pieghevoli hanno funzionalità che consentono loro di cambiare la propria postura o lo stato fisico del dispositivo. Possono modificare il proprio fattore di forma consentendo agli autori di contenuti di fornire un'esperienza utente diversa e queste nuove API assicurano che i contenuti web possano reagire ai vari stati di piegatura.

Un dispositivo può trovarsi in due posizioni:

  • folded: posture del laptop o dei libri.

Disegno schematico di dispositivi in posizioni piatte o tablet e un display curvo senza interruzioni.

  • continuous: display piatti, tablet o persino curvi.

Disegno schematico di dispositivi con postura di laptop o libri.

CSS

La specifica dell'API Device Posture definisce una nuova caratteristica media CSS: device-posture. Questa funzionalità multimediale si risolve in un insieme di posture fisse. Queste posture sono costituite da una serie di valori predefiniti, ognuno dei quali include uno stato fisico del dispositivo.

I valori della funzionalità device-posture corrispondono alla descrizione precedente delle possibili posture:

  • folded
  • continuous

Se sul mercato verranno commercializzati nuovi dispositivi, potrebbero essere aggiunte nuove posture.

Esempi:

/* Using the device in a 'book' posture. */
@media (device-posture: folded) { ... }

/* Using the device in a 'flat' posture, or any typical device like a laptop or
desktop device. */
@media (device-posture: continuous) { ... }

JavaScript

Per eseguire query sulla postura di un dispositivo, è disponibile un nuovo oggetto DevicePosture.

const { type } = navigator.devicePosture;
console.log(`The current device is of type ${type}.`);

Per reagire ai cambiamenti della postura del dispositivo, ad esempio quando un utente apre completamente il dispositivo e passa quindi da folded a continuous, iscriviti agli eventi change.

navigator.devicePosture.addEventListener('change', (e) => {
  console.log(`The device posture changed to type ${e.type}`);
});

API Viewport Segment

I segmenti dell'area visibile sono variabili di ambiente CSS che definiscono la posizione e le dimensioni di una regione logicamente separata dell'area visibile. I segmenti dell'area visibile vengono creati quando l'area visibile è divisa in base a una o più funzionalità hardware (ad esempio una piegatura o una cerniera tra display separati) che fungono da divisore. I segmenti sono le aree dell'area visibile che possono essere trattate come logicamente distinte dall'autore.

CSS

Il numero di divisioni logiche viene esposto tramite due nuove funzionalità multimediali, definite nella specifica di livello 5 delle query multimediali CSS: vertical-viewport-segments e horizontal-viewport-segments. Si risolvono con il numero di segmenti in cui è suddivisa l'area visibile.

Inoltre, sono state aggiunte nuove variabili di ambiente per eseguire query sulle dimensioni di ogni divisione logica. Queste variabili sono:

  • env(viewport-segment-width x y)
  • env(viewport-segment-height x y)
  • env(viewport-segment-top x y)
  • env(viewport-segment-left x y)
  • env(viewport-segment-bottom x y)
  • env(viewport-segment-right x y)

Ogni variabile ha due dimensioni, che rappresentano rispettivamente la posizione x e y nella griglia bidimensionale creata dalle funzionalità hardware che separano i segmenti.

Diagramma che mostra i segmenti orizzontali e verticali. Il primo segmento orizzontale è x 0 e y 0, il secondo x 1 e y 0. Il primo segmento verticale è x 0 e y 0, il secondo x 0 e y 1.
Il primo segmento orizzontale è x 0 e y 0, il secondo x 1 e y 0. Il primo segmento verticale è x 0 e y 0, il secondo x 0 e y 1.

Lo snippet di codice riportato di seguito è un esempio semplificato della creazione di un'esperienza utente divisa in cui sono presenti due sezioni di contenuti (col1 e col2) su ciascun lato della piegatura.

<style>
  /* Segments are laid out horizontally. */
  @media (horizontal-viewport-segments: 2) {
    #segment-css-container {
      flex-direction: row;
    }

    #col1 {
      display: flex;
      flex: 0 0 env(viewport-segment-right 0 0);
      background-color: steelblue;
    }

    #fold {
      width: calc(env(viewport-segment-left 1 0) - env(viewport-segment-right 0 0));
      background-color: black;
      height: 100%;
    }

    #col2 {
      display: flex;
      background-color: green;
    }
  }

  /* Segments are laid out vertically. */
  @media (vertical-viewport-segments: 2) {
    #segment-css-container {
      flex-direction: column;
    }

    #col1 {
      display: flex;
      flex: 0 0 env(viewport-segment-bottom 0 0);
      background-color: pink;
    }

    #fold {
      width: 100%;
      height: calc(env(viewport-segment-top 0 1) - env(viewport-segment-bottom 0 0));
      background-color: black;
    }

    #col2 {
      display: flex;
     background-color: seagreen;
    }
  }
</style>

<div id="segment-css-container">
   <div id="col1"></div>
   <div id="fold"></div>
   <div id="col2"></div>
 </div>

Le seguenti foto mostrano l'esperienza su un dispositivo fisico.

Smartphone pieghevole in posizione verticale.

Smartphone pieghevole con postura a libro orizzontale.

Tablet pieghevole con postura a libro orizzontale.

JavaScript

Per ottenere il numero di segmenti dell'area visibile, controlla la voce segments in visualViewport.

const segments = window.visualViewport.segments;
console.log('The viewport has the following segments:', segments);

Ogni voce nell'array segments rappresenta ogni segmento logico dell'area visibile con un DOMArray che descrive le coordinate e le dimensioni. Il campo segments è uno snapshot dello stato specificato quando viene eseguita una query. Per ricevere valori aggiornati, devi ascoltare le modifiche alla postura o ridimensionare gli eventi ed eseguire nuovamente query sulla proprietà segments.

Prova le API pieghevoli

Le API Foldable sono disponibili in una prova dell'origine da Chrome 125 a Chrome 128. Consulta la guida introduttiva alle prove dell'origine per informazioni di base sulle prove dell'origine.

Per i test locali, le API pieghevoli possono essere abilitate con il flag delle funzionalità della piattaforma web sperimentale all'indirizzo chrome://flags/#enable-experimental-web-platform-features. Può anche essere attivato eseguendo Chrome dalla riga di comando con --enable-experimental-web-platform-features.

Demo

Per le demo, consulta il repository demos. Se non hai un dispositivo fisico con cui eseguire il test, puoi scegliere il dispositivo emulato Galaxy Z Fold 5 o Asus Zenbook Fold in Chrome DevTools e passare dalla modalità Continuo a quella Piegata e viceversa. Puoi anche visualizzare la cerniera, se possibile.

Chrome DevTools che emula un dispositivo pieghevole.