Prova dell'origine per le API pieghevoli

Chrome sta provando due API, l'API Device Posture e l'API Viewport Audiences Enumration, che sono disponibili come prova dell'origine da Chrome 125. note collettivamente come API pieghevoli, progettate per aiutare gli sviluppatori a scegliere come target i dispositivi pieghevoli. Questo post illustra queste API e fornisce informazioni su come iniziare a testarle.

Esistono principalmente due diversi fattori di forma fisici: dispositivi con un singolo schermo flessibile (senza giunture) e dispositivi con due schermi (con cucitura, anche noti come dispositivi dual screen).

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

Questi dispositivi presentano sfide e opportunità per gli sviluppatori. Forniscono ulteriori modalità di visualizzazione dei contenuti. Ad esempio, un utente potrebbe tenere in mano un dispositivo senza giunture come un libro e poi passare a utilizzarlo come un tablet con schermo piatto. I dispositivi con due schermi presentano un join fisico tra gli schermi che potrebbe dover essere preso 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 loro posizione, ovvero lo stato fisico del dispositivo. Possono modificare il fattore di forma consentendo agli autori dei contenuti di offrire un'esperienza utente diversa e queste nuove API assicurano che i contenuti web possano reagire ai vari stati di folding.

Un dispositivo può trovarsi in due posizioni:

  • folded: posture laptop o libri.

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

  • continuous: display piatti, tablet o anche curvi in modo fluido.

Disegno schematico di dispositivi su posizioni di laptop o libri.

CSS

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

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

  • folded
  • continuous

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

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 posizione del dispositivo, ad esempio quando un utente apre completamente un 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 Audiences

I segmenti dell'area visibile sono variabili di ambiente CSS che definiscono la posizione e le dimensioni di una regione dell'area visibile logicamente separata. I segmenti dell'area visibile vengono creati quando l'area visibile è suddivisa 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 è esposto tramite due nuove funzionalità multimediali, definite nella specifica CSS Media Queries Livello 5: vertical-viewport-segments e horizontal-viewport-segments. Risolve il numero di segmenti in cui è suddiviso 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 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.

Il seguente snippet di codice è un esempio semplificato di creazione di un'esperienza utente suddivisa in cui sono presenti due sezioni di contenuti (col1 e col2) su ciascun lato del fold.

<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 foto che seguono mostrano l'esperienza su un dispositivo fisico.

Smartphone pieghevole in posizione verticale a libro.

Smartphone pieghevole in posizione orizzontale a libro.

Tablet pieghevole in posizione 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 del viewport con una DOMArray che descrive le coordinate e le dimensioni. Il campo segments è un'istantanea dello stato specificato quando viene eseguita la query. Per ricevere valori aggiornati devi ascoltare le modifiche alla postura o ridimensionare gli eventi ed eseguire una nuova query sulla proprietà segments.

Prova le API pieghevoli

Le API pieghevoli sono disponibili in una prova dell'origine da Chrome 125 a Chrome 128. Consulta la pagina Iniziare a utilizzare le 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. Per attivarlo, può anche eseguire Chrome dalla riga di comando con --enable-experimental-web-platform-features.

Demo

Per le demo, consulta il repository demo. 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 da Continuo a Folded. Puoi anche visualizzare la cerniera se possibile.

Chrome DevTools che emula un dispositivo pieghevole.