Origin-proefversie voor opvouwbare API's

Chrome test twee API's: de Device Posture API en de Viewport Segments Enumeration API. Deze zijn beschikbaar als een proefversie vanaf Chrome 125. Deze staan ​​gezamenlijk bekend als de Foldable API's en zijn ontworpen om ontwikkelaars te helpen bij het targeten van opvouwbare apparaten. Dit bericht introduceert deze API's en geeft informatie over hoe u ze kunt testen.

Er zijn hoofdzakelijk twee verschillende fysieke vormfactoren: apparaten met één flexibel scherm (naadloos) en apparaten met twee schermen (met naad, ook wel dual screen-apparaten genoemd).

Schematische tekening van een apparaat met aan de linkerkant één flexibel scherm (naadloos) en aan de rechterkant een apparaat met twee schermen (met naad, ook wel dual screen genoemd).

Deze apparaten bieden ontwikkelaars zowel uitdagingen als kansen. Ze bieden extra manieren om content te bekijken. Een gebruiker kan bijvoorbeeld een naadloos apparaat vasthouden als een boek en het vervolgens gebruiken als een tablet met een plat scherm. Apparaten met twee schermen hebben een fysieke verbinding tussen de schermen, waar mogelijk rekening mee moet worden gehouden.

Deze nieuwe API's bieden ontwikkelaars manieren om een ​​betere gebruikerservaring te bieden voor deze apparaten. Elke API maakt de benodigde primitieven voor het webplatform op twee manieren beschikbaar: via CSS en JavaScript.

API voor apparaathouding

Opvouwbare apparaten hebben mogelijkheden waarmee ze hun houding of de fysieke staat van het apparaat kunnen veranderen. Ze kunnen hun vormfactor veranderen, waardoor contentauteurs een andere gebruikerservaring kunnen bieden. Deze nieuwe API's zorgen er bovendien voor dat webcontent kan reageren op de verschillende vouwtoestanden.

Er zijn twee apparaatposities waarin een apparaat zich kan bevinden:

  • folded : Laptop- of boekhouding.

Schematische tekening van apparaten in platte of tabletvorm en een naadloos gebogen display.

  • continuous : Platte, tablet- of zelfs naadloos gebogen displays.

Schematische tekening van apparaten in de houding van een laptop of boek.

CSS

De Device Posture API-specificatie definieert een nieuwe CSS-mediafunctie : device-posture . Deze mediafunctie vertaalt zich naar een set vaste houdingen. Deze houdingen bestaan ​​uit een aantal vooraf gedefinieerde waarden die elk een fysieke status van het apparaat omvatten.

De waarden van de functie device-posture komen overeen met de vorige beschrijving van mogelijke houdingen:

  • folded
  • continuous

In de toekomst kunnen er nieuwe houdingen worden toegevoegd als er nieuwe apparaten op de markt komen.

Voorbeelden:

/* 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

Om de houding van een apparaat op te vragen, is er een nieuw DevicePosture object beschikbaar.

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

Om te reageren op veranderingen in de houding van het apparaat, zoals wanneer een gebruiker het apparaat volledig opent en daardoor van folded naar continuous overgaat, kunt u zich abonneren op change .

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

Viewport Segmenten API

Viewportsegmenten zijn CSS-omgevingsvariabelen die de positie en afmetingen van een logisch gescheiden deel van de viewport definiëren. Viewportsegmenten worden gemaakt wanneer de viewport wordt gesplitst door een of meer hardwarekenmerken (zoals een vouw of scharnier tussen afzonderlijke schermen) die als scheidingslijn fungeren. Segmenten zijn de delen van de viewport die door de auteur als logisch gescheiden kunnen worden beschouwd.

CSS

Het aantal logische segmenten wordt weergegeven via twee nieuwe mediafuncties, gedefinieerd in de CSS Media Queries Level 5-specificatie: vertical-viewport-segments en horizontal-viewport-segments . Deze worden omgezet naar het aantal segmenten waarin de viewport is opgedeeld.

Daarnaast zijn er nieuwe omgevingsvariabelen toegevoegd om de dimensies van elke logische divisie te bevragen. Deze variabelen zijn:

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

Elke variabele heeft twee dimensies, die respectievelijk de x- en y-positie in het tweedimensionale raster weergeven dat wordt gecreëerd door de hardwarekenmerken die de segmenten scheiden.

Diagram met horizontale en verticale segmenten. Het eerste horizontale segment is x 0 en y 0, het tweede x 1 en y 0. Het eerste verticale segment is x 0 en y 0, het tweede x 0 en y 1.
Het eerste horizontale segment is x 0 en y 0, het tweede x 1 en y 0. Het eerste verticale segment is x 0 en y 0, het tweede x 0 en y 1.

Het volgende codefragment is een vereenvoudigd voorbeeld van het maken van een gesplitste UX, waarbij we twee contentsecties (col1 en col2) aan elke kant van de vouw hebben.

<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>

De onderstaande foto's tonen hoe de ervaring eruitziet op een fysiek apparaat.

Opvouwbare telefoon in verticale boekhouding.

Opvouwbare telefoon in horizontale boekhouding.

Opvouwbare tablet in horizontale boekpositie.

JavaScript

Om het aantal viewportsegmenten te achterhalen, controleert u de segments in de visualViewport .

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

Elk item in de segments vertegenwoordigt elk logisch segment van de viewport met een DOMArray die de coördinaten en grootte beschrijft. Het segments is een momentopname van de gegeven status wanneer het wordt opgevraagd. Om bijgewerkte waarden te ontvangen, moet u luisteren naar postuurwijzigingen of gebeurtenissen met betrekking tot formaatwijzigingen en de segments opnieuw opvragen.

Probeer de Foldable API's

De Foldable API's zijn beschikbaar in een origin trial van Chrome 125 tot en met Chrome 128. Zie Aan de slag met origin trials voor achtergrondinformatie over origin trials.

Voor lokale tests kunnen de Foldable API's worden ingeschakeld met de vlag 'Experimental Web Platform Features' op chrome://flags/#enable-experimental-web-platform-features . U kunt de functie ook inschakelen door Chrome vanaf de opdrachtregel uit te voeren met --enable-experimental-web-platform-features .

Demo's

Zie de demo-repository voor demo's. Als je geen fysiek apparaat hebt om mee te testen, kun je in Chrome DevTools kiezen voor het geëmuleerde Galaxy Z Fold 5- of Asus Zenbook Fold- apparaat en schakelen tussen Doorlopend en Gevouwen . Je kunt ook het scharnier visualiseren indien van toepassing.

Chrome DevTools emuleert een opvouwbaar apparaat.