CSS 書字方向レベル 4

W3C 勧告候補、

現バージョン:
https://www.w3.org/TR/2019/CR-css-writing-modes-4-20190730/
最新公開バージョン:
https://www.w3.org/TR/css-writing-modes-4/
編集者草案:
https://drafts.csswg.org/css-writing-modes-4/
以前のバージョン:
テストスイート:
http://test.csswg.org/suites/css-writing-modes-3_dev/nightly-unstable/
課題追跡:
トラッカー
仕様内
GitHub の課題
編集者:
Elika J. Etemad / fantasai (招聘専門家)
(Google)
以前の編集者:
(Antenna House)
(Microsoft)
(Microsoft)
この仕様の編集を提案:
GitHub エディター

概要

CSS 書字方向レベル 4 は、さまざまな書字モードとその組み合わせに対する CSS のサポートを定義します。これには、 左から右および右から左へのテキスト順序、ならびに横書きおよび縦書きの向きが含まれます。

CSS は、構造化文書 (HTML や XML など)が画面や紙などにどのようにレンダリングされるかを 記述するための言語です。

この文書の位置付け

この節では、この文書の公開時点における位置付けについて説明します。 この文書は、他の文書によって置き換えられることがあります。 現在の W3C 公開文書の一覧と、この技術報告書の最新改訂版は、 https://www.w3.org/TR/ にある W3C 技術報告書一覧で 確認できます。

この文書は、CSS ワーキンググループによって 勧告候補として作成されました。この文書は W3C 勧告となることを意図しています。 幅広いレビューの機会を確保するため、この文書は少なくとも まで 勧告候補のままとなります。

この仕様に関する議論には、GitHub の課題が推奨されます。 課題を登録するときは、タイトルに「css-writing-modes」というテキストを含めてください。 できれば、次のようにしてください: 「[css-writing-modes] …コメントの要約…」。 すべての課題とコメントはアーカイブされており、 過去のアーカイブもあります。

実装報告書の草案はまだ利用できません。

勧告候補として公開されたことは、W3C 会員による承認を意味するものではありません。これは草案文書であり、いつでも他の文書によって 更新、置換、または廃止される可能性があります。この文書を 進行中の作業以外のものとして引用することは不適切です。

この文書は、 W3C 特許ポリシーの下で活動するグループによって作成されました。 W3C は、グループの成果物に関連して行われた特許開示の 公開一覧を管理しています。 そのページには、特許を開示するための手順も記載されています。 本人が必須請求項を含むと考える特許について実際に知っている個人は、 その情報をW3C 特許ポリシーの第 6 節に従って開示しなければなりません。

この文書には、2019年3月1日付 W3C プロセス文書が適用されます。

前回の草案以降の変更については、 変更点の節を参照してください。

次の機能はリスクありとされ、CR 期間中に削除される可能性があります:

「リスクあり」は W3C プロセスの専門用語であり、その機能が削除または延期される危険にあることを必ずしも 意味するものではありません。これは、WG がその機能を適時に相互運用可能な形で実装することは困難かもしれないと 考えており、そのようにマークすることで、WG は勧告案段階に移行するとき、必要に応じてその機能を 削除でき、その機能を含まない新たな勧告候補を事前に公開する必要が なくなることを意味します。

1. 書字モード入門

CSS 書字方向レベル 4 は、さまざまな言語の 書字モードをサポートする CSS 機能を定義します。これには、左から右(ラテン文字やインド系文字など)、右から左 (ヘブライ文字やアラビア文字など)、双方向(ラテン文字とアラビア文字の混在など)、および 縦書き(アジアの用字系など)が含まれます。

CSS における書字モードは、 writing-modedirection、およびtext-orientationプロパティによって決定されます。これは主として、 インライン基底方向ブロックフロー方向の観点から定義されます:

インライン基底 方向は、行内で内容が配列される主要な方向であり、 行の「始端」と「終端」がどちら側にあるかを定義します。directionプロパティは、ボックスの インライン基底方向を指定し、unicode-bidiプロパティおよび テキスト内容に固有の方向性とともに、 行内のインラインレベルの内容の順序を決定します。

ブロックフロー 方向は、ブロックレベルボックスが積み重なる方向、および ブロックコンテナー内で行ボックスが積み重なる方向です。writing-modeプロパティは、 ブロックフロー方向を決定します。

組版モードは、 縦書き 用字系に対して、縦方向のフローに固有の組版規則をテキストに適用すべきかどうかを 決定します。 この概念は、縦書き用字系の縦方向のフローを 回転させた横方向のフローから 区別します。

横書き モードは、テキストの行が水平である書字モード、 すなわち下向きまたは上向きのブロックフローです。 縦書き モードは、テキストの行が垂直である書字モード、 すなわち左向きまたは右向きのブロックフローです。

これらの用語を、垂直ブロックフロー (下向きまたは 上向きのブロックフロー)や、水平ブロック フロー(左向きまたは 右向きのブロックフロー)と混同しないでください。混乱を避けるため、CSS 仕様では、後者の一連の用語を使用しません。

書記体系には通常、固有の書字モードが一つまたは二つあります。 次に例を示します:

書字モードのtext-orientation構成要素は、 グリフの向きを制御します。

書字モードと縦書きテキストについてさらに詳しく紹介している Unicode Technical Note #22 [UTN22]HTML 版)を 参照してください。

1.1. モジュール間の相互作用

このモジュールは、unicode-bidiおよびdirection[CSS2]の第 8.6 節および第 9.10 節で定義された機能を置換し、拡張します。 これらの機能と、 テキストの行を組む際の その他のテキスト操作との 相互作用については、CSS Text 3 § テキスト処理の 操作順序で説明されています。

算出値であるwriting-modedirection、および text-orientationプロパティは、 (これらのプロパティ自体が適用されない要素上であっても、[CSS-CASCADE-4]) 無関係な他のプロパティの算出値に広範な影響を与えることができます。 これは、たとえば フォント相対長の計算や、算出されたフロー相対プロパティのカスケードが意図的に依存する 書字モード、または 書字モードに依存し得るフォントメトリクスを通じて行われます。

1.2. 値の型と用語

この仕様は、CSS プロパティ 定義の表記規則として[CSS2]のものに従います。 この仕様で定義されていない値の型は、CSS Values & Units [CSS-VALUES-3]で定義されます。 他の CSS モジュールによって、これらの値の型の定義が拡張される場合があります。

各プロパティの定義に列挙されたプロパティ固有の値に加えて、 この仕様で定義されるすべてのプロパティは、 プロパティ値としてCSS 全体キーワードも受け入れます。 読みやすさのため、それらは明示的には繰り返し記載していません。

この仕様で使用されるその他の重要な用語と概念は、 [CSS2]および[CSS-TEXT-3]で定義されています。

2. インライン方向と双方向性

ほとんどの用字系の文字は左から右に記述されますが、 一部の用字系は右から左に記述されます。文書によっては、 とりわけアラビア文字やヘブライ文字で記述されたもの、および 一部の言語が混在する文脈において、単一の(視覚的に表示される) ブロック内のテキストが混在した方向性で表示されることがあります。この現象を双方向性、略して 「bidi」と呼びます。

双方向テキストの例として、アラビア語の文中にあるラテン文字の名前が
                 あります。文全体は右から左に組まれていますが、
                 中央のラテン文字単語の文字は
                 左から右に組まれています。

双方向性

Unicode 標準(Unicode 標準付録 #9)は、 双方向テキストの適切な順序を決定するための複雑な アルゴリズムを定義しています。このアルゴリズムは、 文字のプロパティに基づく暗黙的な部分と、 埋め込みおよび上書きのための明示的な制御から構成されます。CSS は、 適切な双方向レンダリングを実現するために、このアルゴリズムを使用します。

二つの CSS プロパティ、directionunicode-bidiは、 CSS レイヤーに明示的な埋め込み、分離、および上書きの制御を提供します。 テキストの基底方向は文書の構造と 意味に依存するため、directionおよび unicode-bidiプロパティは、 ほとんどの場合、マークアップ内の双方向情報を 対応する CSS スタイルに写像するためだけに使用すべきです。

HTML 仕様([HTML401]の第 8.2 節、および[HTML5]の第 10.3.5 節)は、 HTML 要素の双方向性の動作を定義しています。

文書言語が双方向性を制御するためのマークアップ機能を提供する場合、 著者と利用者は代わりにその機能を使用すべきです。それらを上書きする CSS 規則を指定しては なりません。

2.1. 方向性の指定: directionプロパティ

名前: direction
値: ltr | rtl
初期値: ltr
適用対象: すべての要素
継承: はい
パーセンテージ: n/a
算出値: 指定値
正規順序: n/a
アニメーション型: アニメーション不可

HTML UA は CSS スタイルを無効にできるため、HTML 著者には、 スタイルシートが存在しない場合にも正しい双方向レイアウトを確保するため、HTML の dir 属性と <bdo> 要素を使用することを推奨します著者は HTML 文書でdirectionを 使用すべきではありません

このプロパティは、ボックスによって確立される双方向段落、埋め込み、分離、または上書きの インライン基底方向または方向性を指定します。 (unicode-bidiを参照してください。) さらに、の列の レイアウト順序、 水平オーバーフローの方向、 行内のテキストの既定の配置、および ボックスのインライン基底方向に依存するその他のレイアウト効果にも情報を提供します。

このプロパティの値は、次の意味を持ちます:

ltr
この値は、インライン基底方向(双方向性)を 行左から行右に設定します。
rtl
この値は、インライン基底方向(双方向性)を 行右から行左に設定します。

directionプロパティは、unicode-bidi値がnormalであるインラインボックスに指定された場合、 双方向の並べ替えには影響しません。これは、ボックスが双方向アルゴリズムに関して 追加の埋め込みレベルを 開かないためです。

directionプロパティを表の列ボックスに指定しても、 列は文書ツリー内でセルの祖先ではないため、 その列内のセルには継承されません。したがって CSS では、 [HTML401]の第 11.3.2.1 節で説明されている「dir」属性の継承規則を容易に表現できません。

2.2. 埋め込みと上書き: unicode-bidiプロパティ

名前: unicode-bidi
値: normal | embed | isolate | bidi-override | isolate-override | plaintext
初期値: normal
適用対象: すべての要素(ただし本文を参照)
継承: いいえ
パーセンテージ: n/a
算出値: 指定値
正規順序: 文法に従う
アニメーション型: アニメーション不可

HTML UA は CSS スタイルを無効にできるため、HTML 著者には、 正しい双方向レイアウトを確保するため、HTML の dir 属性、<bdo> 要素、 およびテキストレベルとグループ化レベルの HTML 要素型の適切な区別を使用することを推奨します。 スタイルシートが存在しない場合でも有効です。著者は HTML 文書でunicode-bidiを使用すべきではありません

通常(すなわち、unicode-bidinormalの場合)、 インラインボックスは Unicode 双方向アルゴリズムに対して透過的です。 内容は、ボックスの境界が存在しないかのように配列されます。 unicode-bidiプロパティのその他の値は、 インラインボックスにアルゴリズム内の スコープを作成させ、 テキストに固有の方向性を上書きさせます。

次の参考表は、unicode-bidiがボックスの内部と 外部に与える効果を要約したものです:

unicode-bidinormal以外の値がインラインボックスに与える効果
外側
強い 中立
内側 スコープ付き embed isolate
上書き bidi-override isolate-override
plaintext plaintext

このプロパティの値は、次の(規範的な)意味を持ちます:

normal
ボックスは、双方向アルゴリズムに関して 追加の埋め込みレベルを開きません。インラインボックスの場合、 暗黙的な並べ替えはボックスの境界を越えて機能します。
embed
ボックスがインラインである場合、この値は双方向アルゴリズムに関して 追加の埋め込みレベルを開くことにより、方向埋め込みを作成します。 この埋め込みレベルの方向は、directionプロパティによって指定されます。ボックス内では、 並べ替えが暗黙的に行われます。

この値は、インラインではないボックスには影響しません。

isolate
インラインボックスでは、これは内容を双方向分離 します。 これは方向埋め込みに似ており(それに応じて埋め込みレベルも増加します)、 ブロック境界または強制段落区切りによって中断されないインラインレベルボックスの各シーケンスが、 分離 シーケンスとして扱われる点が異なります:
  • シーケンス内の内容は、 ボックスのdirectionプロパティで指定された基底方向を持つ 独立した段落内にあるかのように 配列されます。
  • それを包含する双方向段落内で双方向解決を行う目的では、 シーケンスは単一のオブジェクト置換文字(U+FFFC)であるかのように扱われます。
実質的に、ボックス内の内容が ボックス周囲の内容から双方向の影響を受けることも、 ボックス周囲の内容が、ボックスの内容または 指定された方向性から双方向の影響を受けることもありません。 ただし、ボックス内の強制段落区切りは、 それを包含する段落内に 対応する区切りを引き続き作成します。

この値は、インラインではないボックスには影響しません。

bidi-override
この値は、ボックスの直接のインライン内容を方向上書きに置きます。 インラインの場合、これは双方向アルゴリズムにおいて方向埋め込みのように動作しますが、 内部の並べ替えは、direction プロパティに従った順序で厳密に行われ、 双方向アルゴリズムの暗黙的な部分は 無視されます。 ブロックコンテナーの場合、上書きは、 そのすべての内容を囲む匿名インラインボックスに適用されます。
isolate-override
これは、isolate分離動作と、 bidi-override方向上書き動作を組み合わせます: 周囲の内容に対しては、isolateと同等ですが、 ボックス内では、bidi-overrideが指定されたかのように内容が配列されます。 実質的には、分離シーケンス内に 方向上書きを入れ子にします。
plaintext

この値はisolateと同様に動作しますが、 Unicode 双方向アルゴリズムの目的では、ボックスの各 双方向 段落(ブロックコンテナーの場合)または 分離 シーケンス(インラインの場合)の基底方向は、 Unicode 双方向アルゴリズムの規則 P2 および P3 の ヒューリスティックに従って決定されます (ボックスのdirectionプロパティは使用されません)。

Unicode 双方向アルゴリズムの条項 HL3 [UAX9]に従い、 normal以外の値は、対応する Unicode 双方向 制御コードを、 インライン要素の先頭と末尾にあるテキストストリームへ実質的に挿入してから、 段落を Unicode 双方向アルゴリズムに渡して並べ替えます。 (§ 2.4.2 CSS–Unicode 双方向制御の変換、テキストの並べ替えを参照してください。)

unicode-bidiによって display: inlineボックスの先頭/末尾に挿入される双方向制御コード
unicode-bididirection
ltr rtl
先頭 末尾 先頭 末尾
normal
embed LRE (U+202A) PDF (U+202C) RLE (U+202B) PDF (U+202C)
isolate LRI (U+2066) PDI (U+2069) RLI (U+2067) PDI (U+2069)
bidi-override* LRO (U+202D) PDF (U+202C) RLO (U+202E) PDF (U+202C)
isolate-override* FSI,LRO (U+2068,U+202D) PDF,PDI (U+202C,U+2069) FSI,RLO (U+2068,U+202E) PDF,PDI (U+202C,U+2069)
plaintext FSI (U+2068) PDI (U+2069) FSI (U+2068) PDI (U+2069)
* LRO/RLO+PDF の組は、 ルートインラインボックスブロックコンテナーのもの)にも、これらのunicode-bidi値がそのブロックコンテナーに指定された場合に適用されます。

unicode-bidiプロパティは 継承されないため、 ブロックボックスにbidi-overrideまたはplaintextを設定しても、 子孫のブロックには影響しません。したがって、これらの値は、 ブロックレベルの構造を含まないブロックおよびインラインで 使用するのが最適です。

unicode-bidiは、plaintextの場合でもdirection プロパティには影響しないため、directionに依存するレイアウト計算にも影響しないことに注意してください。

Unicode アルゴリズムには埋め込みレベルが 125 までという制限があるため、 unicode-bidinormal以外の値を過度に使用しないよう注意してください。 特に、inherit値は、深く入れ子になったインライン マークアップで使用する際、細心の注意が必要です。 ただし、一般に ブロックとして表示されることを意図する要素では、要素を一体に保つため、unicode-bidi: isolateの設定が推奨されます。 これは、displayinlineに変更された場合に備えるためです(下の例を参照)。

2.3. 双方向テキストの例

次の例は、双方向テキストを含む XML 文書を示しています。 これは重要な設計原則を例示しています。文書言語の 設計者は、その言語自体 (要素と属性)および付随するスタイルシートの両方で双方向性を考慮すべきです。 スタイルシートは、双方向性の規則が その他のスタイル規則から分離されるように設計すべきであり、文書言語の双方向性の動作が維持されるよう、 その規則が他のスタイルシートによって上書きされないようにすべきです。

この例では、小文字は本質的に左から右の 文字を表し、大文字は本質的に右から左の 文字を表します。以下では、テキストストリームを論理的なバッキングストア順で示します。

<section dir=rtl>
  <para>HEBREW1 HEBREW2 english3 HEBREW4 HEBREW5</para>
  <para>HEBREW6 <emphasis>HEBREW7</emphasis> HEBREW8</para>
</section>
<section dir=ltr>
  <para>english9 english10 english11 HEBREW12 HEBREW13</para>
  <para>english14 english15 english16</para>
  <para>english17 <quote dir=rtl>HEBREW18 english19 HEBREW20</quote></para>
</section>

これは任意の XML であるため、書字方向の 設定はスタイルシートが担当します。スタイルシートは次のとおりです:

/* 双方向性の規則 */
[dir=rtl] {direction: rtl; unicode-bidi: isolate; }
[dir=ltr] {direction: ltr; unicode-bidi: isolate; }

/* 表示の規則 */
section, para  {display: block;}
emphasis       {font-weight: bold;}
quote          {font-style: italic;}

行の長さが十分に長い場合、 このテキストは次のように整形されることがあります:

               5WERBEH 4WERBEH english3 2WERBEH 1WERBEH

                                8WERBEH 7WERBEH 6WERBEH

english9 english10 english11 13WERBEH 12WERBEH

english14 english15 english16

english17 20WERBEH english19 18WERBEH

最初の<section>要素は右から左の基底方向を持つブロックで、 二つ目の<section>要素は左から右の基底方向を持つブロックです。 <para>は、親から基底方向を継承するブロックです。 したがって、最初の二つの<para>は右上から読み始め、 最後の三つは左上から読み始めます。

<emphasis>要素はインラインレベルであり、 unicode-bidiの値がnormal(初期 値)であるため、 テキストの順序には影響しません。

一方、<quote>要素は、 指定された内部方向性を持つ分離 シーケンスを作成します。 これにより、HEBREW18english19の右側に配置されることに注意してください。

行を折り返す必要がある場合、同じテキストは次のように整形されることがあります:

       2WERBEH 1WERBEH
  -EH 4WERBEH english3
                 5WERB

   -EH 7WERBEH 6WERBEH
                 8WERB

english9 english10 en-
glish11 12WERBEH
13WERBEH

english14 english15
english16

english17 18WERBEH
20WERBEH english19

HEBREW18english19より先に読まなければならないため、 english19の上の行に配置されることに注意してください。 先ほどの整形結果の長い行を単に折り返すだけでは機能しません。

english19の最初の音節は前の行に収まる可能性もありますが、 右から左の文脈における左から右の単語のハイフネーション、およびその逆は、 行の途中にハイフンを表示しなくて済むよう、通常は抑制されることにも注意してください。

2.4. 双方向並べ替えアルゴリズムの適用

双方向テキストをサポートするユーザーエージェントは、ブロック境界または 「双方向タイプ B」の 強制段落 区切りによって中断されないインラインレベルボックスの すべてのシーケンスに Unicode 双方向アルゴリズムを適用しなければなりません。 このシーケンスは、双方向アルゴリズムにおける段落単位を 形成します。

2.4.1. 双方向段落の埋め込みレベル

CSS では、 段落の埋め込みレベルは、 (UAX9 の条項 HL1に従い) Unicode アルゴリズムの手順P2およびP3で示されるヒューリスティックではなく、 段落の包含ブロックのdirectionプロパティに従って設定しなければなりません。

ただし、一つ例外があります: 段落の包含ブロックの算出されたunicode-bidiplaintextの場合、 P2 および P3 の Unicode ヒューリスティックが、[UAX9]の説明に従って、 HL1 の上書きなしで使用されます。

2.4.2. CSS–Unicode 双方向制御の変換、テキストの並べ替え

双方向段落内の最終的な文字順序は、 unicode-bidi(上記)について説明したとおりに双方向制御コードを追加し、 マークアップを取り除き、結果の文字シーケンスを、 スタイル付きテキストと同じ行区切りを生成するプレーンテキスト用 Unicode 双方向アルゴリズムの実装に 渡した場合と同じになります。

ソーステキスト内の双方向制御コードも引き続き尊重され、 文書ツリー構造に対応しない場合があることに注意してください。 これにより、インラインが分割されたり、双方向の開始/終了制御の組み合わせが 特殊な形で妨げられたりする場合があります。

2.4.3. 不可分インラインの双方向処理

この処理では、置換要素のうち、display: inlineであるものは中立文字として扱われます。 ただし、そのunicode-bidiプロパティがembedまたはbidi-overrideのいずれかである場合は、 要素に指定されたdirectionの 強い文字として扱われます。 (これは、置換要素がインライン化されたテキスト内容のレンダリングにフォールバックした場合に、 周囲のテキストに対する双方向の効果を置換レンダリングと一致させるためです。)

その他のすべての不可分インラインレベルボックスは、 常に中立文字として扱われます。

2.4.4. 埋め込みおよび分離内の段落区切り

インラインボックスが双方向段落の境界付近で分割された場合 (たとえば、ブロックまたは強制段落区切りによって分割された場合)、 ボックスの末尾に割り当てられたHL3双方向制御コードは、 中断の前にも追加され、 ボックスの先頭に割り当てられたコードはその後にも追加されます。 (言い換えると、ボックスによって開始された埋め込みレベル、分離、または上書きは、 段落区切りで閉じられ、その反対側で再び開かれます。)

たとえば、<BR/> が強制段落区切りである場合、双方向の順序は次の

<para>...<i1><i2>...<BR/>...</i2></i1>...</para>

<para>...<i1><i2>...</i2></i1><BR/><i1><i2>...</i2></i1>...</para>

との間で、インライン要素 <i1> および <i2> のunicode-bidiのすべての値について同一です。

この動作は、ボックスツリーに適用される、 CSS で宣言された双方向制御に対して CSS によって適用されます。 その効果が双方向段落の末尾で終了するよう定義されている Unicode の双方向書式制御には適用されません。

2.4.5. 並べ替えによって生じるボックスの断片化

双方向の並べ替えでは、論理的に連続するテキストを 分割して並べ替えることがあるため、 双方向テキストによって、そのようなテキストを含むインラインボックスが 分割され、その断片が行内で並べ替えられる場合があります。

2.4.5.1. 並べ替えによって生じるボックス断片化の条件

双方向の並べ替えによって、間にある内容のために インラインボックスが分割される場合、 そのインラインボックスは複数のボックス断片に分割されたものと見なされます。[CSS-BREAK-3] 無限に長い 行において間にある内容によって分割される場合、そのボックスは断片化されたものと見なされます。 これは、行の折り返しによって両方のボックス断片が 行上で互いに隣接して配置される場合でも同様です。 この場合、二つのボックス 断片内のテキストの最も近い共通祖先( 二つのボックス断片間の字送り両端揃えなど、テキスト整形の特定の側面を決定します。[CSS-TEXT-3]を参照) は、インラインボックス自体ではなく、 二つのボックス 断片の最も近い共通祖先であると見なされます。 ただし、間にある内容によって強制的に分割されない場合、 インラインボックスは、双方向の並べ替えによって 複数のボックス断片に分割されたとは見なされません。 (これらの規則は、可能な限りインラインボックスの完全性を維持しながら、 行の折り返しが変化しても、 双方向性によって生じる断片化を安定させます。)

次の例では、小文字が LTR 文字を表し、 大文字が RTL 文字を表します。 双方向の並べ替えによって、<em>インラインボックス<em>外のテキストによって分離された二つのボックス断片に分割されます。

ソースコード(論理順):

<p>here is <em>some MIXED</em> TEXT.</p>

幅の広い包含ブロックでのレンダリング(視覚順)。外部の内容によって分離された二つのインラインボックス断片が 生じます:

here is some TXET DEXIM.

幅の狭い包含ブロックでのレンダリング(視覚順)。互いに隣接して配置された二つのインラインボックス断片が 生じます:

here is some DEXIM
TXET.
対照的に、この例では、 混在方向の語句が分離によって一体に保たれるため、 生成される断片は一つだけです。周囲の内容が、無限に長い包含ブロック内であっても、<em>インラインボックスを分割することはありません:

ソースコード(論理順):

<p>here is <em dir=rtl>some MIXED</em> TEXT.</p>

幅の広い包含ブロックでのレンダリング(視覚順)。一つの断片が生じます:

here is some DEXIM TXET.

幅の狭い包含ブロックでのレンダリング(視覚順)。一つの断片が生じます:

here is some DEXIM
TXET.
2.4.5.2. 並べ替えによって生じるボックス断片のボックスモデル

各行ボックスについて、UA は各インラインボックスの断片を取得し、 視覚順(論理順ではありません)にマージン、ボーダー、およびパディングを割り当てなければなりません。 ボックスが出現する最初の行ボックス上で最も始端側にある断片には、 始端辺のマージン、ボーダー、およびパディングが割り当てられ、 ボックスが出現する最後の行ボックス上で最も終端側にある断片には、 終端辺のマージン、ボーダー、およびパディングが割り当てられます。 たとえば、horizontal-tb書字モードでは、次のようになります:

縦書きモードにも同様の規則が適用されます。

box-decoration-breakプロパティは、この動作を上書きして、 各断片の両側にボックス装飾を描画できます。[CSS-BREAK-3]

3. 縦書きモード

このモジュールは、双方向テキストに対する CSS2.1 のサポートを拡張するだけでなく、 CSS で縦書きテキストのレイアウトをサポートするために必要な 規則とプロパティを導入します。

3.1. 縦書き入門

この小節は非規範的です。

主として横方向にレイアウトされるラテン文字を使用する言語とは異なり、 中国語や日本語などのアジア言語は 縦方向にもレイアウトできます。次の日本語の例は、同じテキストを 横書きと縦書きでレイアウトしたものです。横書きの場合、テキストは 左から右、上から下へ読まれます。縦書きの場合、テキストは 上から下、右から左へ読まれます。 左から右への横書きの場合における左端からのインデントは、 上から下への縦書きの場合には上端からのインデントに 置き換わります。

日本語の横書きと縦書きを比較すると、
                 行は回転しますが、文字は正立したままであることが分かります。
                 ただし、一部のグリフは変化します。句点はグリフボックスの
                 左下から右上へ移動します。一方、
                 ランニングヘッダーは、
                 ページ上部に横書きでレイアウトされたままの場合があります。

日本語の縦書きと横書きの比較: iBunko アプリケーション(iOS)

中国語と日本語では、行は右から左または上から下に 配列されますが、モンゴル語と満州語では、 左から右に配列されます。

横書きから縦書きへの変更は、 レイアウトだけでなく組版にも影響を与えることがあります。たとえば、約物の スペーシングボックス内での位置が横書きと 縦書きとで変化する場合があり、場合によっては代替グリフが使用されます。

ラテン文字のテキストや、通常は横書きで表示される その他の用字系のテキストを含む縦書きテキストでは、そのテキストを さまざまな方法で表示できます。たとえば、ラテン文字の単語を横倒しに回転したり、 各文字を正立させたりできます:

「ヴィルス」の辞書定義では、
                 英単語 'virus' を時計回りに 90° 回転させる一方で、
                 頭字語 'RNA' と 'DNA' の文字は正立させて積み重ねる場合があります。

日本語の縦書きにおけるラテン文字の例: 大辞林ビューア 1.4(iOS)

日付の 2 桁の数字など、一部の特殊な場合には、テキストが 単一の縦書き文字ボックス内にコンパクトに収められます:

MacFan の抜粋には、数字について考えられる複数の縦書きレイアウトが示されています。
                 2 桁の月と日は
                 縦中横ブロックとして記述され、年は
                 各文字を正立させて記述されます。ただし、英語の語句
                 「for Mac 2011」では、日付が回転され、
                 回転したラテン文字に揃えられます。

Mac Fan、2010年12月、49 ページ

レイアウトには、縦書き要素と横書き要素が混在することもよくあります:

雑誌では横書きと縦書きのレイアウトが混在することがよくあります。
                 たとえば、主要記事のテキストには一方の向きを使用し、
                 サイドバーや図解の内容には別の向きを使用します。

縦書き要素と横書き要素の混在

縦書きテキストのレイアウトでは、双方向テキストのレイアウトも処理する必要があります。 たとえば、時計回りに回転したアラビア文字は、下から上へレイアウトされます。

3.2. ブロックフロー方向: writing-modeプロパティ

名前: writing-mode
値: horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr
初期値: horizontal-tb
適用対象: 表の行グループ、表の列グループ、表の行、表の列、ルビベース コンテナー、およびルビ注釈コンテナーを除くすべての要素
継承: はい
パーセンテージ: n/a
算出値: 指定値
正規順序: n/a
アニメーション型: アニメーション不可

このプロパティは、テキストの行を横方向と縦方向のどちらにレイアウトするか、 およびブロックが進行する方向を指定します。指定できる 値は次のとおりです:

horizontal-tb
上から下へのブロックフロー方向です。 書字モード組版モードは どちらも横方向です。
vertical-rl
右から左へのブロックフロー方向です。 書字モード組版モードは どちらも縦方向です。
vertical-lr
左から右へのブロックフロー方向です。 書字モード組版モードは どちらも縦方向です。
sideways-rl
右から左へのブロックフロー方向です。 書字モードは 縦方向ですが、組版モードは横方向です。
sideways-lr
左から右へのブロックフロー方向です。 書字モードは 縦方向ですが、組版モードは横方向です。

writing-modeプロパティは、ブロックフロー方向を指定します。 これは、ブロック整形コンテキスト内のブロックレベルボックスの配列方向、 インラインを含むブロックコンテナー内の行ボックスの配列方向、 表内の行の配列方向などを決定します。 行ボックスの積み重ね方向を決定することにより、 writing-modeプロパティは、 行ボックスの向き(したがって書字モード)が 横方向か縦方向かも決定します。 その後、text-orientationプロパティが、行ボックス内でテキストをどのように レイアウトするかを決定します。

置換要素の内容は、書字モードによって回転しません。 たとえば画像や<iframe>からの外部内容は正立したままであり、 300px×150px の既定のオブジェクトサイズも向きを変えません。 ただし、テキストを伴う埋め込み置換内容 (MathML の内容やフォーム要素など)は、 UA がその置換内容について該当する縦書きモードをサポートする場合、 置換要素の書字モードと行の向きに一致すべきです。

次の例では、画像(2)によって分離された二つのブロック要素(1 と 3)が、 さまざまなフロー書字モードで表示されます。

横書きモード(writing-mode: horizontal-tb)の図を次に示します:

横方向レイアウトの図: ブロック 1、2、3 が上から下に積み重なっています

東アジアで一般的に使用される右から左への縦書きモード (writing-mode: vertical-rl)の図を次に示します:

右から左への縦方向レイアウトの図: ブロック 1、2、
                  3 が右から左へ横並びに配置されています

最後に、満州語とモンゴル語で使用される左から右への縦書き モード(writing-mode: vertical-lr)の図を示します:

左から右への縦方向レイアウトの図: ブロック 1、2、
                  3 が左から右へ横並びに配置されています

次の例では、いくつかのフォームコントロールが vertical-rl書字モードのブロック内にレンダリングされます。フォームコントロールは、 その書字モードに合わせてレンダリングされます。

<style>
  form { writing-mode: vertical-rl; }
</style>
...
<form>
<p><label>氏名 <input value="艾俐俐"></label>
<p><label>言語 <select><option>英語
                       <option>フランス語
                       <option>ペルシア語
                       <option>中国語
                       <option>日本語</select></label>
</form>

縦方向レイアウトのスクリーンショット: input 要素は
                上から下へ縦長に配置され、その内容は
                外側のラベルに合わせて、
                縦方向の組版モードでレンダリングされます。その後にある
                ドロップダウン選択コントロールは、横書きモードの場合のように
                下方向ではなく、横方向(ブロックの終端
                辺に向かう方向)に展開されます。

ボックスのwriting-mode値が親ボックス (すなわち、display: contentsではない最も近い祖先)と異なる場合:

その他のすべての継承される CSS プロパティと同様に、 writing-modeプロパティは、ソース文書に リンクではなくインライン化された SVG 要素へ継承されます。 これにより、たとえば横方向のフロー専用に設計された SVG 画像を縦方向のフローの文書に埋め込んだ場合、意図しない副作用が生じる可能性があります。

著者は、次の規則を追加することで、これを防止できます:

svg { writing-mode: initial; }

3.2.1. 廃止された SVG1.1 のwriting-mode

SVG1.1 [SVG11]は、いくつかの追加値を定義しています: lrlr-tbrlrl-tbtb、およびtb-rl

これらの値は、SVG1 文書以外のすべての文脈で廃止されているため、 非 SVG UA にとっては任意です。

3.2.1.1. CSS 構文における SVG1.1 のwriting-mode値の サポート

CSS の文脈でこれらの値をサポートする UA は、 次のように算出しなければなりません:

廃止された SVG1.1 のwriting-mode値から現代の CSS への対応付け
指定値 算出値
lr horizontal-tb
lr-tb
rl
rl-tb
tb vertical-rl
tb-rl

SVG1.1 の値は、 この仕様によって廃止された CSS のwriting-mode仕様の 旧版にも含まれていました。 その版に追加されていたtb-lr値は、 vertical-lrに置き換えられます。

3.2.1.2. プレゼンテーション属性における SVG1.1 のwriting-mode値のサポート

プレゼンテーション属性を持つ従来の内容をサポートし、 著者が旧式のクライアントをサポートする文書を作成できるようにするため、 SVG UA は、既定の UA スタイルシートに次のスタイルシート規則を追加しなければなりません:

@namespace svg "http://www.w3.org/2000/svg";
svg|*[writing-mode=lr], svg|*[writing-mode=lr-tb],
svg|*[writing-mode=rl], svg|*[writing-mode=rl-tb] {
  writing-mode: horizontal-tb; }
svg|*[writing-mode=tb], svg|*[writing-mode=tb-rl] {
  writing-mode: vertical-rl; }
CSS 構文で前方互換性と後方互換性のある SVG 内容を作成したい著者は、 CSS の前方互換な解析規則を使用して実現できます。 例:
svg|text { writing-mode: tb; writing-mode: vertical-rl; }

4. インラインレベルの整列

異なる種類のインラインレベルの内容を一つの 行にまとめて配置する場合、内容のベースラインとvertical-alignプロパティの設定によって、それらを行ボックスの 横断方向にどのように 整列するかが制御されます。この節では、ベースラインとは何か、その求め方、 およびvertical-alignプロパティとともに インラインレベルの内容の整列を決定するためにどのように使用されるかを説明します。

4.1. ベースライン入門

この節は非規範的です。

ベースラインは、行ボックスのインライン軸に沿う線であり、 テキストの各グリフはこの線に沿って整列されます。ベースラインは、 フォント内のグリフの設計を導き(たとえば、ほとんどのアルファベット グリフの下端は通常、アルファベットベースラインに揃います)、 組版時には異なるフォントやフォントサイズのグリフの整列を導きます。

二つのフォントサイズのアルファベットテキストと、そのベースラインおよび em ボックスの図

二つのフォントサイズのアルファベットテキストと、そのベースラインおよび em ボックス

書記体系によって、優先されるベースライン表は異なります。

ラテン文字では、ほとんどの文字がその上に載る
                 アルファベットベースラインが優先されますが、一部にはその下へ垂れ下がるディセンダーがあります。
                 インド系文字は、そのグリフ形状が
                 水平線からぶら下がっているように見えるため、
                 ぶら下がりベースラインを使用して組まれることがあります。
                 正方形を満たすようグリフが設計される漢字ベースの体系は、
                 下端で整列する傾向があります。

さまざまな書記体系で優先されるベースライン

適切に構築されたフォントにはベースライン 表が含まれており、 フォントの設計座標空間内にある一つ以上の ベースラインの位置を示します。(設計座標空間は、 フォントサイズに応じて拡縮されます。)

適切に設計された用字系混在フォントでは、グリフを一緒に組んだとき 互いに調和するように、 座標空間内で配置します。次に、グリフの形状と一致するよう ベースライン表を構築し、各ベースラインを、 それを優先する用字系のグリフに一致するよう配置します。

ベースライン表はフォントのプロパティであり、各種ベースラインの 位置はフォント内のすべてのグリフに適用されます。

横書きテキストと縦書きテキストの整列には、 異なるベースライン表を提供できます。UA は、縦方向の組版モードでは縦書き用の 表を使用し、それ以外では横書き用の表を使用すべきです。

4.2. テキストのベースライン

この仕様では、次のベースラインのみを考慮します:

アルファベット
アルファベット ベースライン。通常は、 ラテン大文字のグリフの下端に揃います。
中央
中央 ベースライン。通常は、 em ボックスの中央を通ります。フォントにこのベースラインがない場合、 em ボックスのアセンダー(上側)辺と ディセンダー(下側)辺の中間にあると見なされます。

縦方向の組版 モードでは、中央 ベースラインが、 text-orientationmixedまたはuprightの場合に 支配的ベースラインとして使用されます。 それ以外の場合はアルファベットベースラインが使用されます。

将来の CSS モジュールでは、ベースラインがさらに 詳細に扱われ、その他の支配的ベースラインや整列 オプションを選択できるようになります。

4.3. 不可分インラインのベースライン

不可分 インライン(inline-block、inline-table、または置換インライン要素など)に ベースラインがない場合、 UA は次のようにベースライン表を合成します:

アルファベット
アルファベットベースラインは、下側のマージン辺にあると見なされます。
中央
中央ベースラインは、ボックスの下側上側の マージン辺の中間にあると見なされます。

[CSS2]vertical-alignプロパティは、 一部の例外を除き、inline-table および inline-block ボックスのベースラインを定義します。

4.4. ベースラインの整列

支配的ベースライン組版モードに基づいて変化する場合があります)は、 CSS において、次の二つの場合の整列に使用されます:

5. 縦書きテキストレイアウト入門

各書記体系には、一つ以上の固有の向きがあります。したがって、現代の用字系は、 向きに関する三つのカテゴリーに分類できます:

横書き専用
固有の向きが横書きには存在するものの、縦書きには存在しない用字系です。 含まれるもの: ラテン文字、アラビア文字、ヘブライ文字、デーヴァナーガリー
縦書き専用
固有の向きが縦書きには存在するものの、横書きには存在しない用字系です。 含まれるもの: モンゴル文字、パスパ文字
両方向
縦書きと横書きの両方に固有の向きが存在する用字系です。 含まれるもの: 漢字、ハングル、日本語の仮名

縦書き用字系とは、 固有の縦書き方向を持つ用字系です。 すなわち、縦書き専用または両方向のいずれかです。 横書き用字系とは、 固有の横書き方向を持つ用字系です。 すなわち、横書き専用または両方向のいずれかです。 (用字系を固有の向きによって分類したものについては、付録 Aを参照してください。)

これらの区別をベン図で表すと、二つの円が描かれます。
                     一方には '縦書き'、もう一方には '横書き' と記されます。重なり合う
                     領域は両方向の用字系を表し、
                     横書き専用および縦書き専用の用字系は、それぞれの
                     円に固有の領域を占めます。

現代の組版システムでは、すべてのグリフに 横書き方向が割り当てられており、テキストを横方向にレイアウトするときに使用されます。 縦書きテキストをレイアウトするには、UA はテキストを 横書き方向から変換する必要があります。この変換を両方向 変換といい、次の二種類があります:

回転
グリフを横書きから縦書きへ回転します グリフを横書きから縦書きへ回転する
平行移動
グリフを横書きから縦書きへ平行移動します グリフを横書きから縦書きへ平行移動する

固有の縦書き方向を持つ用字系には、 縦書きテキストで正しい向きにするための固有の 両方向変換があります。ほとんどの CJK(中国語/日本語/韓国語)文字は平行移動されます。 すなわち、常に正立します。モンゴル文字など、 その他の用字系の文字は回転します。

固有の縦書き方向を持たない用字系は、回転 (横倒しに組む)または平行移動(正立に組む)のいずれかを選択できます。使用する変換は、 正しさの問題ではなく、 テキストの用途に応じた様式上の選択です。 text-orientationプロパティのmixedおよびupright値は、 横書き専用テキストの回転と平行移動を指定するために用意されています。

5.1. テキストの方向付け: text-orientation プロパティ

名前: text-orientation
値: mixed | upright | sideways
初期値: mixed
適用対象: 表の行グループ、行、列グループ、および列を除くすべての要素
継承: はい
パーセンテージ: n/a
算出値: 指定値
正規順序: n/a
アニメーション型: アニメーション不可

このプロパティは、行内のテキストの向きを指定します。 現在の値は、縦方向の組版モードでのみ効果があります。 このプロパティは、横方向の組版 モードにあるボックスには影響しません。

各値は、次の意味を持ちます:

mixed

縦書きモードでは、横書き専用の 用字系に属する組版文字単位は、 横倒しに組まれます。 すなわち、横書きテキストでの標準の向きから時計回りに 90° 回転します。縦書き 用字系に属する組版文字単位は、 固有の向きで組まれます。 詳細については、縦書き方向を参照してください。

この値は、主として縦書き用字系で構成されるテキストのレイアウトで一般的です。

upright

縦書きモードでは、横書き専用の 用字系に属する組版文字単位は、 正立して組まれます。 すなわち、標準の横書き方向になります。縦書き 用字系に属する組版文字単位は、 固有の向きで通常どおり字形処理され、組まれます。 詳細については、縦書き方向を参照してください。

この値により、direction使用値ltrになり、 双方向の並べ替えの目的では、 すべての文字が強い LTR として扱われます。

注: directionで影響を受けるのは、算出値ではなく、 使用値です。 これにより、この方向上書きが適用されない 子孫(横書きinline-block の内容など)へ rtlを適切に継承できます。

sideways

縦書きモードでは、 すべてのテキストが、横方向にレイアウトされたかのように 横倒しに組まれますが、時計回りに 90° 回転します。

text-orientation: mixed text-orientation: upright text-orientation: sideways
mixed upright sideways

text-orientationの値(writing-modevertical-rl

このプロパティの値を変更すると、インラインレベルの整列に影響する場合があります。 詳細については、テキストのベースラインを参照してください。

UA は、後方互換性のために必要な場合、 sideways-rightを、算出値がsidewaysとなる値として受け入れてもかまいません。

執筆時点では、主要な実装は、 upright組版における RTL 文字の自動的な LTR 処理をサポートしていません。 このような場合、著者は次の例のように、unicode-bidiおよびdirectionを明示的に指定する必要がある場合があります:
.vertical-upright-hebrew {
    writing-mode: vertical-rl;
    text-orientation: upright;
    unicode-bidi: bidi-override;
    direction: ltr;
}

5.1.1. 縦組みとフォント機能

vertical-rlおよびvertical-lr モードでテキストを組む場合、 テキストは、次に定義するとおり「正立」または「横倒し」のいずれかで組まれます:

正立組版
組版文字単位は、それぞれ 縦書き用フォントメトリクスを使用して縦書きの行内に 正立して組まれます。 UA は、縦書き用フォントメトリクスを持たないフォントについて、それを合成しなければなりません。 (この仕様では、そのようなメトリクスを合成するためのヒューリスティックを定義しません。) さらに、縦組みでの使用を意図した フォント機能(代替グリフやその他の変換など)を使用しなければなりません。 (たとえば、OpenType のvert機能を有効にしなければなりません。) また、アラビア文字などの横書き筆記体用字系の文字は、 正立して組まれる場合、分離形に字形処理されます。

「正立」して組む場合でも、 一部のグリフは回転して表示すべきであることに注意してください。 たとえば、ダッシュや囲み約物は、 インライン軸を基準として方向付けるべきです。 OpenType では、通常、グリフ置換によって処理されますが、 すべてのフォントが、関連するすべてのコードポイントについて代替グリフを持つとは限りません。 (東アジアのフォントは通常、東アジアのコードポイント用の代替を提供しますが、 欧文フォントは一般に縦組み機能を持たず、 東アジアのフォントも一般に欧文コードポイント用の縦書き置換を持ちません。) Unicode は、どの文字を横倒しで表示すべきかについての草案データを、 この データファイルの SVO プロパティとして公開しました。 ただし、このプロパティは、現在の版の[UTR50]では廃止されています。

組版文字単位のうち、 [UTR50]TrまたはTuに分類されるものには、 縦書きテキストで正立して組むための代替グリフまたは位置調整があることが期待されます。 Tr文字について、 そのような縦書き用代替グリフがフォントにない場合、 UA は、不足するグリフを横倒しに組むなどして 合成することを望む場合があります [RFC6919] (ただし、期待されているわけではありません)。

横倒し組版
組版文字単位は、正立方向から時計回りに 90° 回転した 一つのランとして組まれ、 横書き用のメトリクスと組版を使用し、 縦組み機能は使用されません。 ただし、縦書きの行内で横倒しに組まれる テキストに対して有効にすることを意図した機能 (たとえば、筆画の角度や整列を調整する機能)がフォントにある場合、 その機能が使用されます。 (そのような機能の例として、提案されているvrtr OpenType フォント機能があります。)

5.1.2. 混在する縦書き方向

[UTR50]は、向きが混在する縦書きテキストの 既定のグリフ方向を表すVertical_Orientation プロパティを定義しています。 text-orientationmixedの場合、 UA は各組版文字単位の向きを、 そのVertical_Orientationプロパティによって決定しなければなりません。方向プロパティが UTu、またはTrの場合は正立して組み、 方向プロパティがRの場合は 横倒しに組みます(横書きから時計回りに 90°)。

UTR50 は、縦書きの文脈で -90° 回転する用字系を扱わないため、 そのような用字系はmixed方向では正しく組まれません。 そのような用字系にはsideways-lrを使用してください。

向きが混在する組版を意図した OpenType のvrt2機能は、 CSS では使用されません。 これは、グリフの向きを決定する責任をフォント設計者に委ねます。 CSS は代わりに、[UTR50]を通じて向きを指示し、 グリフを必要に応じて横倒しまたは正立して組むことで方向付けます。

5.1.3. 廃止: SVG1.1 のglyph-orientation-verticalプロパティ

名前: glyph-orientation-vertical
値: auto | 0deg | 90deg | 0 | 90
初期値: n/a
適用対象: n/a
継承: na/
パーセンテージ: n/a
算出値: n/a
正規順序: n/a
アニメーション可否: n/a

一部の SVG ユーザーエージェントは、 廃止された SVG のglyph-orientation-verticalプロパティを含む文書を処理する必要があります。 このプロパティは、autoキーワードに加え、 <angle>と、90° の倍数を表す<integer>値を受け入れるよう定義されていました。 このプロパティのサポートは任意ですが、 サポートする UA は、次のようにglyph-orientation-verticaltext-orientationの略式として別名化しなければなりません:

略式glyph-orientation-vertical個別指定text-orientation
auto mixed
0deg upright
0 upright
90deg sideways
90 sideways

UA は、glyph-orientation-verticalプロパティの その他すべての値を無視して無効として扱い、 glyph-orientation-horizontal プロパティ全体を 無効として扱わなければなりません。

注: 180deg値と270deg値、 ラジアン値とグラジアン値、 およびglyph-orientation-horizontalプロパティは、 既知のユースケースも、 それらに依存する大量の内容も存在しないため対応付けられません。 したがって CSS の一部ではなく、 SVG からも同様に削除されています。

6. 抽象ボックスの用語

CSS2.1 [CSS2]は、CSS のボックスレイアウトモデルを 詳細に定義していますが、 horizontal-tb書字モードだけを対象としています。レイアウトは、 horizontal-tb以外の書字モードでも同様です。ただし、 CSS2.1 の方向および寸法に関する用語を抽象化し、 適切に対応付け直す必要があります。

この節では、その他の書字モードについてボックスレイアウトを定義し、 将来の仕様がレイアウトの概念を 抽象的に定義するための用語を提供するため、抽象的な方向および寸法の用語と その対応付けを定義します。(次の節では、これらを CSS2.1 のレイアウト計算に適用する方法と、直交フローの処理方法を説明します。) これらはテキストの動作から導出されますが、 抽象的な対応付けは、行ボックスを一つも含まないボックスにも存在します。 これらは、writing-modeおよびdirectionプロパティの値から直接計算されます。

CSS には、方向に関する用語が三組あります:

物理
書字モードとは無関係に、ページを基準として解釈されます。 物理 方向は、、およびです。
フロー相対
内容のフローを基準として解釈されます。 フロー相対方向は、始端終端です。 寸法も曖昧な場合は、ブロック始端ブロック終端インライン始端、およびインライン終端です。
行相対
行ボックスの向きを基準として解釈されます。 行相対方向は、行左行右行上側、および行下側です。

物理寸法は、高さです。 これらは、それぞれx 軸水平寸法)およびy 軸垂直寸法)に沿った測定値に 対応します。抽象寸法は、フロー相対用語と 行相対用語のどちらでも同一であるため、 これらの用語は一組だけです。

注: [CSS3-FLEXBOX]は、 フレックスレイアウトの説明に使用される フレックス相対用語も定義しています。

6.1. 抽象寸法

抽象寸法を次に定義します:

ブロック寸法
行内のテキストフローに垂直な寸法です。すなわち、 横書きモードでは垂直 寸法、 縦書きモードでは水平 寸法です。
インライン寸法
行内のテキストフローに平行な寸法です。すなわち、 横書きモードでは水平 寸法、 縦書きモードでは垂直 寸法です。
ブロック軸
ブロック寸法における軸です。 すなわち、横書きモードでは垂直軸、 縦書きモードでは水平軸です。
インライン軸
インライン寸法における軸です。すなわち、横書きモードでは水平 軸、縦書きモードでは垂直軸です。
ブロックサイズ
論理高さ
ブロック寸法における測定値です。 横書きモードでは物理高さ(垂直寸法)を指し、 縦書きモードでは物理幅(水平寸法)を指します。
インラインサイズ
論理幅
インライン寸法における測定値です。 横書きモードでは物理幅(水平寸法)を指し、 縦書きモードでは物理高さ(垂直寸法)を指します。

6.2. フロー相対方向

フロー相対方向である、ブロック始端ブロック終端インライン始端、およびインライン終端は、 ページ上の内容のフローを基準として定義されます。 LTRhorizontal-tb書字モードでは、それぞれ 上、下、左、右の方向に対応します。 次のように定義されます:

ブロック始端
writing-modeプロパティによって決定される、 ブロックフロー方向において先に来る側です。 horizontal-tbモードでは物理的な上、 vertical-rlでは右、vertical-lrでは左です。
ブロック終端
ブロック始端の反対側です。
インライン始端
インライン基底方向のテキストが開始される側です。 directionの使用値がltrであるボックスでは、 行左側を意味します。 directionの使用値が rtlであるボックスでは、行右側を意味します。
インライン終端
始端の反対側です。

文脈上曖昧でない場合、または両方の意味を含む場合は、 始端および 終端という用語を、 それぞれブロック始端インライン始端およびブロック終端インライン終端の代わりに使用します。

ボックスのブロック始端側とブロック終端側の決定は、writing-modeプロパティだけに依存しますが、 ボックスのインライン始端側と インライン終端側の決定は、 writing-modeプロパティだけでなく、 directionプロパティにも依存することに注意してください。

一般的な英語テキストのレイアウトに適用される物理用語/論理用語
一般的な中国語テキストのレイアウトに適用される物理用語/論理用語

6.3. 行相対方向

行の向きは、 行ボックスのどちら側が論理的な 「上」(アセンダー側)であるかを決定します。 これはwriting-modeプロパティによって与えられます。 通常、行相対の「上」は ブロック始端側に 対応しますが、常にそうであるとは限りません。 モンゴル語の組版(したがって、既定ではvertical-lr 書字 モード)では、行相対の「上」はブロック終端側に対応します。 このため、別個の用語が必要になります。

英語が混在するモンゴル語

上のような主としてモンゴル語で構成される文書は、 左から右へ積み重なる縦書きの行で記述されますが、ラテン文字のテキストは、 グリフの上側が右を向くようにレイアウトされます。これにより、テキストは モンゴル語と同じインライン方向(上から下)に進み、 その他の東アジアのレイアウト(縦書きの 行が右から左へ積み重なるもの)と同じ方向を向きます。ただし、グリフの上側は 行の積み重なりの上側ではなく下側を向きます。これは英語の 段落では上下逆になります。(このモンゴル語 テキストレイアウトの 図を参照してください。)

「vertical-align: top」などを対応付けるための行相対の「上」と「下」に加え、 CSS では、text-align: leftなどを対応付けるため、行相対の 「左」と「右」を参照する必要もあります。 したがって、四つの行相対方向があり、 行の 向きを基準として次のように定義されます:

上側または行上側
名目上、行ボックスのアセンダー側または「上」側に 対応する側です。(通常、上線が描かれる側です。)
下側または行下側
上側の反対側、すなわち行相対の「下」 またはディセンダー側です。 (通常、下線が描かれる側です。)
行左
行ボックスの行相対の「左」側です。 名目上、LTRテキストが開始される側です。
行右
行ボックスの行相対の「右」側です。 名目上、RTLテキストが開始される側です。 (行左の反対側です。)

物理方向と行相対方向の正確な 対応付けについては、下の表を参照してください。

行の向きを示す方位図

horizontal-tbにおける行の向き

縦書きにおける一般的な向き

vertical-rlvertical-lr、およびsideways-rlにおける行の向き

縦書きにおける一般的な向き

sideways-lrにおける行の向き

正立グリフのベースラインは上中央から垂直に描かれます

正立グリフの垂直ベースライン

text-orientation: uprightの場合でも、 ベースラインは垂直のままであり、 フォント内の垂直ベースラインが使用されます。 フォントが提供しない場合は、垂直ベースラインが合成されます。

ベースラインは垂直であるため、 上記のmixedまたはsideways の定義が引き続き適用されます。すなわち、行上側は 右側にあり、行下側は 左側にあります。

これは、垂直メトリクスで アセンダーを右側、ディセンダーを 左側に定義する OpenType などのフォントシステムと一致します。

6.4. 抽象から物理への対応付け

次の表は、使用directionおよびwriting-modeに基づく、 抽象から物理への対応付けをまとめたものです:

抽象と物理の対応付け
writing-mode horizontal-tb vertical-rlsideways-rl vertical-lr sideways-lr
direction ltr rtl ltr rtl ltr rtl ltr rtl
ブロックサイズ 高さ
インラインサイズ 高さ
ブロック始端
ブロック終端
インライン始端
インライン終端
上側
下側
行左
行右

注: direction使用値は、 算出されたwriting-modeおよびtext-orientationに依存します。 縦書き モードでは、 text-orientation値がuprightの場合、directionの使用値は強制的にltrになります。

7. 抽象ボックスレイアウト

7.1. 縦書きモードにおけるレイアウトの原則

縦書きモードにおける CSS ボックスレイアウトは、 次に概説する原則に従い、横書きモードにおけるレイアウトと同様になります:

横書きモードの水平寸法に適用される レイアウト計算規則(CSS2.1 の第 10.3 節にあるものなど)は、 縦書きモードでは垂直寸法に適用されます。 同様に、横書きモードの垂直寸法に適用される レイアウト計算規則(CSS2.1 の第 10.6 節にあるものなど)は、 縦書きモードでは水平寸法に適用されます。 したがって、次のようになります:

たとえば、縦書きモードでは、 表の行は垂直になり、表の列は水平になります。 vertical-rlmixedrtlの表では、 最初の列は下側(インライン始端側)に、 最初の行は右側(ブロック始端側)に配置されます。 表のmargin-rightmargin-leftは、それぞれ 表の前(右側)および後(左側)のマージンと相殺されます。 また、表のmargin-topmargin-bottomの値がautoである場合、 ブロックフロー内で垂直方向の中央に配置されます。

縦方向のブロック整形コンテキスト内にある
        vertical-rl、mixed、rtl の表を示し、上記のような行、
        セル、および列の順序を表す図。

vertical-rl RTL 書字モードの表

主として行ボックスの左側または右側、 あるいはその長手方向に平行な線を参照するため、 上側または下側に相当するものが存在しない、テキストの整列、浮動、リストマーカーの配置などの機能では、 行左側と行右側を、 それぞれ左側と右側の基準として使用します。

同様に、主として行ボックスの上側または下側、 あるいはその横断方向に平行な線を参照するため、 左側または右側に相当するものが存在しない、下線、上線、ベースライン整列 (残念な名前のvertical-align)などの機能では、 行上側行下側を、 それぞれ上側と下側の基準として使用します。

これらの対応付けの詳細を次に示します。

7.2. 寸法の対応付け

特定のプロパティは、論理的に次のように動作します:

高さプロパティ(heightmin-height、およびmax-height)は 物理高さを参照し、幅プロパティ(widthmin-width、およびmax-width)は物理幅を参照します。ただし、 ボックスの寸法と位置を計算するために使用される規則は論理的です。

たとえば、CSS2.1 第 10.3 節の計算規則は、 インライン寸法の測定に使用されます。 これはインラインサイズ (物理幅と物理高さのどちらの場合もあります)と、 インライン始端およびインライン終端のマージン、パディング、 ボーダーに適用されます。 同様に、CSS2.1 第 10.6 節の計算規則は、 ブロック寸法で使用されます。 これはブロックサイズと、 ブロック始端およびブロック終端のマージン、パディング、 ボーダーに適用されます。[CSS2]

その帰結として、CSS2.1 では常に包含ブロックの 幅を基準として計算されるマージンおよびパディングプロパティのパーセンテージは、 CSS3 では包含ブロックのインラインサイズを基準として計算されます。

7.3. 直交フロー

一般的なフィードバックを歓迎しますが、 特に、この非常に複雑な節についての フィードバックをお待ちしています。

ボックスのwriting-modeが 包含ブロックと異なる場合、次の二つの可能性があります:

ボックスの書字モードが包含ブロックに対して垂直である場合、 そのボックスは直交フロー内にある、または直交フローを確立するといいます。

この場合を処理するため、CSS レイアウト計算は、 ボックスのサイズ設定と、フロー内でのボックスの配置という二つの段階に分けられます。

autoマージンは包含ブロックの 書字モードと整合するように解決されるため、直交フローを確立するボックスは、 サイズ設定後、auto マージンを使用することで、その他のブロックレベルボックスと同様に 包含ブロック内で整列または中央配置できます。

二つの横方向フローボックスの間に縦方向フローボックスが現れる図。

直交フローの例

たとえば、縦方向のブロックを横方向のブロック内に配置した場合、 子ブロックの物理高さ(インラインサイズ)を計算するとき、 親ブロックの物理高さが、子の包含ブロックの インラインサイズとして使用されます。 これは、物理高さが親ブロックのインラインサイズではなく ブロックサイズであるにもかかわらず適用されます。

一方、 包含ブロックは横書きモードであるため、 子の垂直マージンは、子のインライン軸にあるにもかかわらず マージンの相殺に関与し、 水平 auto マージンは、子のブロック軸にあるにもかかわらず、 包含ブロックを満たすように拡大します。

この節では、 ブロック軸で自動サイズ設定される子ボックスが 直交フローを確立する場合、 子の使用ブロックサイズを、 その内容に合わせて計算する必要があります。 その結果として得られる内容ベースのサイズは、 親のインライン軸におけるmin-content サイズmax-content サイズへの入力として使用されます。

これは、inline-block、浮動、表セルなどのボックスに shrink-to-fit の式を適用するとき、 その子が直交フローを確立する場合、 依存する計算順序を変更して、子の サイズ設定段階を先に実行し、 その使用ブロックサイズを、 親のインラインサイズに対する shrink-to-fit の式への入力にしなければならないことを意味します。

7.3.1. 直交フローで利用可能な空間

CSS では、包含ブロックが確定したインラインサイズを持つ一方で、 確定したブロックサイズを持たないことが一般的です。 CSS2.1 では通常、 包含ブロックの高さがautoの場合などに この状況が発生します。 たとえば、その幅は10.3.3の計算によって与えられますが、 ブロックサイズは内容に依存します。 この場合、利用可能なインライン空間は、 包含ブロックのインラインサイズとして定義されます。 ただし、それ以外の場合には包含ブロックのブロックサイズとなる 利用可能なブロック空間は 無限になります。

ボックスを直交フロー内に配置すると、逆の結果になる場合があります。 すなわち、ボックスの利用可能なブロック空間は確定している一方で、 利用可能なインライン空間が不確定になる場合があります。 この場合、包含ブロックのインラインサイズに対するパーセンテージを定義できず、 インライン軸の計算を 解決できません。 この場合、 確定した利用可能なインライン空間を必要とする計算では、 利用可能なインライン空間の代わりに、 追加の制約をフォールバックとして使用します。次のうち最小のものです:

CSS のサイズ設定に関する用語と概念の詳細については、 [CSS3-SIZING]を参照してください。

7.3.2. 直交フローにおけるブロックコンテナーの自動サイズ設定

直交フローを確立するボックスが ブロックコンテナーまたは複数列コンテナーのいずれかであり、 ボックスのインライン サイズautoである場合:

  1. 使用column-widthを計算します:
    • column-countcolumn-widthがどちらもautoの場合、 shrink-to-fit の式 min(max-content, max(min-content, constraint))を使用します。 ここで:
      min-content
      ボックスのmin-content インラインサイズ
      max-content
      ボックスのmax-content インラインサイズ
      constraint
      次のうち最小のものにstretch-fitする、 インライン軸のサイズ
      • 利用可能な空間: 包含ブロックのサイズが固定されている場合は、そのサイズ。 そうでない場合は、 包含ブロックの内部最大サイズが表すサイズ(固定されている場合)を、 内部最小サイズ(固定されている場合)を下限として使用します。
      • 最も近い祖先のスクロールポートの内部サイズ(固定されている場合)。 そうでない場合は、内部最大サイズ(固定されている場合)を上限とし、 内部最小サイズ(固定されている場合)を下限とします。
      • 初期包含ブロックのサイズ
      自動的に起動される複数列が T 字型文書を防ぐ図
      この要件により、すべてのブロックコンテナーで複数列フローが自動的に 起動されることに注意してください。これは、オーバーフローする内容が包含ブロックの 側面を越えて続く代わりに、 包含ブロックのフロー方向に列として折り返され、 T 字型文書を回避するためです。 著者は、column-widthを設定することで、これらの列のインラインサイズを制御できます。 また、インラインサイズ プロパティを、 max-contentなどの非 auto値に設定することで、この動作を無効にできます。
    • column-countautoではなく、column-widthautoである場合、 同じ式を使用して、使用column-widthを 計算します。 ただし、constraintを、constraint −(column-count − 1)× column-gapに置き換えます。
    • column-countcolumn-widthがどちらも非 autoである場合、 使用column-widthは、 算出されたcolumn-widthです。 (オーバーフローが生じる可能性があるため、これは推奨されません。 代わりに、column-widthと max-block-size を設定する方が適切です。)
  2. 使用される列の長さを計算します: 算出されたブロックサイズautoであり、column-countcolumn-widthの少なくとも一方の指定値がautoである場合、 ボックスのブロックサイズ確定している場合)、 そうでなければボックスのstretch-fit ブロックサイズ確定している場合)、 それも該当しなければボックスのmax-content ブロックサイズを使用します。 それ以外の場合は、複数列コンテナーの通常のサイズ設定規則に従います。

    この式では、 ボックスのmin-content ブロックサイズも考慮すべきでしょうか。 そうすれば、たとえば大きな画像がボックスからオーバーフローせず、 代わりにボックスが包含ブロックからオーバーフローするようになります。

  3. 使用column-countを計算します: 算出されたcolumn-countautoの場合、 使用column-countは、 結果として得られる複数列レイアウトを ボックスの内容で満たすことによって決まります。

次に、結果として得られる複数列コンテナーの 使用インラインサイズを計算します:

  1. 内容が複数列コンテナー内で行折り返しも断片化もされない場合、 使用インラインサイズは、 ボックス内容のmax-content インラインサイズです。 この基準により、大きな空白を作ることなく、 短い直交フローの内容に shrink-to-fit 動作が与えられます。
  2. それ以外の場合は、使用column-widthcolumn-count、およびcolumn-gapから計算します。

ボックスの使用ブロックサイズは、 使用される列の長さ (複数の列を使用した場合)、 または内容のmax-content ブロックサイズ (一つの列だけを使用した場合)のいずれかです。 UA が CSS Multi-column Layout [CSS3COL]をサポートしない場合、 代わりに、無限の利用可能なブロック空間を想定して ボックスのブロックサイズを計算し、 その内容を単一の列にレイアウトしてもかまいません。 (ただし、包含ブロックからオーバーフローした場合、 内容がクリップされるか、その他の形でアクセス不能になる可能性があります。)

複数列フローの自動起動はリスクありとされ、CR 中に削除される可能性があります。

7.3.3. その他の直交フロールートの自動サイズ設定

行の長さを制限するため、 ブロックコンテナーには、利用可能なインライン空間が無限である場合 (通常は直交フローを確立するとき)に、 特別な自動サイズ設定動作(上で定義)があります。

その他のレイアウトモデルは、単に利用可能なインライン空間が無限の状態で、 max-content サイズとしてレイアウトされます。 ただし、それらが包含するブロックコンテナーには、無限の 利用可能なインライン空間が引き渡されます。 そのため、それらのブロックコンテナー自体が直交フローを確立しない場合でも、 特別な自動サイズ設定動作が起動される可能性があります。

たとえば、 直交フローを確立する表または フレックスコンテナーは、 与えられた利用可能な空間内にレイアウトされます。 利用可能なインライン空間が無限である場合、 実質的にそのボックスはmax-content サイズでレイアウトされます。 ただし、その表セルまたはフレックスアイテムのうち、 ブロックコンテナーであるものは、無限の利用可能なインライン空間を想定してレイアウトされ、 それに応じて動作します。

7.3.4. 直交フローの断片化

この節は参考情報です。

断片化に関しては、CSS2.1 の規則が 縦書きモードと直交フローでも引き続き適用されます。改ページ位置は 行ボックス内ではなく、行ボックス間にのみ存在します。 ただし、[CSS3COL]をサポートする UA は、 列間の(幅がゼロの場合もある) 間隔で分割してもかまいません。

内容がルート要素によって確立されたページ付けストリームの 外側にはみ出した場合、UA はその内容を印刷する必要がないことに注意してください。 長いテキストストリームで書字モードを混在させたい著者には、 すべての内容が文書のページ付け方向に流れるよう維持するため、 CSS の列を使用することを推奨します。

言い換えると、画面上で文書に二つのスクロールバーが 必要になる場合、おそらくすべてを印刷することはできません。 すべてを確実に印刷したい場合は、たとえば を使用して、 全体が一方向にスクロール(したがってページ付け)されるよう レイアウトを修正してください。T 字型文書は、 うまく印刷できない傾向があります。

7.4. フロー相対の対応付け

フロー相対方向は、ボックスの 包含ブロックの書字モードを基準として計算され、 ボックスプロパティ(マージン、ボーダー、パディング)および、 ボックスを包含ブロック内に配置することに関係するプロパティ (floatcleartopbottomleftrightcaption-side)に関係するレイアウト規則を抽象化するために使用されます。 インラインレベルボックスでは、代わりに親 ボックスの書字モードが使用されます。 (left/right/top/bottom という名前のプロパティと値自体は、引き続き物理的に対応付けられます。 ただし、caption-sideには特別な例外があり、 toptop-outside値とbottombottom-outside値は、それぞれ 表のブロック始端側と ブロック終端側に関連付けられます。)

たとえば、ボックスのインライン 寸法が過剰制約となった場合に破棄されるマージンは、 包含ブロックの書字モードによって決定される 終端マージンです。

マージン 相殺規則は、上マージンをブロック始端マージンに置き換え、下マージンをブロック終端マージンに置き換えて、 そのまま適用されます。 同様に、上パディングと上ボーダーは ブロック始端のパディングとボーダーに、 下パディングと下ボーダーはブロック終端のパディングと ボーダーに置き換えられます。 これは、ブロック始端ブロック終端のマージンだけが相殺されることを意味します。

フロー相対方向は、 ボックスの書字モードを基準として計算され、 ボックスの内容に関するレイアウトを抽象化するために使用されます:

7.5. 行相対の対応付け

行相対方向は、上側下側行左、および行右です。 LTRhorizontal-tb書字モードでは、 それぞれ 上、下、左、右の方向に対応します。

行右行左の方向は、 ボックスの書字モードを基準として計算され、 次のプロパティのleft値とright値を 解釈するために使用されます:

行右行左の方向は、 ボックスの包含 ブロックの書字モードを基準として計算され、次のプロパティの left値とright値を解釈するために使用されます:

上側下側の方向は、ボックスの書字モードを基準として 計算され、行ボックスの「上」(上側)と「下」(下側)を 次のように解釈するために使用されます:

7.6. 純粋に物理的な対応付け

次の値は、その定義が純粋に物理的であり、 書字モードの変更には応じません:

8. 主要書字モード

文書の主要書字 モードは、 ルート要素の使用writing-modedirection、および text-orientation値によって 決定されます。 この書字モードは、たとえば、 スクロール方向と、 既定のページ進行方向を決定するために使用されます。

HTML 文書を処理するための特殊な場合として、 ルート要素に body 子要素[HTML]がある場合、 ルート要素のwriting-modeおよびdirectionプロパティの使用値は、 ルート要素自身の値ではなく、 そのような最初の子要素の算出されたwriting-modeおよびdirectionから取得されます。 UA は、text-orientationの値も、 この方法で伝播してもかまいません。 これは、ルート要素自身のwriting-modedirection、またはtext-orientationの算出値には影響しないことに注意してください。

注: 伝播は、算出値ではなく使用値に対して行われます。 これは、継承論理 プロパティの対応付けロジック長さ値の計算など、 スタイル計算のその他の側面を妨げないためです。

8.1. 初期包含ブロックへの伝播

主要 書字モードは、 初期包含ブロックおよびビューポートへ伝播され、 それによってルート要素のレイアウトと ビューポートのスクロール方向に影響します。

@page ボックスにも 伝播するのでしょうか。

8.2. ページフロー: ページ進行方向

ページメディアでは、CSS はすべてのページを左ページまたは右ページに分類します。 見開きの左ページと右ページのどちらがフロー内で先になるか、 および最初のページが既定で左ページと右ページのどちらになるかを決定する ページ進行方向([CSS3PAGE]を参照)は、 主要書字モードに 次のように依存します:

主要書字モード ページ進行
horizontal-tbかつltr 左から右
horizontal-tbかつrtl 右から左
vertical-rlまたはsideways-rl 右から左
vertical-lrまたはsideways-lr 左から右

注: 別途上書きされない限り、 文書の最初のページは見開きの後半から始まります。 たとえば、左から右へのページ進行では右ページから始まります。

9. グリフ合成

9.1. 縦中横合成: text-combine-uprightプロパティ

名前: text-combine-upright
値: none | all | [ digits <integer>? ]
初期値: none
適用対象: 非置換インライン要素
継承: はい
パーセンテージ: n/a
算出値: 指定されたキーワード。digitsの場合は整数も含む
正規順序: n/a
アニメーション型: アニメーション不可

このプロパティは、複数の組版文字単位を、単一の 組版文字単位の空間へ合成することを指定します。 合成されたテキストの幅が 1em より広い場合、UA は内容を 1em 内に収めなければなりません。以下を参照してください。 結果として得られる合成は、レイアウトと装飾の目的では単一の正立グリフとして扱われます。 このプロパティは縦書きモードでのみ効果があります。値は次の意味を持ちます:

none
特別な処理は行いません。
all
ボックス内で連続するすべての組版文字単位が、 縦書き行ボックス内の単一の組版 文字単位の空間を占めるよう、横書きで組むことを試みます。
digits <integer>?
指定された整数以下の桁数を持つ、 連続する ASCII 数字(U+0030–U+0039)の各極大シーケンスを、 縦書き行 ボックス内の単一の組版文字単位の空間を占めるよう、 横書きで組むことを試みます。 整数を省略した場合、その算出値は 2 です。 2~4 の範囲外の整数は無効です。

東アジアの文書では、text-combine-uprightの効果が、 日付の構成要素や頭字語の 文字など、ラテン文字ベースの文字列を、行の書字モードにかかわらず 常に横書きモードで表示するためによく使用されます:

日付の二桁の数字を縦書きテキストの列内で
                   半角幅にして横並びにした縦中横の図

縦中横の例

この図は、次の規則

date { text-combine-upright: digits 2; }

と、次のマークアップによる結果です:

<date>平成20年4月16日に</date>

日本語では、この効果を縦中横と呼びます。

次の例は、既知の種類の数値内容を含む部分ではなく、 文書全体にtext-combine-upright: digits 2を適用すると、 意図しない結果が生じる場合があることを示します:

<p>あれは10,000円ですよ!</p>

上のマークアップを 'text-combine-upright: digits' でレンダリングしたもの:
                   数字の最初の二桁は縦中横としてレンダリングされ、
                   残りの数字は横倒しでレンダリングされます。

縦中横を誤って適用した例

9.1.1. テキストランの規則

レンダリングとレイアウトの複雑化を避けるため、text-combine-uprightで 合成できるのは、プレーンテキスト、 すなわちボックス境界によって中断されない連続する組版文字単位だけです。

ただし、このプロパティは継承されるため、 UA は、合成を実行するボックスの内容が、 ボックスの外側で開始または終了する、 それ以外では合成可能なシーケンスの一部ではないことを保証しなければなりません。 その一部である場合、テキストは text-combine-uprightnoneであるかのように、通常どおりレイアウトされます。 シーケンスの一部だけを合成しないようにするため、 合成可能性のあるランの境界が 一つ以上のインラインボックス境界だけによる場合、 UA はランの直前と直後に現れる 文字を調べなければなりません。 介在するボックスがなければ、これらの文字が (長すぎなければ)合成されるシーケンスを形成する場合、 候補ランは合成されません。

上の段落はリスクありとされています。実装者からのコメントを歓迎します。

たとえば、次の規則があり、

tcy { text-combine-upright: digits 4; }

次のマークアップが与えられた場合:

<tcy>12<span>34</span></tcy>

どのテキストも合成されません。12 と 34 はどちらも、同じtext-combine-upright値を持つ祖先を共有するため、 ボックス境界によって中断された、合成可能な四桁のシーケンスの一部と見なされます。 ただし、次の場合:

12<tcy><span>34</span></tcy>12<tcy><span></span>34</tcy>
12<tcy>34<span></span></tcy>

34 は合成されます。これは、直前の 12 と 34 が、共通の text-combine-uprightを持つ祖先を共有しないためです。 したがって、34 は、合成可能な二桁のシーケンス全体であると見なされます。

次の規則を使用した場合も、

tcy { text-combine-upright: all; }

同じ結果になります。 最初の場合は、1234 がボックス境界によって中断された四つの合成可能な文字のシーケンスを形成するため合成されず、 二番目の場合は、34 が二つの合成可能な文字のシーケンス全体を形成するため合成されます。

text-combine-uprightの値 (allまたはdigits)は、 合成できる組版文字単位の種類と、 合成可能なシーケンスの最大長だけに影響することに注意してください。 それ以外の動作は変わりません。

9.1.2. レイアウト規則

text-combine-upright: allの場合のようにテキストを合成するとき、 合成されたテキストのグリフは双方向分離され、横方向に組まれます。 (letter-spacingと強制改行は無視しますが、 指定されたフォント設定を使用します。) これは、横書きモードで、 line-height1emである inline-blockボックスの内容に似ています。 合成されたテキストの始端/終端に含まれる文書の空白は、 そのようなインラインブロックの始端/終端にあるものとして、[CSS-TEXT-3]に従って処理 されます。 合成の有効サイズは 1em 四方と見なされ、 その正方形の外側にあるものは、レイアウトの目的では測定されません。 UA は、測定された 1em 四方の中でグリフを水平方向および垂直方向の中央に配置すべきです。

結果として得られる合成のベースラインは、ベースライン整列による 移動(vertical-align)を行う前に、 正方形が親インラインボックスの text-over ベースラインと text-under ベースラインの間で 中央に配置されるよう選択しなければなりません。 双方向の並べ替えでは、合成は text-orientation: uprightである組版文字単位と同様に扱われます。 合成の前後における改行では、実際の内容を持つ通常のインラインとして扱われます。 強調記号、テキスト装飾、間隔など、 その他のテキストレイアウトの目的では、結果として得られる合成は、 オブジェクト置換文字 U+FFFC を表す単一のグリフとして扱われます。

9.1.3. 圧縮規則

UA は、必要に応じて合成テキストを圧縮し、 合成の合計送り幅が 1em 内に収まるようにしなければなりません。 (一部のグリフは幾何学的境界の外側に描画されるよう設計されているため、 必ずしもグリフ自体が 1em 内に収まることを意味しません。) OpenType の実装は、合成内のすべての組版文字単位で利用できる場合、 幅固有の異体字 (OpenType 機能のhwidtwidqwidfwidpwidなどのその他のグリフ幅機能は含みません)を使用して テキストを圧縮しなければなりません。 それ以外の場合、UA はテキストを圧縮するために任意の方法を使用できます。 これには、フォントが提供する半角幅、3 分の 1 幅、4 分の 1 幅のグリフへの置換、 テキストを水平方向に圧縮するために設計されたその他のフォント機能の使用、 テキストの幾何学的な拡縮、 またはそれらの任意の組み合わせが含まれます。

たとえば、単純な OpenType ベースの実装では、次のようにテキストを圧縮できます:

  1. n個の組版文字単位からなる合成テキストでは、 1/n幅のグリフを有効にします(すなわち、二つの組版文字 単位には OpenType のhwid、三つの組版文字単位にはtwidなど)。 ただし、組版文字単位の 数が 1 より大きい場合に限ります。 組版文字 単位の数 ≠ Unicode コードポイントの数であることに注意してください。
  2. 結果が 1em より広い場合、その結果を水平方向に 1em まで拡縮します。

OpenType レイアウト機能を利用する別の実装では、 最初に通常のグリフでテキストを組んで収まるか確認し、 必要に応じて利用可能な半角幅または 3 分の 1 幅の字形に置換し、 利用可能なグリフ置換に応じて、 手法を調整したり拡縮処理と組み合わせたりできます。

一部のフォントでは、表意文字のグリフが 幅 1em、高さ 1em 未満となるよう圧縮して設計されています。 そのようなフォントに対応するため、UA は、 指定されたフォント設定に従ってレンダリングされる「水」U+6C34 の送り高さに一致するよう、 合成を垂直方向に拡縮してもかまいません。 この場合、結果として得られる合成は、 1em ではなく「水」U+6C34 の送り高さを使用します。

9.1.3.1. 全角文字

テキストを 1em に圧縮するときに組版上の色調を維持するため、 合成されたテキストが複数の組版文字単位で構成される場合、 他の圧縮手法を適用する前に、全角の組版文字単位を、 [CSS-TEXT-3]text-transform: full-widthについて定義されたアルゴリズムを逆に適用して、 対応する非全角のものへ変換すべきです。

たとえば、著者は、縦書きテキストで組まれた日付に text-transformtext-combine-uprightの両方を適用できます。

date { text-combine-upright: digits 2; text-transform: full-width; }

このスタイル規則を、次のような日付に適用するものとします。

<date>2010年2月23日</date>

「2010」は長すぎるため合成されません(4 桁)が、「2」と「23」は影響を受けます。 「23」は複数の組版文字単位であるため、 text-transform: full-widthの影響を受けません。 ただし、「2」は一つの組版文字 単位だけであるため、 全角の「2」に変換されます。 「2010」は合成されなかったため、その数字も全角の「2010」に変換されます。 そして全角であるため、正立して組まれ、次の結果になります:

2
0
1
0
年
2
月
23
日

[CSS3-FONTS]で定義されるfont-variantおよびfont-feature-settingsプロパティなど、 グリフ選択に影響するプロパティは、 合成されたテキストランに含まれる文字の異体字選択に影響する可能性があります。 著者には、text-combine-uprightも使用する場合、 これらのプロパティを注意して使用することを推奨します。

10. プライバシーとセキュリティに関する考慮事項

この仕様では、「正しく実装すること」以外に、 新たなプライバシー漏洩やセキュリティ上の考慮事項は導入されません。

変更点

2018年5月の CSS 書字モードモジュール レベル 4 勧告候補以降の変更点

レベル 4 の新機能

このモジュールは、単に2015年の CSS 書字モード レベル 3 勧告候補を複製したものです。 現在の CSS 書字モード レベル 3との違いは、実装への採用が遅かったためレベル 3 から延期された一連の機能です:

謝辞

L. David Baron, Brian Birtles, James Clark, John Daggett, Nami Fujii, Daisaku Hataoka, Martin Heijdra, Laurentiu Iancu, Richard Ishida, Jonathan Kew, Yasuo Kida, Tatsuo Kobayashi, Toshi Kobayashi, Ken Lunde, Shunsuke Matsuki, Nat McCully, Eric Muller, Paul Nelson, Kenzou Onozawa, Chris Pratley, Xidorn Quan, Florian Rivoal, Dwayne Robinson, Simon Sapin, Marcin Sawicki, Dirk Schulze, Hajime Shiozawa, Alan Stearns, Michel Suignard, Takao Suzuki, Gérard Talbot, Masataka Yakura, Taro Yamamoto, Steve Zilles

付録 A: Unicode における縦書き用字系

この節は参考情報です。

この付録では、Unicode 6.0 [UNICODE]に含まれる縦書き専用および両方向の用字系と、横書き方向から縦書き方向への変換を列挙します。 明示的に列挙されていない用字系は、横書き専用であると見なされます。 Unicode 文字の用字系分類は、[UAX24]によって与えられます。

Unicode における縦書き用字系
コード 名前 変換(時計回り) 固有の縦書き方向
Bopo 注音符号 ttb
Egyp エジプト・ヒエログリフ ttb
Hira ひらがな ttb
Kana カタカナ ttb
Hani 漢字 ttb
Hang ハングル ttb
Merc メロエ草書体 ttb
Mero メロエ・ヒエログリフ ttb
Mong モンゴル文字 90° ttb
Ogam オガム文字 -90° btt
Orkh 古代テュルク文字 -90° ttb
Phag パスパ文字 90° ttb
Yiii イ文字 ttb

例外: この仕様では、すべての全角(F)文字と幅広(W)文字を 縦書き用字系に属するものとして扱い、 半角(H)文字を横書き用字系に属するものとして扱います。[UAX11]

縦書き専用文字(モンゴル文字やパスパ文字など)については、 Unicode コード表内のグリフが縦書き方向で示されていることに注意してください。 横書きテキストでは、この向きから反時計回りに 90° 回転させて組まれます。

Unicode Technical Report 50 と CSS Writing Modes の現在の機能セットには 制限があるため、縦書きのmixed組版では、 オガム文字も古代テュルク文字も自動的に処理できません。 これらの用字系の文章を組むには、sideways-lrを使用できます。

適合性

文書の表記規則

適合要件は、説明的な表明と RFC 2119 の用語を組み合わせて表現されます。この文書の規範的な部分にある 「MUST」、「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、 「SHOULD」、「SHOULD NOT」、「RECOMMENDED」、「MAY」、および「OPTIONAL」という キーワードは、RFC 2119 の説明に従って解釈されます。 ただし、読みやすさのため、この仕様ではこれらの語がすべて 大文字で記載されるとは限りません。

明示的に非規範的と記された節、例、および注記を除き、 この仕様のすべてのテキストは規範的です。[RFC2119]

この仕様の例は、「たとえば」という語で導入されるか、 次のように、class="example"によって規範的なテキストから 分離されます:

これは参考情報としての例です。

参考情報としての注記は「注」という語で始まり、 次のように、class="note"によって規範的なテキストから分離されます:

注: これは参考情報としての注記です。

勧告事項は、特に注意を促すようスタイル設定された規範的な節であり、 次のように、<strong class="advisement">によって他の規範的なテキストから 分離されます: UA はアクセシブルな代替を提供しなければなりません。

適合クラス

この仕様への適合性は、 次の三つの適合クラスについて定義されます:

スタイルシート
CSS スタイルシート
レンダラー
スタイルシートの意味を解釈し、 それを使用する文書をレンダリングするUA
オーサリングツール
スタイルシートを作成するUA

このモジュールで定義される構文を使用するすべての文が、 CSS の一般文法およびこのモジュールで定義される各機能の 個別の文法に従って妥当である場合、 スタイルシートはこの仕様に適合します。

適切な仕様で定義されるとおりに スタイルシートを解釈することに加え、この仕様で定義される すべての機能を正しく解析し、 それに従って文書をレンダリングすることでサポートする場合、 レンダラーはこの仕様に適合します。ただし、 デバイスの制限によって UA が文書を正しくレンダリングできないことは、 UA を不適合にはしません。(たとえば、UA は モノクロモニター上で色をレンダリングする必要はありません。)

CSS の一般文法および このモジュールの各機能の個別文法に従って構文的に正しいスタイルシートを作成し、 このモジュールで説明されるスタイルシートの その他すべての適合要件を満たす場合、 オーサリングツールはこの仕様に適合します。

CSS の責任ある 実装に関する要件

次の各節では、現在および将来の相互運用性を 促進する方法で CSS を責任を持って実装するための、 複数の適合要件を定義します。

部分実装

著者が前方互換な解析規則を利用してフォールバック値を割り当てられるように、CSS レンダラーは、 利用可能な水準のサポートを提供していない すべての @規則、プロパティ、プロパティ値、キーワード、およびその他の構文構造を 無効として扱い (必要に応じて無視し) なければなりません。 特に、ユーザーエージェントは、一つの複数値プロパティ宣言において、 サポートされていないプロパティ値だけを選択的に無視し、サポートされている値を尊重してはなりません。 いずれかの値が無効と見なされる場合(サポートされていない値は無効と見なさなければなりません)、 CSS では宣言全体を無視する必要があります。

不安定な機能および 独自機能の実装

将来の安定した CSS 機能との競合を避けるため、 CSSWG は、CSS の不安定な機能と独自拡張を実装する際、 ベストプラクティスに従うことを推奨します。

CR レベルの 機能の実装

仕様が勧告候補段階に達した後、 実装者は、仕様に従って正しく実装されていることを 実証できる CR レベル機能について、 接頭辞なしの実装を公開し、 その機能の接頭辞付き変種を公開することは避けるべきです。

実装間で CSS の相互運用性を確立し維持するため、 CSS ワーキンググループは、実験用ではない CSS レンダラーに対し、CSS 機能の接頭辞なしの実装を 公開する前に、実装報告書(必要であれば、 その実装報告書で使用したテストケースも)を W3C へ提出するよう求めています。 W3C に提出されたテストケースは、CSS ワーキンググループによるレビューと修正の対象となります。

テストケースと実装報告書の提出に関する詳細は、 CSS ワーキンググループのウェブサイトhttps://www.w3.org/Style/CSS/Test/で確認できます。 質問は、public-css-testsuite@w3.orgメーリング リストへ送信してください。

CR 終了基準

この仕様が勧告案へ進むためには、 各機能について、独立した相互運用可能な実装が少なくとも二つ 存在しなければなりません。各機能は異なる一連の 製品によって実装してもよく、単一の製品が すべての機能を実装する必要はありません。この基準では、 次の用語を定義します:

独立
各実装は異なる当事者によって 開発されなければならず、適格な別の実装で 使用されたコードを共有、再利用、または派生させることはできません。 この仕様の実装に関係しないコードの部分は、 この要件から除外されます。
相互運用可能
公式 CSS テストスイート内の 該当するテストケースに合格すること、または実装がウェブ ブラウザーではない場合は同等のテストに合格することです。そのようなユーザー エージェント(UA)を相互運用性の主張に使用する場合、 テストスイート内の関連する各テストについて同等のテストを作成すべきです。 さらに、そのような UA を相互運用性の主張に使用する場合、 相互運用性を目的として、それらの同等のテストに同じ方法で合格できる 一つ以上の追加の UA が 存在しなければなりません。同等のテストは、ピアレビューのために 公開しなければなりません。
実装
次を満たすユーザーエージェント:
  1. 仕様を実装している。
  2. 一般に公開されている。実装は、 出荷製品またはその他の公開版 (ベータ版、プレビューリリース、「ナイトリービルド」など)でもかまいません。 出荷されていない製品リリースでは、安定性を 実証するため、少なくとも 1 か月間その機能を 実装していなければなりません。
  3. 実験用ではない(すなわち、テストスイートに合格するためだけに設計され、 今後の通常使用を意図しない版ではない)。

この仕様は、少なくとも 6 か月間、勧告候補のままとなります。

索引

この仕様で定義される 用語

参照文献で定義される用語

参考文献

規範参照文献

[CSS-BOX-3]
Elika Etemad. CSS ボックスモデルモジュール レベル 3. 2018年12月18日. WD. URL: https://www.w3.org/TR/css-box-3/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS 断片化モジュール レベル 3. 2018年12月4日. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS 断片化モジュール レベル 4. 2018年12月18日. WD. URL: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-4]
Elika Etemad; Tab Atkins Jr.. CSS カスケーディングと継承 レベル 4. 2018年8月28日. CR. URL: https://www.w3.org/TR/css-cascade-4/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS 表示モジュール レベル 3. 2019年7月11日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-INLINE-3]
Dave Cramer; Elika Etemad; Steve Zilles. CSS インラインレイアウト モジュール レベル 3. 2018年8月8日. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-MASKING-1]
Dirk Schulze; Brian Birtles; Tab Atkins Jr.. CSS マスキング モジュール レベル 1. 2014年8月26日. CR. URL: https://www.w3.org/TR/css-masking-1/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS オーバーフロー モジュール レベル 3. 2018年7月31日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS テキストモジュール レベル 3. 2018年12月12日. WD. URL: https://www.w3.org/TR/css-text-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 値と単位モジュール レベル 3. 2019年6月6日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 値と単位モジュール レベル 4. 2019年1月31日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS2]
Bert Bos; et al. カスケーディングスタイルシート レベル 2 改訂 1 (CSS 2.1) 仕様. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS2/
[CSS3-IMAGES]
Elika Etemad; Tab Atkins Jr.. CSS 画像値と置換 コンテンツモジュール レベル 3. 2012年4月17日. CR. URL: https://www.w3.org/TR/css3-images/
[CSS3-SIZING]
Tab Atkins Jr.; Elika Etemad. CSS 内在的 & 外在的 サイズ決定モジュール レベル 3. 2019年5月22日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS3-TEXT-DECOR]
Elika Etemad; Koji Ishii. CSS テキスト装飾モジュール レベル 3. 2018年7月3日. CR. URL: https://www.w3.org/TR/css-text-decor-3/
[CSS3BG]
Bert Bos; Elika Etemad; Brad Kemper. CSS 背景と 境界線モジュール レベル 3. 2017年10月17日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS3COL]
Florian Rivoal; Rachel Andrew. CSS 段組みレイアウト モジュール レベル 1. 2018年5月28日. WD. URL: https://www.w3.org/TR/css-multicol-1/
[CSS3PAGE]
Elika Etemad; Simon Sapin. CSS ページメディアモジュール レベル 3. 2018年10月18日. WD. URL: https://www.w3.org/TR/css-page-3/
[HTML]
Anne van Kesteren; et al. HTML 標準. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. RFC における要求レベルを示すために使用する キーワード. 1997年3月. 現行の最良慣行. URL: https://tools.ietf.org/html/rfc2119
[RFC6919]
R. Barnes; S. Kent; E. Rescorla. RFC における 要求レベルを示すために使用する追加のキーワード. 2013年4月1日. 実験的. URL: https://tools.ietf.org/html/rfc6919
[SVG11]
Erik Dahlström; et al. スケーラブルベクターグラフィックス (SVG) 1.1 (第2版). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/
[UAX11]
Ken Lunde 小林劍󠄁. 東アジアの幅. 2019年1月25日. Unicode 標準附属書 #11. URL: https://www.unicode.org/reports/tr11/tr11-36.html
[UAX24]
Ken Whistler. Unicode スクリプトプロパティ. 2019年2月6日. Unicode 標準附属書 #24. URL: https://www.unicode.org/reports/tr24/tr24-29.html
[UAX9]
Mark Davis; Aharon Lanin; Andrew Glass. Unicode 双方向アルゴリズム. 2019年2月4日. Unicode 標準附属書 #9. URL: https://www.unicode.org/reports/tr9/tr9-41.html
[UNICODE]
Unicode 標準. URL: https://www.unicode.org/versions/latest/
[UTR50]
Koji Ishii 石井宏治; Ken Lunde 小林劍󠄁. Unicode 縦書きテキストレイアウト. 2019年2月4日. Unicode 標準附属書 #50. URL: https://www.unicode.org/reports/tr50/tr50-22.html

参考情報としての参照文献

[CSS3-FLEXBOX]
Tab Atkins Jr.; et al. CSS フレキシブルボックスレイアウトモジュール レベル 1. 2018年11月19日. CR. URL: https://www.w3.org/TR/css-flexbox-1/
[CSS3-FONTS]
John Daggett; Myles Maxfield; Chris Lilley. CSS フォントモジュール レベル 3. 2018年9月20日. REC. URL: https://www.w3.org/TR/css-fonts-3/
[HTML401]
Dave Raggett; Arnaud Le Hors; Ian Jacobs. HTML 4.01 仕様. 2018年3月27日. REC. URL: https://www.w3.org/TR/html401/
[HTML5]
Ian Hickson; et al. HTML5. 2018年3月27日. REC. URL: https://www.w3.org/TR/html5/
[UTN22]
Elika J. Etemad. 堅牢な縦書きテキストレイアウト. 2005年4月25日. Unicode 技術ノート #22. URL: https://unicode.org/notes/tn22/

プロパティ索引

名前 初期値 適用対象 継承 % アニメーション可否 アニメーション型 正規順序 算出値
direction ltr | rtl ltr すべての要素 はい n/a アニメーション不可 n/a 指定値
glyph-orientation-vertical auto | 0deg | 90deg | 0 | 90 n/a n/a na/ n/a n/a n/a n/a
text-combine-upright none | all | [ digits <integer>? ] none 非置換インライン要素 はい n/a アニメーション不可 n/a 指定されたキーワード。digits の場合は整数も含む
text-orientation mixed | upright | sideways mixed 表の行グループ、行、列グループ、および列を除くすべての要素 はい n/a アニメーション不可 n/a 指定値
unicode-bidi normal | embed | isolate | bidi-override | isolate-override | plaintext normal すべての要素(ただし本文を参照) いいえ n/a アニメーション不可 文法に従う 指定値
writing-mode horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr horizontal-tb 表の行グループ、表の列グループ、表の行、表の列、ルビベース コンテナー、およびルビ注釈コンテナーを除くすべての要素 はい n/a アニメーション不可 n/a 指定値

課題索引

この式では、ボックスのmin-content ブロックサイズも考慮すべきでしょうか。 そうすれば、 たとえば大きな画像がボックスからオーバーフローせず、 代わりにボックスが包含ブロックからオーバーフローするようになります。
これは @page ボックスにも伝播しますか?