論理プロパティ

CSS ポッドキャスト - 012: 論理プロパティ

非常に一般的なユーザー インターフェース パターンは、インライン アイコンをサポートするテキストラベルです。

アイコンはテキストの左側に配置され、2 つの間には小さなギャップがあります。アイコン上の margin-right によって指定されています。ただし、これはテキスト方向が左から右の場合にのみ機能するため、問題があります。アラビア語のような言語のように、テキストの向きを右から左に変更すると、アイコンがテキストの上に配置されます。

CSS ではこれをどう説明していますか?このような状況は、論理プロパティによって解決できます。国際化が自動的にサポートされ、多くのメリットが得られます。それにより、復元性とインクルーシブなフロントエンドを構築できます。

用語

上、右、下、左の物理プロパティは、ビューポートの物理寸法を表します。これらは、地図上のコンパス ローズのようなものと考えることができます。一方、論理プロパティは、コンテンツの流れに関連するボックスの端を指します。そのため、テキスト方向や書き込みモードが変更されると、変更される場合があります。これは方向スタイルからの大きな変更であり、インターフェースのスタイル設定の柔軟性が増しています。

ブロックフロー

ブロックフローは、コンテンツ ブロックが配置される方向です。たとえば、2 つの段落がある場合、ブロックフローに 2 つ目の段落が入ります。 英語のドキュメントの場合、ブロックフローは上から下に順に行われます。これは、テキストの段落が上から下に連続するコンテキストの場合に考えてください。

「ブロックフロー」というラベルが付いた、下矢印が付いた 3 つのブロックの div 要素

インライン フロー

インライン フローとは、テキスト内の文章の流れのことです。英語のドキュメントでは、インライン フローは左から右になります。ウェブページのドキュメント言語をアラビア語(<html lang="ar">)に変更すると、インライン フローは右から左になります。

「彼女は貝を売っています」という 3 つの単語に、左から右に矢印で「インライン フロー」と書いてある

テキストは、ドキュメントの書き込みモードによって決まる方向に流れます。テキストの配置方向は writing-mode プロパティで変更できます。これは、ドキュメント全体に適用することも、個々の要素に適用することもできます。

相対流量

これまで CSS では、辺の方向を基準としてマージンなどのプロパティしか適用できませんでした。たとえば、margin-top は要素の物理上部に適用されます。 論理プロパティの場合、margin-topmargin-block-start になります。つまり、言語やテキストの方向に関係なく、ブロックフローに適切なマージン ルールがあります。

さまざまなサイズの箱と、各サイズ調整セクションの始点と終点を示した図

サイズ調整

要素が特定の幅と高さを超えないようにするには、次のようなルールを作成します。

.my-element {
  max-width: 150px;
  max-height: 100px;
}

フローに関してこれに相当するものは、max-inline-sizemax-block-size です。min-heightmin-width の代わりに、min-block-sizemin-inline-size を使用することもできます。

論理プロパティを使用すると、この幅と高さの最大ルールは次のようになります。

.my-element {
  max-inline-size: 150px;
  max-block-size: 100px;
}

開始と終了

上、右、下、左などの方向ではなく、開始と終了を使用してください。これにより、ブロック開始、インライン終了、ブロック終了、インライン スタートができます。これらを使用すると、記述モードの変更に対応する CSS プロパティを適用できます。

たとえば、テキストを右揃えにするには、次の CSS を使用します。

p {
  text-align: right;
}

物理的な右側に合わせることではなく、読書の方向の開始位置に揃えることが目的である場合、これは役に立ちません。論理値を使用すると、テキスト方向にマッピングする有用な start 値と end 値を使用できます。テキストの配置ルールは次のようになります。

p {
  text-align: end;
}

間隔と配置

marginpaddinginset の論理プロパティにより、要素の配置と、書き込みモードでのこれらの要素の相互作用をより簡単かつ効率的に決定できるようになります。マージンとパディングに関連するプロパティは引き続き方向への直接マッピングですが、主な違いは、書き込みモードが変更されるとそれに応じて変更されることです。

.my-element {
  padding-top: 2em;
  padding-bottom: 2em;
  margin-left: 2em;
  position: relative;
  top: 0.2em;
}

これにより、padding で垂直の内部スペースが追加され、margin で左側から押し出されます。top プロパティも値を下にシフトします。同等の論理プロパティを使用すると、次のようになります。

.my-element {
  padding-block-start: 2em;
  padding-block-end: 2em;
  margin-inline-start: 2em;
  position: relative;
  inset-block-start: 0.2em;
}

これにより、padding でインラインの内部スペースが追加され、margin でインライン スタートから押し出されます。inset-block プロパティは、ブロックの先頭から内側に移動します。

論理プロパティを持つ省略形のオプションは inset-block プロパティだけではありません。マージンとパディング プロパティの簡略版を使用すると、このルールをさらに縮小できます。

.my-element {
  padding-block: 2em;
  margin-inline: 2em 0;
  position: relative;
  inset-block: 0.2em 0;
}

枠線

borderborder-radius の追加は、論理プロパティを使用して行うこともできます。右下と右に半径を指定して枠線を追加するには、次のようなルールを作成します。

.my-element {
  border-bottom: 1px solid red;
  border-right: 1px solid red;
  border-bottom-right-radius: 1em;
}

または、次のように論理プロパティを使用することもできます。

.my-element {
  border-block-end: 1px solid red;
  border-inline-end: 1px solid red;
  border-end-end-radius: 1em;
}

border-end-end-radiusend-end はブロックの終点であり、かつインラインの終点です。

単位

論理プロパティには、vivb という 2 つの新しい単位があります。vi ユニットは、インライン方向のビューポート サイズの 1% です。非論理プロパティで同等のプロパティは vw です。 vb 単位は、ブロック方向のビューポートの 1% です。非論理プロパティで同等のプロパティは vh です。

これらの単位は常に読み取り方向にマッピングされます。 たとえば、ビューポートの使用可能なインライン スペースの 80% を要素が占めるようにする場合に、vi ユニットを使用すると、書き込みモードが縦向きの場合に、そのサイズが上から下に自動的に切り替わります。

論理プロパティを実用的に使用する

論理プロパティと書き込みモードは、単に国際化を行うためだけのものではありません。これらを使用すると、より汎用性の高いユーザー インターフェースを作成できます。

X 軸と Y 軸にラベルがあるグラフでは、Y ラベルのテキストが垂直方向に読み取られるようにすることができます。

デモの Y 軸ラベルの writing-modevertical-rl であるため、両方のラベルで同じ margin 値を使用できます。ブロックの開始位置は Y 軸では右側、X 軸では上であるため、margin-block-start 値は両方のラベルに適用されます。ブロックの始点側はわかりやすいように赤い枠線で示されています。

アイコンの問題を解決する

ここまでが論理プロパティについて説明しました。この知識は最初に検討した設計問題に応用できます。

p {
  display: inline-flex;
  align-items: center;
}

p svg {
  width: 1.2em;
  height: 1.2em;
  margin-right: 0.5em;
  flex: none;
}

余白はアイコン要素の右側に適用されています。 すべての読み上げ方向をサポートするために、アイコンとテキストの間隔を空けるには、代わりに margin-inline-end プロパティを使用する必要があります。

p {
  display: inline-flex;
  align-items: center;
}

p svg {
  width: 1.2em;
  height: 1.2em;
  margin-inline-end: 0.5em;
  flex: none;
}

これで、読み上げの方向に関係なく、アイコン自体の配置と間隔を適切に調整できるようになりました。

理解度チェック

論理プロパティの知識をテストする

手で書き込むとき、手首はどの論理軸を動いていますか?

inline
単語はインラインで流れるため、書くときは手を動かす必要があります。
block
コンテンツはブロックとして流れ、手首はこの軸に沿って動き、1 つのコンテンツ タイプを終了して別のコンテンツ タイプを開始します。

論理プロパティのメリットを享受できるものをすべて選択してください

ドキュメント書き込みモードが変化しても、色は変化しません。
alignment
例: flex-startblock-endinline-start
ドキュメント書き込みモードがあっても、シャドウは変わりません。
箱の側面
例: block-startinline
sizes
例: inline-sizemax-block-size
箱の角
例: border-end-end-radius

下線が引かれているのは、単語の論理的な部分のうちどちらですか?

インライン開始
この場合、英語の単語の左側に下線が引かれます。
インライン終了
この場合、英語の単語の右側に下線が引かれます。
ブロックの開始
この場合、英語の単語の上に下線が引かれます。
ブロック終了
CSS がこうした配置を代行してくれるのは素晴らしいことです。