Verbesserungen beim logischen Layout mit flussbezogenen Kurzzeichen

Neue logische Property-Kürzel und neue Inset-Properties für Chromium.

Oriol Brufau
Oriol Brufau

Seit Chromium 69 (3. September 2018) können Entwickler mit logischen Eigenschaften und Werten die Kontrolle über ihre internationalen Layouts behalten. Dazu verwenden sie logische statt physischer Richtungs- und Dimensionsstile. In Chromium 87 wurden Abkürzungen und Offsets eingeführt, um das Schreiben dieser logischen Attribute und Werte zu vereinfachen. Damit wird Chromium an Firefox angeglichen, wo die Unterstützung für die Kurzformen seit Version 66 verfügbar ist. In der Technologievorschau von Safari sind sie bereits verfügbar.

Auf einem Gerätebildschirm wird Platzhaltertext in lateinischer, hebräischer und japanischer Schrift dargestellt. Pfeile und Farben folgen dem Text, um die beiden Richtungen von Block und Inline zu veranschaulichen.

Dokumentfluss

Wenn Sie bereits mit logischen Eigenschaften, Inline- und Blockachsen vertraut sind und keine Auffrischung benötigen, können Sie direkt zum nächsten Abschnitt springen. Andernfalls finden Sie hier eine kurze Auffrischung.

Im Deutschen werden Buchstaben und Wörter von links nach rechts geschrieben, während Absätze von oben nach unten angeordnet werden. Im traditionellen Chinesisch werden Buchstaben und Wörter von oben nach unten und Absätze von rechts nach links gestapelt. In diesen beiden Fällen wird durch CSS, das „margin-top“ für einen Absatz festlegt, nur ein Sprachstil richtig formatiert. Wenn die Seite aus dem Englischen ins traditionelle Chinesische übersetzt wird, ist der Rand im neuen vertikalen Schreibmodus möglicherweise nicht sinnvoll.

Daher ist die physische Seite der Box international nicht sehr nützlich. So beginnt der Prozess der Unterstützung mehrerer Sprachen. Dabei lernen wir die physischen und logischen Seiten des Boxmodells kennen.

Haben Sie das p-Element schon einmal in den Chrome-Entwicklertools untersucht? Wenn ja, haben Sie vielleicht bemerkt, dass die Standard-User-Agent-Stile nicht physisch, sondern logisch sind.

p {
  margin-block-start: 1em;
  margin-block-end: 1em;
  margin-inline-start: 0px;
  margin-inline-end: 0px;
}

CSS aus dem User-Agent-Stylesheet von Chromium

Der Rand befindet sich nicht oben oder unten, wie ein englischsprachiger Leser vielleicht annehmen würde. Es ist block-start und block-end. Diese logischen Eigenschaften entsprechen der oberen und unteren Seite für einen englischsprachigen Leser, aber auch der rechten und linken Seite für einen japanischsprachigen Leser. Einmal geschrieben, überall einsetzbar.

Der normale Ablauf ist, wenn die Webseite absichtlich Teil dieser Multidirektionalität ist. Wenn Seiteninhalte entsprechend Änderungen der Dokumentrichtung aktualisiert werden, werden das Layout und seine Elemente als im Fluss betrachtet. Weitere Informationen zu „im Fluss“ und „außerhalb des Flusses“ finden Sie auf MDN oder in der CSS Display Module-Spezifikation. Logische Eigenschaften müssen zwar nicht im Fluss sein, aber sie übernehmen einen Großteil der Arbeit für Sie, wenn sich die Richtung ändert. Der Begriff „Flow“ impliziert eine Richtung, in die sich Buchstaben, Wörter und Inhalte bewegen müssen. Daher verwenden wir Block- und Inline-Anweisungen.

Die Blockrichtung ist die Richtung, in die neue Inhaltsblöcke fließen. Sie können sich beispielsweise fragen: „Wo soll der nächste Absatz eingefügt werden?“ Sie können sich das als „Inhaltsblock“ oder „Textblock“ vorstellen. In jeder Sprache werden die Blöcke entsprechend der jeweiligen block-axis angeordnet und sortiert. block-start ist die Seite, auf der ein Absatz zuerst platziert wird, während block-end die Seite ist, auf die neue Absätze fließen.

In der traditionellen japanischen Handschrift verläuft die Blockrichtung beispielsweise von rechts nach links:

Die Inline-Richtung ist die Richtung, in die Buchstaben und Wörter verlaufen. Stellen Sie sich vor, in welche Richtung sich Ihr Arm und Ihre Hand bewegen, wenn Sie schreiben. Sie bewegen sich entlang der inline-axis. inline-start ist die Seite, auf der Sie mit dem Schreiben beginnen, und inline-end ist die Seite, auf der das Schreiben endet oder umgebrochen wird. Im obigen Video verläuft die inline-axis von oben nach unten. Im nächsten Video verläuft sie jedoch von rechts nach links.inline-axis

flow-relative bedeutet, dass die für eine Sprache geschriebenen Stile kontextbezogen sind und angemessen auf andere Sprachen angewendet werden. Die Inhalte werden entsprechend der Sprache, für die sie bereitgestellt werden, angezeigt.

Neue Abkürzungen

Einige der folgenden Abkürzungen sind keine neuen Funktionen für den Browser, sondern einfachere Möglichkeiten, Stile zu schreiben, da Werte gleichzeitig für Block- oder Inline-Ränder festgelegt werden können. Die logischen inset-*-Eigenschaften bieten neue Möglichkeiten, da es zuvor keine Langform gab, um absolute Positionen mit logischen Eigenschaften anzugeben. Einzüge und Kurzschreibweisen fließen (hehe) so gut zusammen, dass ich dir alle neuen logischen Eigenschaften, die in Chromium 87 eingeführt werden, auf einmal vorstellen werde.

Kurzschreibweisen für Ränder

Es wurden keine neuen Funktionen eingeführt, aber einige sehr praktische Kürzel:
margin-block und margin-inline.

Handschriftlich
margin-block-start: 2ch;
margin-block-end: 2ch;
Neue Kurzschreibweise
margin-block: 2ch;
/* or */
margin-block: 2ch 2ch;

Bisher gab es keine Kurzform für „oben und unten“ oder „links und rechts“. Wahrscheinlich verweisen Sie mit der Kurzform margin: 10px; auf alle vier Seiten. Jetzt können Sie ganz einfach mit der Kurzform für logische Eigenschaften auf zwei komplementäre Seiten verweisen.

Handschriftlich
margin-inline-start: 4ch;
margin-inline-end: 2ch;
Neue Kurzschreibweise
margin-inline: 4ch 2ch;

Padding-Kürzel

Es wurden keine neuen Funktionen eingeführt, aber einige sehr praktische Abkürzungen:
padding-block und padding-inline.


Handschriftlich
padding-block-start: 2ch;
padding-block-end: 2ch;
Neue Kurzschreibweise
padding-block: 2ch;
/* or */
padding-block: 2ch 2ch;

Und das inline kostenlose Set mit Kürzeln:

Handschriftlich
padding-inline-start: 4ch;
padding-inline-end: 2ch;
Neue Kurzschreibweise
padding-inline: 4ch 2ch;

Einrückung und Kurzformen

Die physischen Eigenschaften top, right, bottom und left können alle als Werte für die Eigenschaft inset geschrieben werden. Bei jedem Wert von position kann es sinnvoll sein, die Seiten mit „inset“ festzulegen.

.cover {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  inset: 0;
}


Handschrift
position: absolute;
top: 1px;
right: 2px;
bottom: 3px;
left: 4px;
Neue physische Kurzform
position: absolute;
inset: 1px 2px 3px 4px;

Das sollte sofort praktisch aussehen. „Inset“ ist die Kurzform für die physischen Seiten und funktioniert wie „margin“ und „padding“.

Neue Funktionen

Die Kurzschreibweise für die physischen Seiten ist zwar spannend, aber die logischen Funktionen, die durch zusätzliche inset-Kurzschreibweisen bereitgestellt werden, sind noch interessanter. Diese Kurzformen erleichtern die Texterstellung für Entwickler (sie sind kürzer zu schreiben), erhöhen aber auch die potenzielle Reichweite des Layouts, da sie flussbezogen sind.

Handschrift
position: absolute;
top: 10px;
bottom: 10px;
Logische Kurzform
position: absolute;
inset-block: 10px;


Handschrift
position: absolute;
left: 10px;
right: 20px;
Logische Kurzform
position: absolute;
inset-inline: 10px 20px;

Weitere Informationen und eine vollständige Liste der Kurz- und Langschreibweisen für „inset“ finden Sie auf MDN.

Kurzschreibweisen für Rahmen

Für den Rahmen und die zugehörigen verschachtelten Attribute color, style und width gibt es ebenfalls neue logische Kurzschreibweisen.


Handschrift
border-top-color: hotpink;
border-bottom-color: hotpink;
Logische Kurzform
border-block-color: hotpink;
/* or */
border-block-color: hotpink hotpink;


Handschrift
border-left-style: dashed;
border-right-style: dashed;
Logische Kurzform
border-inline-style: dashed;
/* or */
border-inline-style: dashed dashed;


Handschrift
border-left-width: 1px;
border-right-width: 1px;
Logische Kurzform
border-inline-width: 1px;
/* or */
border-inline-width: 1px 1px;

Weitere Informationen und eine vollständige Liste der Kurz- und Langschreibweisen für Rahmen finden Sie auf MDN.

Beispiel für die logische Property <figure>

Sehen wir uns ein kleines Beispiel an. Mit logischen Eigenschaften kann ein Bild mit einer Bildunterschrift so angeordnet werden, dass verschiedene Schreib- und Dokumentrichtungen berücksichtigt werden.

Oder probieren Sie es einfach aus.

Sie müssen nicht viel tun, um eine Karte mit einem <figure> und einigen logischen Eigenschaften international responsiv zu machen. Wenn Sie wissen möchten, wie all diese international ausgerichteten CSS zusammenarbeiten, hoffe ich, dass dies eine kleine, aber aussagekräftige Einführung war.

Polyfilling und browserübergreifende Unterstützung

Die Cascade- oder Build-Tools sind geeignete Optionen, um alte und neue Browser mit aktualisierten logischen Eigenschaften richtig zu formatieren. Bei Fallbacks für die Kaskade folgt auf eine physische Property eine logische. Der Browser verwendet dann die „letzte“ Property, die er bei der Stilauflösung gefunden hat.

p {
  /* for unsupporting browsers */
  margin-top: 1ch;
  margin-bottom: 2ch;

  /* for supporting browsers to use */
  /* and unsupporting browsers to ignore and go 🤷‍♂️ */
  margin-block: 1ch 2ch;
}

Das ist jedoch nicht ganz die Lösung für alle. Hier ist ein handschriftlicher Fallback, der den Pseudoselektor :lang() verwendet, um auf bestimmte Sprachen auszurichten, den physischen Abstand entsprechend anzupassen und am Ende den logischen Abstand für unterstützende Browser anzubieten:

/* physical side styles */
p {
  margin-top: 1ch;
  margin-bottom: 2ch;
}

/* adjusted physical side styles per language */
:lang(ja) {
  p {
    /* zero out styles not useful for traditional Japanese */
    margin-top: 0;
    margin-bottom: 0;

    /* add appropriate styles for traditional Japanese */
    margin-right: 1ch;
    margin-left: 2ch;
  }
}

/* add selectors and adjust for languages all supported */
:lang(he) {}
:lang(mn) {}

/* Logical Sides */
/* Then, for supporting browsers to use */
/* and unsupporting browsers to ignore #TheCascade */
p {
  /* remove any potential physical cruft.. */
  margin: 0;
  /* explicitly set logical value */
  margin-block: 1ch 2ch;
}

Sie können auch @supports verwenden, um festzulegen, ob Fallbacks für physische Eigenschaften bereitgestellt werden sollen:

p {
  margin-top: 1ch;
  margin-bottom: 2ch;
}

@supports (margin-block: 0) {
  p {
    margin-block: 1ch 2ch;
  }
}

Sass, PostCSS und Emotion bieten automatisierte Bundler- und/oder Build-Time-Angebote mit einer Vielzahl von Fallbacks oder Lösungen. Sehen Sie sich die einzelnen Optionen an, um herauszufinden, welche zu Ihrer Toolchain und Ihrer allgemeinen Websitestrategie passt.

Nächste Schritte

In Zukunft werden noch mehr CSS-Funktionen logische Properties bieten. Es gibt jedoch eine große Gruppe von Abkürzungen, die noch fehlt. Eine Lösung steht noch aus. Weitere Informationen Es gibt eine vorübergehende Lösung in einem Entwurf. Was ist, wenn Sie alle logischen Seiten eines Felds mit einer Kurzform formatieren möchten?

Physische Kurzeingabe
margin: 1px 2px 3px 4px;
margin: 1px 2px;
margin: 2px;
Logische Kurzform
margin: logical 1px 2px 3px 4px;
margin: logical 1px 2px;
margin: logical 2px;

Im aktuellen Vorschlag müssten Sie logical in jeder Kurzform schreiben, damit das logische Äquivalent angewendet wird. Das klingt für einige nicht sehr DRY.

Es gibt auch andere Vorschläge, die Änderung auf Block- oder Seitenebene vorzunehmen, aber dadurch könnten logische Verwendungen in Stile gelangen, die immer noch physische Seiten voraussetzen.

html {
  flow-mode: physical;
  /* or */
  flow-mode: logical;
  /* now all margin/padding/etc references are logical */
}

/* hopefully no 3rd/1st party code is hard coded to top/left/etc ..? */

Das ist wirklich nicht einfach. Geben Sie Ihre Stimme ab und sagen Sie uns Ihre Meinung.

Möchten Sie mehr über logische Eigenschaften erfahren? Hier findest du eine ausführliche Referenz 🤓

Feedback