Ursprungstest für faltbare APIs

Chrome testet zwei APIs, die Device Posture API und die Viewport Segments Enumeration API, die als Ursprungstest von Chrome 125 verfügbar sind. Diese werden zusammen als Foldable APIs bezeichnet und sollen Entwicklern dabei helfen, ihre Apps auf faltbare Geräte auszurichten. In diesem Beitrag werden diese APIs vorgestellt und Sie erfahren, wie Sie mit dem Testen beginnen.

Es gibt hauptsächlich zwei verschiedene physische Formfaktoren: Geräte mit einem einzigen flexiblen Bildschirm (nahtlos) und Geräte mit zwei Bildschirmen (mit Naht, auch als Dual Screen-Geräte bezeichnet).

Schematische Darstellung eines Geräts mit einem einzelnen flexiblen Bildschirm (nahtlos) auf der linken Seite und eines Geräts mit zwei Bildschirmen (mit Nahtstelle, auch als Dual Screen bezeichnet) auf der rechten Seite.

Diese Geräte stellen Entwickler vor Herausforderungen und bieten ihnen Chancen. Sie bieten zusätzliche Möglichkeiten, Inhalte anzusehen. Zum Beispiel könnte ein Nutzer ein nahtloses Gerät wie ein Buch halten und dann zu einem Tablet mit einem flachen Bildschirm wechseln. Geräte mit zwei Bildschirmen haben eine physische Verbindung zwischen den Bildschirmen, die möglicherweise berücksichtigt werden muss.

Mit diesen neuen APIs können Entwickler die Nutzerfreundlichkeit für diese Geräte verbessern. Jede API stellt die erforderlichen Webplattform-Primitive auf zwei Arten zur Verfügung: über CSS und JavaScript.

Device Posture API

Faltbare Geräte haben Funktionen, mit denen sich ihre _Position_ oder der physische Zustand des Geräts ändern lässt. Sie können ihren Formfaktor ändern, sodass die Inhaltsautoren eine andere Nutzererfahrung bieten können. Mit diesen neuen APIs können Webinhalte auf die verschiedenen Faltzustände reagieren.

Es gibt zwei Gerätestatus:

  • folded: Laptop- oder Buchhaltungen.

Schematische Darstellung von Geräten in flacher Haltung oder Tablethaltung mit nahtlos gebogenem Display

  • continuous: Flache, Tablet- oder sogar nahtlos gewölbte Displays.

Schematische Zeichnung von Geräten in Laptop- oder Buchhaltung.

CSS

Die Device Posture API-Spezifikation definiert eine neue CSS-Medienfunktion: device-posture. Diese Medienfunktion wird in eine Reihe fester Körperhaltungen aufgelöst. Diese Haltungen bestehen aus einer Reihe von vordefinierten Werten, die jeweils einen physischen Zustand des Geräts umfassen.

Die Werte des device-posture-Attributs stimmen mit der vorherigen Beschreibung der möglichen Körperhaltungen überein:

  • folded
  • continuous

Wenn neue Geräte auf den Markt kommen, können in Zukunft weitere Körperhaltungen hinzugefügt werden.

Beispiele:

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

Für die Abfrage der Ausrichtung eines Geräts ist ein neues DevicePosture-Objekt verfügbar.

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

Wenn Sie auf Änderungen der Geräteposition reagieren möchten, z. B. wenn ein Nutzer ein Gerät vollständig öffnet und sich daher von folded zu continuous bewegt, abonnieren Sie change-Ereignisse.

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

Viewport Segments API

Die Darstellungsbereichssegmente sind CSS-Umgebungsvariablen, die die Position und die Abmessungen einer logisch getrennten Region des Darstellungsbereichs definieren. Viewport-Segmente werden erstellt, wenn der Viewport durch eine oder mehrere Hardwarefunktionen (z. B. ein Scharnier zwischen separaten Displays) geteilt wird, die als Trennlinie dienen. Segmente sind die Regionen des Darstellungsbereichs, die vom Autor als logisch unterschiedlich behandelt werden können.

CSS

Die Anzahl der logischen Unterteilungen wird über zwei neue Medienfunktionen angegeben, die in der CSS Media Queries Level 5-Spezifikation definiert sind: vertical-viewport-segments und horizontal-viewport-segments. Sie entsprechen der Anzahl der Segmente, in die der Darstellungsbereich unterteilt ist.

Außerdem wurden neue Umgebungsvariablen hinzugefügt, um die Dimensionen der einzelnen logischen Abteilungen abzufragen. Das sind:

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

Jede Variable hat zwei Dimensionen, die jeweils die x- bzw. y-Position in dem zweidimensionalen Raster darstellen, das durch die Hardwarefunktionen erstellt wird, die die Segmente trennen.

Diagramm mit horizontalen und vertikalen Segmenten. Das erste horizontale Segment hat die Koordinaten x 0 und y 0, das zweite x 1 und y 0. Das erste vertikale Segment ist x 0 und y 0, das zweite x 0 und y 1.
Das erste horizontale Segment ist x 0 und y 0, das zweite x 1 und y 0. Das erste vertikale Segment ist x 0 und y 0, das zweite x 0 und y 1.

Das folgende Code-Snippet ist ein vereinfachtes Beispiel für die Erstellung einer geteilten UX, bei der auf jeder Seite des Folds zwei Inhaltsbereiche (col1 und col2) vorhanden sind.

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

Die folgenden Fotos zeigen, wie die Funktion auf einem physischen Gerät aussieht.

Faltbares Smartphone in vertikaler Buchhaltung.

Ein faltbares Smartphone im horizontalen Buchformat.

Zusammenklappbares Tablet in horizontaler Buchposition.

JavaScript

Die Anzahl der Ansichtssegmente finden Sie im Feld segments unter visualViewport.

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

Jeder Eintrag im segments-Array steht für ein logisches Segment des Darstellungsbereichs mit einer DOMArray, die die Koordinaten und die Größe beschreibt. Das Feld segments ist ein Snapshot des angegebenen Status bei der Abfrage. Wenn Sie aktualisierte Werte erhalten möchten, müssen Sie Änderungen der Haltung oder der Größe überwachen und die Property segments noch einmal abfragen.

Foldable APIs testen

Die Foldable APIs sind in einem Ursprungstest von Chrome 125 bis Chrome 128 verfügbar. Unter Erste Schritte mit Ursprungstests finden Sie Hintergrundinformationen zu Ursprungstests.

Für lokale Tests können die Foldable APIs mit der Flag „Experimental Web Platform features“ unter chrome://flags/#enable-experimental-web-platform-features aktiviert werden. Sie können die Funktion auch aktivieren, indem Sie Chrome über die Befehlszeile mit --enable-experimental-web-platform-features ausführen.

Demos

Demos finden Sie im Repository für Demos. Wenn Sie kein physisches Gerät zum Testen haben, können Sie in den Chrome-Entwicklertools das emulierte Gerät Galaxy Z Fold 5 oder Asus Zenbook Fold auswählen und zwischen Continuous (Kontinuierlich) und Folded (Zugeklappt) wechseln. Sie können auch das Scharnier visualisieren, falls zutreffend.

Chrome-Entwicklertools, die ein faltbares Gerät emulieren