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/
課題管理:
Tracker
仕様内インライン
GitHub Issue
編集者:
Elika J. Etemad / fantasai (招待専門家)
(Google)
前編集者:
(Antenna House)
(Microsoft)
(Microsoft)
この仕様への編集提案:
GitHub Editor

概要

CSS書き方モード レベル4は、CSSによる様々な書き方モードおよびその組み合わせ、左から右・右から左のテキスト順序、水平・垂直方向への対応を定義します。

CSSは、構造化された文書(HTMLやXMLなど)の画面表示や印刷などのレンダリング方法を記述するための言語です。

この文書のステータス

このセクションは、本書が公開された時点での文書のステータスを説明します。 他の文書が本書に取って代わる可能性があります。 現在のW3C出版物の一覧や本技術レポートの最新改訂版は W3C技術レポートインデックス https://www.w3.org/TR/で参照できます。

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

この仕様に関する議論はGitHub Issuesが推奨されています。 Issueを提出する際は、タイトルに「css-writing-modes」と記載してください。 できればこのように記載してください: “[css-writing-modes] …コメント要約…”。 すべてのIssueやコメントはアーカイブされており、過去のアーカイブもあります。

ドラフトの実装報告はまだ利用できません。

候補勧告として公開されても、W3Cメンバーシップによる支持を意味するものではありません。 この文書はドラフトであり、他の文書によって随時更新・置換・廃止される可能性があります。 この文書を進行中の作業以外として引用するのは不適切です。

この文書は W3C特許ポリシーの下で運営されているグループによって作成されました。 W3Cはグループの成果物に関連して行われた特許開示の公開リストを維持しています。 そのページには特許開示の方法についても記載されています。 特許の存在を知る者は、その特許が必須クレームを含むと考える場合、W3C特許ポリシー第6節に従って情報を開示しなければなりません。

この文書は2019年3月1日 W3Cプロセス文書に従って管理されています。

前回のドラフトからの変更点は、 変更点セクションを参照してください。

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

「リスクあり」はW3Cプロセス用語であり、必ずしも機能が削除や遅延の危険にさらされていることを意味しません。WGが機能の相互運用性の実現に困難があると考えた場合、候補勧告から提案勧告へ移行する際に、新しい候補勧告を公開することなく機能を削除できるよう、その旨を示しています。

1. 書字モードの概要

CSS書き方モード レベル4は、左から右(例:ラテンやインド系)、右から左(例:ヘブライ語やアラビア語)、双方向(例:ラテン語とアラビア語の混在)、縦書き(例:アジア系文字)など、さまざまな国際的な書字モードをサポートするCSS機能を定義します。

CSSの書字モードは、writing-modedirectiontext-orientationプロパティによって決定されます。主にインライン基本方向ブロックフロー方向で定義されます:

インライン基本方向は、行内のコンテンツが並ぶ主方向であり、行の「開始」と「終了」がどちらかを定義します。directionプロパティは、ボックスのインライン基本方向を指定し、unicode-bidiプロパティやテキスト自体の持つ方向性とともに、行内のインラインレベルコンテンツの並び順を決定します。

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

組版モードは、縦書き文字に特有の組版慣習をテキストに適用するかどうかを決定します。 この概念は、縦書き文字のための縦フローと、横書きフローの回転とを区別します。

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

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

書記体系には通常1つまたは2つの固有の書字モードがあります。例:

書字モードのtext-orientationコンポーネントは、グリフの向きを制御します。

書字モードと縦書きテキストのより詳しい解説については、Unicode技術ノート#22 [UTN22]HTML版)をご覧ください。

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

このモジュールは、unicode-bidiおよびdirectionの機能([CSS2]の8.6節と9.10節で定義)を置き換え・拡張します。 その機能が、テキストの行配置における他のテキスト操作とどのように相互作用するかは、CSS Text 3 § テキスト処理順序で説明されています。

computed values(算出値)は、writing-modedirectiontext-orientationプロパティ(これらのプロパティが適用されない要素にも適用される場合がある [CSS-CASCADE-4])は、フォント相対長の算出や、算出されたフロー相対プロパティ(算出されたwriting modeや、writing modeに依存するフォントメトリクスに依存することがある)に基づくカスケードなど、他の無関係なプロパティの算出値に幅広く影響を与えることができます。

1.2. 値の種類と用語

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

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

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

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

多くの文字体系は左から右に記述されますが、一部の文字体系は右から左に記述されます。特にアラビア語やヘブライ語などで書かれた文書や、複数言語が混在する状況では、1つの(視覚的に表示される)ブロック内で混在した方向性のテキストが現れることがあります。この現象は双方向性(略称:bidi)と呼ばれます。

双方向テキストの例は、アラビア語の文中にラテン語名が挿入されたものです。文全体は右から左に組版されますが、中央のラテン語の単語は左から右に組版されます。

双方向性

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

CSSには、directionunicode-bidiの2つのプロパティがあり、CSS層での埋め込み・分離・上書き制御を明示的に提供します。 テキストの基本方向は文書の構造や意味に依存するため、directionunicode-bidiプロパティは、ほとんどの場合、マークアップ内のbidi情報をCSSスタイルに対応付けるためだけに使用すべきです。

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

文書言語がbidi制御用のマークアップ機能を提供している場合は、著者やユーザーはそちらを優先して使用し、それを上書きするCSSルールを指定しないでください。

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

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

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

このプロパティは、ボックスによって確立されるbidi段落・埋め込み・分離・上書きのインライン基本方向または方向性を指定します。(unicode-bidiも参照。)さらに、テーブルの列レイアウト順序や、水平overflow方向、行内のテキストのデフォルト配置、その他ボックスのインライン基本方向に依存するレイアウト効果にも影響します。

このプロパティの値の意味は以下の通りです:

ltr
この値はインライン基本方向(bidi方向性)をline-leftからline-rightへと設定します。
rtl
この値はインライン基本方向(bidi方向性)をline-rightからline-leftへと設定します。

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
適用対象: 全ての要素(詳細は本文参照)
継承: いいえ
パーセンテージ: 該当なし
算出値: 指定値
正規順序: 文法による
アニメーションタイプ: アニメーション不可

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

通常(つまりunicode-bidinormalの場合)、 インラインボックスはUnicode双方向アルゴリズムに対して透過的です。 コンテンツは、ボックスの境界が存在しないかのように並びます。 unicode-bidiプロパティの他の値は、インラインボックスがアルゴリズム内でスコープを作り、テキストの固有方向性を上書きする原因となります。

以下の参考表は、unicode-bidiのボックス内外への影響をまとめています:

インラインボックスにおけるnormal以外のunicode-bidi値の効果
外側
中立
内側 スコープ embed isolate
上書き bidi-override isolate-override
plaintext plaintext

このプロパティの値の意味は以下の通りです:

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

この値はインラインでないボックスには効果がありません。

isolate
インラインボックス上で、この値はbidi-isolate(双方向分離)を行います。 これは方向性埋め込みに似ています(埋め込みレベルも増加します)が、ブロック境界や強制段落区切りで途切れないインラインレベルのボックスの各連続は分離されたシーケンスとして扱われます:
  • シーケンス内のコンテンツは、ボックスのdirectionプロパティで指定された基本方向性を持つ独立した段落内にあるかのように並べられます。
  • 包含する双方向段落でのbidi解決のために、そのシーケンスは1つのオブジェクト置換文字(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-overrideplaintextを設定しても、子孫ブロックには影響しません。したがって、これらの値はブロックやインラインがブロックレベル構造を含まない場合に使用するのが最適です。

また、unicode-bididirectionプロパティに影響を与えません(plaintextの場合も同様)ので、direction依存のレイアウト計算には影響しません。

Unicodeアルゴリズムには埋め込みレベルの上限(125)があるため、unicode-bidi値(normal以外)の使い過ぎには注意が必要です。 特に、深くネストされたインラインマークアップではinheritの値は慎重に使うべきです。 ただし、一般的にブロック表示される要素には、unicode-bidi: isolateを設定しておくことで、displayinlineに変更された場合でも要素を一体化できます(下記例参照)。

2.3. 双方向テキストの例

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

この例では、小文字は本来左から右の文字、大文字は本来右から左の文字を表します。テキストストリームは以下のように論理的な順序で示されています。

<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>要素は右から左の基本方向を持つブロックで、2つ目の<section>要素は左から右の基本方向を持つブロックです。 <para>は親から基本方向を継承するブロックです。 そのため、最初の2つの<para>は右上から読み始め、最後の3つは左上から読み始めます。

<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. 双方向並び替えアルゴリズムの適用

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

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

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

ただし、例外が1つあります。 段落を含むブロックの算出されたunicode-bidiplaintextの場合は、 HL1による上書きをせず、[UAX9]で記載されているP2・P3のUnicodeヒューリスティックが使用されます。

2.4.2. CSSとUnicode双方向制御コード変換、テキスト並び替え

双方向段落内の文字の最終的な順序は、 上記unicode-bidiに記載された方法で双方向制御コードを追加し、 マークアップを除去したあと、得られた文字列を、 スタイリングされたテキストと同じ改行位置を持つプレーンテキスト用Unicode双方向アルゴリズムの実装に渡した場合と同じ順序になります。

ソーステキスト中の双方向制御コードは依然として尊重され、 文書ツリー構造と一致しない場合があります。 これにより、インラインの分割や双方向開始・終了制御コードのペアリングに予期しない影響が生じることがあります。

2.4.3. アトミックインラインの双方向処理

この処理において、置換要素display: inlineが指定されているものは、unicode-bidiプロパティがembedまたはbidi-overrideの場合を除き、中立文字として扱われます。 上記2つの場合は、要素に指定されたdirectionにおける強い文字として扱われます。 (これは、置換要素がインラインテキストにフォールバックした場合でも、周囲のテキストへの双方向効果が置換レンダリングと一致するためです。)

その他のアトミックインラインレベルボックスは常に中立文字として扱われます。

2.4.4. 埋め込み・分離内の段落改行

インラインボックスが双方向段落の境界(例:ブロックや強制段落区切りによる分割)で分割された場合、 ボックスの終了時に割り当てられるHL3双方向制御コードも中断前に追加され、 ボックスの開始時に割り当てられるコードも中断後に追加されます。 (つまり、ボックスによって開始された埋め込みレベル・分離・上書きは段落区切りで閉じられ、区切りの先で再び開始されます。)

例えば、<BR/>が強制段落区切りの場合、双方向並びは以下の2つで同一となります。

<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の双方向フォーマット制御には適用されません。 Unicode制御は双方向段落の終端でその効果が終了するように定義されています。

2.4.5. 並び替えによるボックス断片化

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

2.4.5.1. 並び替えによるボックス断片化の条件

双方向並び替えによって、間に他のコンテンツが介在することでインラインボックスが分割される場合、 インラインボックスは複数のボックス断片に分割されたものとみなされます。[CSS-BREAK-3] 無限に長い行で間にコンテンツが介在する場合に分割されるなら、行分割によって両方のボックス断片が隣り合って配置された場合でも、分割されたものとみなされます。 この場合、2つのボックス断片のテキストの最近共通祖先(トラッキング両端揃えの扱いに影響する、[CSS-TEXT-3]参照)は、インラインボックス自身ではなく、2つの断片の最近共通祖先とみなされます。 ただし、間に介在するコンテンツがなければ、インラインボックスは双方向並び替えによって複数の断片に分割されたものとはみなされません。 (これらの規則は、可能な限りインラインボックスの一体性を保ちつつ、双方向断片化を行分割の違いに左右されず安定化します。)

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

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

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

広いコンテナブロックでのレンダリング(視覚順)。2つのインラインボックス断片が外部コンテンツで分離:

here is some TXET DEXIM.

狭いコンテナブロックでのレンダリング(視覚順)。2つのインラインボックス断片が隣り合う:

here is some DEXIM
TXET.
対照的に、次の例では、 混在方向のフレーズを分離(isolation)でまとめているため、 生成される断片は1つだけです。周囲のコンテンツによって<em>インラインボックスが分割されることは、無限に長いコンテナブロック内でも決してありません。

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

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

広いコンテナブロックでのレンダリング(視覚順)。断片は1つ:

here is some DEXIM TXET.

狭いコンテナブロックでのレンダリング(視覚順)。断片は1つ:

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」などの略語は文字を立てて配列する。

縦書き日本語の中のラテン文字例:Daijirin Viewer 1.4(iOS)

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

MacFanの一部。複数の縦書きレイアウト例:月日など2桁数字は縦中横で、年は各文字を立てて表示。ただし英語フレーズ「for Mac 2011」では日付も回転してラテン文字と揃える。

Mac Fan 2010年12月号 p.49

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

雑誌などでは横書きと縦書きレイアウトが混在することが多い。例えば本文は縦書き、サイドバーや図版は横書きなど。

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

縦書きレイアウトでも双方向テキスト処理が必要な場合があります。例えば、アラビア語を時計回りに回転した場合は下から上にレイアウトされます。

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

名前: writing-mode
値: horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr
初期値: horizontal-tb
適用対象: テーブル行グループ、テーブル列グループ、テーブル行、テーブル列、ルビベースコンテナ、ルビ注釈コンテナを除く全ての要素
継承: はい
パーセンテージ: 該当なし
算出値: 指定値
正規順序: 該当なし
アニメーションタイプ: アニメーション不可

このプロパティは、テキストの行を水平または垂直に配置するか、およびブロックの進行方向を指定します。指定可能な値:

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

writing-modeプロパティはブロックフロー方向を指定し、 ブロック整形コンテキスト内のブロックレベルボックスの並び順、 インラインを含むブロックコンテナ内の行ボックスの並び順、 テーブルの行の並び順などを決定します。 行ボックスの積み重ね方向を決めることにより、 writing-modeプロパティは 行ボックスの向き(つまり書字モード)が水平か縦かも決定します。 text-orientationプロパティは、行ボックス内でテキストがどのように配置されるかを決定します。

置換要素の内容は、writing-modeによって回転しません。 例えば画像や<iframe>などの外部コンテンツはそのまま立った状態で表示され、 既定のオブジェクトサイズ(300px×150px)は向きが変わりません。 ただしテキストを含む置換コンテンツ(MathMLやフォーム要素など)は、 UAがその置換コンテンツに縦書きモードをサポートしている場合は、要素の書字モード・行方向に合わせるべきです。

次の例では、画像(2)で分離された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>English
                       <option>français
                       <option>فارسی
                       <option>中文
                       <option>日本語</select></label>
</form>

縦方向レイアウトのスクリーンショット:input要素が上から下へ縦に伸び、内容が縦組みで表示され、外側のラベルと揃っている。ドロップダウン選択コントロールはその後ろ(ブロックの後端)へスライドし、横書きモードの場合のように下へは展開しない。

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

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

これを防ぐには、以下のルールを加えてください:

svg { writing-mode: initial; }

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

SVG1.1 [SVG11]は追加値:lrlr-tbrlrl-tbtbtb-rlを定義します。

これらの値はSVG1文書以外の文脈では廃止されており、非SVG UAでは任意の対応となります。

3.2.1.1. CSS構文でのSVG1.1 writing-mode値の対応

UAがこれらの値をCSS文脈でサポートする場合、次のように算出します:

廃止された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. ベースラインの概要

このセクションは規範的ではありません。

ベースラインは、行ボックスのインライン軸に沿った線で、個々のグリフが整列する基準となる線です。ベースラインはフォントのグリフ設計を導き(例:多くのアルファベットグリフの下端はアルファベットベースラインに揃う)、異なるフォントやフォントサイズのグリフの組版時の整列にも使われます。

2つのフォントサイズのアルファベットテキストのベースラインとemボックスの図

2つのフォントサイズにおけるアルファベットテキストのベースラインとemボックス

文字体系によって好まれるベースラインテーブルは異なります。

ラテン文字はアルファベットベースラインを好み、多くの文字が上に乗るが、一部は下に突き出す。インド系文字は吊り下げベースラインで組版されることがあり、グリフの形が横線から吊り下がっているように見える。漢字系はグリフが正方形に収まる設計で、下端に揃う傾向がある。

各書記体系で好まれるベースライン

よく設計されたフォントには ベースラインテーブル があり、 フォントの設計座標空間内で1つ以上のベースラインの位置を示します。(設計座標空間はフォントサイズに合わせて拡大縮小されます。)

よく設計された混在スクリプトフォントでは、グリフが座標空間に調和するよう配置されます。ベースラインテーブルはグリフの形状に合わせて作成され、各ベースラインは対応するスクリプトのグリフに揃うよう配置されます。

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

水平・垂直テキストの整列のために、異なるベースラインテーブルが提供されることがあります。UAは垂直組版モードでは垂直テーブル、その他の場合は水平テーブルを使うべきです。

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

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

alphabetic
アルファベットベースライン。通常はラテン大文字グリフの下端に揃う。
central
中央ベースライン。通常はemボックスの中心を通ります。フォントにこのベースラインがない場合は、アセンダー(over)とディセンダー(under)の中間とみなします。

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

将来のCSSモジュールでは、より詳細なベースライン制御や他の支配的ベースライン・整列オプションが扱われます。

4.3. アトミックインラインのベースライン

アトミックインライン(inline-block, inline-table, 置換インライン要素など)にベースラインがない場合、 UAは以下のようなベースラインテーブルを合成します:

alphabetic
アルファベットベースラインはunderマージン端にあるとみなします。
central
中央ベースラインはunderoverマージン端の中間とみなします。

vertical-align プロパティ([CSS2])は、inline-tableやinline-blockボックスのベースラインを一部例外付きで定義しています。

4.4. ベースライン整列

支配的ベースライン詳細組版モードに基づき変化する場合あり)は、CSSで次の2つの場合に整列に使われます:

5. 縦書きテキストレイアウトの概要

各書記体系は1つ以上の固有の向きを持っています。現代の文字体系は、次の3つの向きカテゴリに分類できます:

横書きのみ
横方向のみで固有の向きを持つ書記体系。 例:ラテン、アラビア、ヘブライ、デーヴァナーガリー
縦書きのみ
縦方向のみで固有の向きを持つ書記体系。 例:モンゴル、パスパ文字
両方向
縦横両方で固有の向きを持つ書記体系。 例:漢字、ハングル、日本語仮名

縦書きスクリプトは、縦方向に固有の向きを持つもの(縦書きのみまたは両方向)。 横書きスクリプトは、横方向に固有の向きを持つもの(横書きのみまたは両方向)。 (各スクリプトの固有向きの分類は付録A参照。)

ベン図:'vertical'と'horizontal'の2つの円、重なる部分が両方向スクリプト。横書きのみ・縦書きのみはそれぞれの円の排他的領域に位置する。

現代の組版システムでは、全グリフに水平向きが与えられ、横書きレイアウト時に使われます。 縦書きレイアウトのためには、UAがテキストを水平向きから変換する必要があります。この変換が 両方向変換 であり、次の2種類があります:

rotate
グリフを横から縦に回転 グリフを横から縦に回転
translate
グリフを横から縦に平行移動 グリフを横から縦に平行移動

縦方向に固有の向きを持つスクリプトは、固有の両方向変換を持ち、縦書き時に正しく配置されます。CJK(中・日・韓)文字の多くは平行移動(常に立てて表示)、モンゴルなど他のスクリプトは回転します。

固有の縦向きを持たないスクリプトは、回転(横向き配置)または平行移動(立てて配置)を選択できます。どちらを使うかは、テキスト用途のスタイル的な好みによるもので、正しさの問題ではありません。 text-orientationプロパティのmixedupright値は、横書きのみテキストの回転と平行移動を指定します。

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

名前: text-orientation
値: mixed | upright | sideways
初期値: mixed
適用対象: テーブル行グループ、行、列グループ、列を除く全ての要素
継承: はい
パーセンテージ: 該当なし
算出値: 指定値
正規順序: 該当なし
アニメーションタイプ: アニメーション不可

このプロパティは行内のテキストの向きを指定します。 現在の値は垂直組版モードでのみ効果があります。 水平組版モードのボックスには効果がありません。

値の意味:

mixed

垂直書字モードでは、横書きのみスクリプトの組版文字単位横向き配置(標準の横書きから時計回り90°回転)されます。組版文字単位が縦書きスクリプトの場合は固有の向きで配置されます。 詳細は縦書きの向きを参照。

この値は主に縦書きスクリプト主体のテキストレイアウトで用いられます。

upright

垂直書字モードでは、横書きのみスクリプトの組版文字単位立てて配置(標準の横書き向き)されます。組版文字単位が縦書きスクリプトの場合は固有の向き・通常の字形で配置されます。 詳細は縦書きの向きを参照。

この値はused valuedirectionltrにし、双方向並び替えの際は全ての文字を強いLTRとして扱います。

注: used value(算出値ではなく)がdirectionに影響します。これにより、rtlが、方向上書きが適用されない子孫(たとえば横書きのinline-block内容など)にも適切に継承されます。

sideways

垂直書字モードでは、全テキストが横向き配置(横書きレイアウト同様だが時計回り90°回転)されます。

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

text-orientation値(writing-modevertical-rl

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

UAは必要に応じて、後方互換の理由で sideways-rightsidewaysとして算出できる値として受け付けてもよいです。

現時点では主要実装はuprightの組版でRTL文字を自動的にLTRとして扱う機能をサポートしていません。 その場合、著者は以下のようにunicode-bididirectionを明示的に指定する必要がある場合があります。
.vertical-upright-hebrew {
    writing-mode: vertical-rl;
    text-orientation: upright;
    unicode-bidi: bidi-override;
    direction: ltr;
}

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

vertical-rlおよびvertical-lrモードでテキストを組版する場合、 テキストは下記の「立て組み」または「横向き組版」で処理されます:

立て組み
組版文字単位は、縦組みの行内で1つずつ立てて配置され、縦組み用フォントメトリクスで処理されます。 UAは、縦組みメトリクスがないフォントにはそれを合成しなければなりません。 (この仕様ではその合成方法のヒューリスティックは定義しません。) また、縦組み用のフォント機能(代替グリフやその他の変形)が利用可能であれば使用しなければなりません。 (例:OpenTypeのvert機能は有効化されるべきです。) さらに、横書きの連続体スクリプト(例:アラビア語など)の文字は、立て組みの場合には孤立形(isolated form)で字形化されます。

「立て組み」であっても、 一部のグリフは回転して表示されるべきです。 例えばダッシュや囲み句読点は、インライン軸に対して向きを合わせる必要があります。 OpenTypeでは、これは通常グリフ置換で処理されますが、全てのフォントが全てのコードポイントに代替グリフを持つわけではありません。 (東アジアフォントは東アジアコードポイントの代替を提供することが多いですが、西洋フォントは縦組み機能がほぼなく、東アジアフォントも西洋コードポイントの縦組み置換はほぼありません。) Unicodeは、どの文字を横向き表示すべきかをSVOプロパティとしてこのデータファイルでドラフト公開しましたが、このプロパティは[UTR50]の現行版では廃止されています。

組版文字単位[UTR50]TrまたはTuに分類されている場合は、縦組み用の代替グリフや配置が必要です。 Tr文字の場合、 フォントに縦組み用代替グリフがない場合は、UAが望ましい場合(必須ではありません)[RFC6919]のように、横向き組版などでグリフを合成してもよいです。

横向き組版
組版文字単位の連続を、立て組みの向きから時計回りに90°回転させて配置し、水平メトリクス・組版で処理します。縦組み用機能は使用しません。 ただし、フォントが縦組み行内で横向きに配置するための機能(例:筆運びや揃えの調整など)を持つ場合は、それらの機能を使います。 (例:提案されているvrtr OpenTypeフォント機能など。)

5.1.2. 縦書き方向の混在

[UTR50]は、混在方向の縦組みテキストにおける既定グリフ向きのためのVertical_Orientationプロパティを定義しています。 text-orientationmixedの場合、 UAは各組版文字単位Vertical_Orientationプロパティを参照し、UTuTrなら立て組み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
Animatable: n/a

一部のSVGユーザーエージェントは、廃止されたSVG glyph-orientation-verticalプロパティ(autoキーワードや、<angle><integer>で90°の倍数を指定)が含まれる文書を処理する必要があります。 このプロパティのサポートは任意ですが、 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プロパティ全体を無視し、無効として扱わなければなりません。

注:180deg270degやラジアン・グラジアン値、およびglyph-orientation-horizontalプロパティは、利用事例や依存コンテンツがほぼないためCSSには含まれず、SVGからも削除されています。

6. 抽象ボックス用語

CSS2.1[CSS2]は、CSSのボックスレイアウトモデルを詳細に定義していますが、 horizontal-tb書字モードのみを対象としています。horizontal-tb以外の書字モードでもレイアウト自体は類似していますが、CSS2.1の方向や寸法の用語は抽象化・再マッピングが必要です。

このセクションでは、他の書字モードのボックスレイアウトを定義するため、また将来の仕様で抽象的なレイアウト概念を定義できるよう、抽象方向・抽象寸法用語とそのマッピングを定義します。(次のセクションでは、これらをCSS2.1レイアウト計算に適用する方法および直交フローの扱いを説明します。) これらの抽象マッピングは、テキストに由来するものですが、行ボックスを含まないボックスにも存在します。 writing-modedirectionプロパティの値から直接算出されます。

CSSには3種類の方向用語があります:

物理
書字モードに依存せず、ページに対して解釈される。 物理方向は、 です。
フロー相対
コンテンツのフローに対して解釈される。 フロー相対方向は開始終了、 または寸法も曖昧な場合はブロック開始ブロック終了インライン開始インライン終了です。
行相対
行ボックスの向きに対して解釈される。 行相対方向は行左行右行上行下です。

物理寸法は、高さであり、 それぞれx軸水平寸法)およびy軸垂直寸法)に対応します。 抽象寸法はフロー相対・行相対用語の両方で同じなので、この用語セットは一種類のみです。

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

6.1. 抽象寸法

抽象寸法は下記の通り定義されます:

ブロック寸法
行内テキストのフローに対して垂直な寸法。すなわち、水平書字モードでは垂直寸法、 垂直書字モードでは水平寸法
インライン寸法
行内テキストのフローに平行な寸法。すなわち、水平書字モードでは水平寸法、 垂直書字モードでは垂直寸法
ブロック軸
ブロック寸法の軸。 水平書字モードではy軸、 垂直書字モードではx軸
インライン軸
インライン寸法の軸。水平書字モードではx軸、垂直書字モードではy軸
ブロックサイズ
論理高さ
ブロック寸法での計測値。 水平書字モードでは物理高さ(垂直寸法)、 垂直書字モードでは物理幅(水平寸法)を指します。
インラインサイズ
論理幅
インライン寸法での計測値。 水平書字モードでは物理幅(水平寸法)、 垂直書字モードでは物理高さ(垂直寸法)を指します。

6.2. フロー相対方向

フロー相対方向block-startblock-endinline-startinline-endは、ページ上のコンテンツの流れに対して定義されます。 LTRhorizontal-tb書字モードでは、それぞれ上、下、左、右方向に対応します。 定義は以下の通りです:

block-start
ブロックフロー方向で先に来る側。 writing-modeプロパティで決定されます。 horizontal-tbモードでは物理的な上、 vertical-rlでは右、 vertical-lrでは左です。
block-end
block-startと反対側。
inline-start
インライン基本方向のテキストが始まる側。 direction値がltrの場合はline-left側。 direction値がrtlの場合はline-right側。
inline-end
startと反対側。

文脈で曖昧さがなく、両方の意味を包含する場合は、 startendという用語が、 それぞれblock-start/inline-startblock-end/inline-endの代わりに使われます。

ボックスのblock-startblock-end側の決定はwriting-modeプロパティのみに依存しますが、 inline-startinline-end側の決定は writing-modeプロパティだけでなく、 directionプロパティにも依存します。

英語テキストレイアウトにおける物理/論理用語
中国語テキストレイアウトにおける物理/論理用語

6.3. 行相対方向

行の向きは、行ボックスの 論理的な「上」(アセンダー側)となる側を決定します。 writing-modeプロパティで決まります。 通常、行相対の「上」はblock-start側ですが、 モンゴル書字(vertical-lr書字モード)では、 行相対「上」がblock-end側になります。 そのため別の用語が必要です。

モンゴル語と英語の混在

主にモンゴル語の文書(上図)は左から右への縦行で書かれますが、ラテン文字はグリフの上が右側を向くように配置されます。これにより、モンゴル語(上から下方向)と同じインライン方向・同じ向きで表示され、他の東アジアレイアウト(右から左への縦行)と同じく、グリフの上端が行の積み重ねの下側を向きます。英語段落では逆さになります。(モンゴルテキストレイアウトの図参照)

CSSでは「vertical-align: top」のような指定のため行相対「上」と「下」だけでなく、 「text-align: left」のような指定のため行相対「左」と「右」も参照する必要があります。 そのため、行の向きに対して定義される4つの行相対方向があります。定義は以下の通り:

over または line-over
行ボックスのアセンダー側または「上」側に対応する側。(上線が描画される側)
under または line-under
overと反対の側:行相対「下」またはディセンダー側。(下線が描画される側)
line-left
行ボックスの「左」側。LTRテキストの開始側。
line-right
行ボックスの「右」側。RTLテキストの開始側。(line-leftと反対側)

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

行方向コンパス

horizontal-tbにおける行の向き

典型的な縦書きの向き

vertical-rlvertical-lrsideways-rlにおける行の向き

典型的な縦書きの向き

sideways-lrにおける行の向き

立てグリフのベースラインは上中央から垂直に描画

立てグリフの縦ベースライン

text-orientation: uprightのとき、 ベースラインは依然として垂直であり、 フォントの縦ベースラインが使われ、フォントにない場合は合成されます。

ベースラインが垂直なので、 mixedsideways の定義が上記のように有効です。つまり、line-overは右、line-underは左です。

この仕様はOpenTypeなどのフォントシステムと一致しており、 縦メトリクスではアセンダーが右、ディセンダーが左と定義されています。

6.4. 抽象→物理マッピング

以下の表は抽象→物理マッピングのまとめです(useddirectionwriting-modeに基づく):

抽象-物理マッピング
writing-mode horizontal-tb vertical-rl, sideways-rl vertical-lr sideways-lr
direction ltr rtl ltr rtl ltr rtl ltr rtl
block-size height width
inline-size width height
block-start top right left
block-end bottom left right
inline-start left right top bottom top bottom bottom top
inline-end right left bottom top bottom top top bottom
over top right left
under bottom left right
line-left left top bottom
line-right right bottom top

注:useddirectionは、算出されたwriting-modetext-orientationに依存します。 縦書きモードtext-orientation値がuprightの場合、usedのdirectionltrになります。

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

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

CSSボックスレイアウトは、縦書きモードにおいても横書きモードと同様の原則に従い、以下の原則に沿って処理されます:

レイアウト計算の規則(CSS2.1のSection 10.3等)は、横書きモードでは水平方向に適用されますが、縦書きモードでは垂直方向に適用されます。 同様に、縦方向の規則(CSS2.1のSection 10.6等)は、縦書きモードでは水平方向に適用されます。 したがって:

例えば縦書きモードでは テーブルの行は縦方向、列は横方向となります。 vertical-rlmixedrtlテーブルでは、 第1列は下側(inline-start側)、 第1行は右側(block-start側)に配置されます。 テーブルのmargin-rightmargin-leftは、 それぞれテーブルの前(右側)と後(左側)のマージンと折り畳みされます。 またテーブルのmargin-topmargin-bottomauto値なら、 テーブルはブロックフロー内で垂直方向に中央配置されます。

縦書きのvertical-rl mixed rtlテーブルの図。行・セル・列の順序が上記説明通りになっている。

vertical-rlRTL書字モードのテーブル

テキスト揃え、float、リストマーカー位置等、主に行ボックスの左右またはその縦方向の並行側を参照し、上下の対応物がない機能には、 line-leftline-right側が左右の基準として使われます。

同様に、下線・上線・ベースライン整列(vertical-align)等、 主に行ボックスの上下または横方向の並行側を参照し、左右の対応物がない機能には、 line-overline-under側が上下の基準として使われます。

これらのマッピングの詳細は以下に示します。

7.2. 寸法マッピング

一部プロパティは論理的に下記のように動作します:

heightプロパティ(heightmin-heightmax-height)は物理的な高さを指し、 widthプロパティ(widthmin-widthmax-width)は物理的な幅を指します。ただし、 ボックス寸法や位置決定のための規則は論理的に計算されます。

例えば、CSS2.1 Section 10.3の計算規則はインライン寸法の計測に用いられます。 これはインラインサイズ (物理的な幅または高さのいずれか)とinline-startおよびinline-endのmargin/padding/borderに適用されます。 同様に、CSS2.1 Section 10.6の計算規則はブロック寸法に用いられ、 ブロックサイズおよびblock-startblock-endのmargin/padding/borderに適用されます。[CSS2]

結果として、margin/paddingプロパティのパーセンテージ値は、 CSS2.1では常に包含ブロックの幅に対して計算されますが、 CSS3では包含ブロックのインラインサイズに対して計算されます。

7.3. 直交フロー

ご意見は一般的にも歓迎しますが、この特に複雑なセクションへのフィードバックも特に歓迎します。

ボックスのwriting-modeが その包含ブロックと異なる場合、2つのケースが考えられます:

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

この場合の処理のため、CSSレイアウト計算は ボックスのサイズ決定と、そのフロー内での配置の2段階に分かれます。

autoマージンは包含ブロックの書字モードに合わせて解決されるため、直交フローを確立するボックスも サイズ決定後は他のブロックレベルボックス同様、autoマージンで包含ブロック内で揃えや中央配置が可能です。

縦フローボックスが2つの横フローボックスの間に配置されている図

直交フローの例

例えば、縦方向ブロックが横方向ブロック内に配置されている場合、 子ブロックの物理的な高さ(これはインラインサイズ)の計算では、 親ブロックの物理的な高さを子の包含ブロックのインラインサイズとして用います。 ただし物理的な高さ自体は親ブロックのブロックサイズであり、インラインサイズではありません。

一方、親が横書きモードの場合、 子の縦方向のmarginはmargin折り畳みに参加しますが、これは子のインライン軸であってもです。 また、子の横方向のauto marginは、子のブロック軸であっても、親の幅いっぱいに広がります。

このセクションは、子ボックスがブロック軸でautoサイズの場合に直交フローを確立すると、 子のusedブロックサイズはコンテンツに合わせて算出され、 その算出されたサイズが親のインライン軸min-content sizeおよび max-content sizeの入力になることを要求しています。

つまり、inline-block, float, table-cellなどのボックスにshrink-to-fit式を適用する場合、 子が直交フローを確立しているときは、 子のサイズ決定フェーズを先に実行し、 子のusedブロックサイズを 親のインラインサイズの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の場合、 以下のシュリンクトゥフィット式を使う: min(max-content, max(min-content, constraint)) ここで:
      min-content
      ボックスのmin-contentインラインサイズ
      max-content
      ボックスのmax-contentインラインサイズ
      constraint
      インライン軸サイズで 次の最小値へストレッチフィットする:
      • 利用可能空間: 包含ブロックのサイズ(固定なら)、 もしくは包含ブロックのinnermax size(固定なら)を innermin size(固定なら)で下限
      • 最も近い祖先scrollportのinner size(固定なら)、 なければinnermax size(固定なら)、 innermin size(固定なら)で下限
      • 初期包含ブロックのサイズ
      自動的に多段組みになることでT字型ドキュメントを防ぐ図
      この要件により、すべてのブロックコンテナで自動的に多段組みフローが発生します。 これは、オーバーフローした内容が包含ブロックの側方向へはみ出るのではなく、包含ブロックのフロー方向にカラムに折り返されることで、T字型ドキュメントを防ぐためです。 著者はインラインサイズcolumn-widthを指定することでカラム幅を制御したり、 inline sizeプロパティにauto以外(例:max-content)を指定してこの挙動を無効化できます。
    • column-countautoでなく、column-widthautoの場合、 上記と同じ式で使用値を計算。ただしconstraintconstraint − (column-count − 1) × column-gapに置き換える。
    • column-countcolumn-widthが両方ともauto以外の場合、 使用されるcolumn-widthは算出されたcolumn-widthとなる。 (この方法はオーバーフローを起こしやすいので推奨されません。column-widthとmax-block-sizeを設定する方が好ましい。)
  2. 使用されるカラム長を計算: 算出されたblock sizeautoであり、column-countまたはcolumn-widthのいずれかがautoの場合、 ボックスのblock size定義済みなら)、 もしくはボックスのストレッチフィットblock size(定義済みなら)、 それ以外はボックスのmax-content block sizeを使う。 それ以外は通常のマルチカラムコンテナのサイズ付け規則に従う。

    この式にボックスのmin-content block sizeを含めるべきか? 例えば大きな画像がボックスをはみ出すのではなく、ボックスが包含ブロックからはみ出すようにするため?

  3. 使用されるcolumn-countを計算: 算出されたcolumn-countautoの場合、 使用されるcolumn-countは マルチカラムレイアウトにボックスの内容を充填することで決まる。

結果として得られるマルチカラムコンテナの使用インラインサイズは次のように計算:

  1. 内容がマルチカラムコンテナ内で改行・断片化しない場合、使用インラインサイズはボックス内容のmax-contentインラインサイズになる。 この条件により短い直交フロー内容は大きな空白を生まずにシュリンクトゥフィット動作となる。
  2. それ以外の場合、使用値はcolumn-widthcolumn-countcolumn-gapから計算する。

ボックスの使用block sizeは、 複数カラムが使われた場合は使用カラム長、 1カラムだけの場合は内容のmax-content block sizeとなる。 UAがCSSマルチカラムレイアウト[CSS3COL]をサポートしない場合、 UAは代わりにボックスのblock sizeを無限の利用可能ブロック空間として計算し、 内容を1カラムにレイアウトしてもよい。 (この場合、内容が包含ブロックからはみ出して切れる/アクセスできなくなることがあります。)

多段組みの自動発生はリスクがあり、CR期間中に削除される可能性があります。

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

行の長さを制限するため、ブロックコンテナは上記で定義される特別な自動サイズ挙動を持ちます。 これは利用可能インライン空間が無限大の場合(典型的には直交フローを確立した場合)に発生します。

他のレイアウトモデルは無限の利用可能インライン空間max-contentサイズで単純にレイアウトします。 ただし、それらが含むブロックコンテナへも無限の利用可能インライン空間を伝播し、 それらのブロックコンテナで特別な自動サイズ挙動を発生させる可能性があります(自身が直交フローでなくても)。

例えば、テーブルやflex containerが直交フローを確立した場合、 与えられた利用可能空間へレイアウトされます。 その利用可能インライン空間が無限大なら 実質的にmax-contentサイズでレイアウトされます。 ただし、テーブルセルやflex itemブロックコンテナになっているものは 無限の利用可能インライン空間でレイアウトされ、 上記の自動サイズ挙動となります。

7.3.4. 直交フローの断片化

このセクションは参考情報です。

断片化に関しては、CSS2.1の規則が縦書きモード・直交フローでも有効です: 行ボックス内での改行機会はなく、行間のみで発生します。 UAが[CSS3COL]をサポートする場合、 カラム間(幅0の場合も含む)で改行が可能です。

内容がルート要素によって確立されたページネーションストリーム外にはみ出した場合、 UAはその内容を印刷する義務はありません。 書字モードを混在させて長いテキストのストリームを作る場合は、 すべての内容が文書のページネーション方向に流れるようCSSカラムを使うことを推奨します。

言い換えれば、画面上に2つのスクロールバーが必要な文書はおそらくすべて印刷されません。 レイアウトを修正し、カラムを使って すべてが1方向にスクロール(=ページネーション)するようにすれば確実に印刷できます。 T字型ドキュメントは印刷に向きません。

7.4. フロー相対マッピング

フロー相対方向は、ボックスの包含ブロックの書字モードに基づいて計算され、 ボックスのプロパティ(margin、border、padding)やボックスの位置決めに関連するプロパティ (floatcleartopbottomleftrightcaption-side)に対するレイアウト規則を抽象化するために使われます。 インラインレベルボックスの場合は、親ボックスの書字モードが使われます。 (left/right/top/bottom名のプロパティ値自体は物理的にマッピングされます。 ただしcaption-sideのみ例外で、 top/top-outsidebottom/bottom-outside値は それぞれテーブルのblock-startblock-end側に対応します。)

例えば、ボックスのインライン寸法が過剰制約された場合にドロップされるマージンは、 包含ブロックの書字モードで決まるendマージンです。

マージン折り畳み規則は、 block-startマージンをtop marginに、 block-endマージンをbottom marginに置き換えて厳密に適用されます。 同様にblock-startパディング・ボーダーがtopパディング・ボーダーに、 block-endパディング・ボーダーがbottomパディング・ボーダーに置き換えられます。 つまり折り畳みされるのはblock-startblock-endマージンのみです。

フロー相対方向はボックス自身の書字モードに基づいて計算され、 ボックス内容に関するレイアウト抽象化に使われます:

7.5. 行相対マッピング

行相対方向は、overunderline-leftline-rightです。 LTRhorizontal-tb書字モードでは、 それぞれ上、下、左、右方向に対応します。

line-rightline-left方向は、ボックスの書字モードを基準に計算され、 以下のプロパティのleftright値の解釈に使われます:

line-rightline-left方向は、ボックスの包含ブロックの書字モードを基準に計算され、 以下のプロパティのleftright値の解釈に使われます:

overunder方向は、ボックスの書字モードを基準に計算され、 行ボックスの「top」(over)および「bottom」(under)側の解釈を次のように定義します:

7.6. 純粋な物理マッピング

以下の値は定義上純粋な物理値であり、書字モードの変化には反応しません:

8. 主要書字モード

文書の主要書字モードは、 ルート要素のusedwriting-modedirectiontext-orientationの値で決定されます。 この書字モードは、例えばスクロール方向や デフォルトのページ進行方向の決定などに使われます。

HTML文書を扱う特例として、 ルート要素が body 子要素[HTML]を持つ場合、 ルート要素のused valueとしてのwriting-modedirectionは、 ルート要素自身の値ではなく、その最初の子要素の算出値を採用します。 UAはtext-orientationの値も同様に伝播してもよいです。 なお、この伝播はルート要素自身の算出値には影響しません。

注:伝播は算出値ではなくused値で行われます。これは他のスタイル計算(継承論理プロパティマッピングロジック長さ値計算など)への影響を避けるためです。

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

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

@pageボックスにも伝播するか?

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

ページメディアでは、CSSはすべてのページを左ページまたは右ページとして分類します。 ページ進行方向[CSS3PAGE]参照)は、 見開きで左ページ・右ページのどちらが先になるか、最初のページがデフォルトで左か右かを決定しますが、 これは主要書字モードによって次のように決まります:

主要書字モード ページ進行方向
horizontal-tbかつltr left-to-right
horizontal-tbかつrtl right-to-left
vertical-rlまたはsideways-rl right-to-left
vertical-lrまたはsideways-lr left-to-right

注:特に指定がなければ、文書の最初のページは見開きの後半(例:left-to-right進行なら右ページ)から始まります。

9. グリフ合成

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

名前: text-combine-upright
値: none | all | [ digits <integer>? ]
初期値: none
適用対象: 非置換インライン要素
継承: はい
パーセンテージ: 該当なし
算出値: 指定キーワード+digitsなら整数値
正規順序: 該当なし
アニメーションタイプ: アニメーション不可

このプロパティは複数の組版文字単位を1つの組版文字単位分のスペースに合成することを指定します。 合成されたテキストが1emより広い場合、UAは内容を1em内に収めなければなりません(下記参照)。 合成されたものはレイアウト・装飾上1つの立てグリフとして扱われます。 このプロパティは縦書きモードでのみ効果があります。各値の意味は以下の通りです:

none
特別な処理なし。
all
ボックス内のすべての連続する組版文字単位を 縦行内の1つの組版文字単位分のスペースに水平組版しようとする。
digits <integer>?
ASCII数字(U+0030–U+0039)の連続する最大シーケンスで、指定された整数以下のものを水平組版し、 縦行内で1つの組版文字単位分のスペースに収めようとする。 整数が省略された場合は2となる。 2~4以外の整数は無効。

東アジア文書では、text-combine-upright効果は日付や略語などラテン系文字列の表示によく使われます。行の書字モードに関係なく常に横書きモードで表示されます:

縦中横の図。日付の2桁が半角で並んで縦列に収まっている

縦中横の例 縦中横

この図は下記のルールの結果です:

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

および以下のマークアップ:

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

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

以下の例は、文書全体にtext-combine-upright: digits 2を適用した場合、 数値コンテンツが明確なセグメント以外にも意図しない結果が生じることを示しています:

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

上記マークアップを 'text-combine-upright: digits' でレンダリングした例。最初の2桁だけ縦中横になり、残りは横向き配置になる。

縦中横の誤用例 縦中横

9.1.1. テキストラン規則

レンダリングやレイアウトの複雑化を避けるため、text-combine-upright はプレーンテキスト(ボックス境界で途切れない連続する組版文字単位)のみを合成できます。

ただし、このプロパティは継承されるため、 合成を行うボックスの内容が、ボックス外の可合成なシーケンスの一部になっていないかUAは確認しなければなりません。 その場合は、通常通り(text-combine-upright: none)としてレイアウトします。 シーケンスの一部だけ合成しないようにするため: 可合成ランの境界がインラインボックス境界のみによる場合、 UAは直前・直後の文字を検査し、ボックスがなければ可合成シーケンス(長すぎなければ)になる場合は、 その候補ランは合成しません。

この段落はリスクあり。実装者からのコメント歓迎。

例えば、以下のルール:

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

次のマークアップがある場合:

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

この場合、12と34は同じtext-combine-upright値を持つ共通祖先を持ち、 ボックス境界で途切れた4桁の可合成シーケンスなので、合成されません。 しかし下記のケースでは:

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

34は直前の12と共通のtext-combine-upright値を持つ祖先を持たないため、 2桁の可合成シーケンス全体とみなされ合成されます。

別のルール:

tcy { text-combine-upright: all; }

でも同じ結果になります。 最初のケースは1234がボックス境界で途切れた4文字の可合成シーケンスなので合成されず、 2番目のケースは34が2文字の可合成シーケンス全体なので合成されます。

text-combine-upright の値(alldigits)は、 どの種類の組版文字単位が合成対象になるか、合成シーケンスの最大長を決めるのみで、 振る舞い自体は変わりません。

9.1.2. レイアウト規則

text-combine-upright: allでテキストを合成する場合、 合成されたテキストのグリフはbidi分離されて水平方向に配置されます。 (letter-spacingや強制改行は無視されますが、指定されたフォント設定は使用します) これは、inline-blockボックスの内容を 横書きモードで、line-height1emとして配置する場合に似ています。 合成テキストの先頭/末尾に含まれる文書の空白インラインブロック先頭/末尾と同様に 処理されます [CSS-TEXT-3]。 合成の実効サイズは1em四方とみなされ、それを超えた部分はレイアウト上無視されます。 UAはグリフを1em四方内で水平・垂直方向に中央揃えすべきです。

合成のベースラインは、この正方形が親インラインボックスのtext-over/text-underベースライン間で (vertical-alignによる整列前に)中央に配置されるよう選択されなければなりません。 双方向並び替えでは、この合成は組版文字単位として、text-orientation: uprightで扱われます。 行分割の前後では、実際の内容の通常インラインとして扱われます。 その他のテキストレイアウト(例えば強調点、装飾、スペーシングなど)では、 この合成はオブジェクト置換文字U+FFFCを表す単一グリフとして扱われます。

9.1.3. 圧縮規則

UAは、合成テキストの合計アドバンス幅が1em以内に収まるよう、必要に応じて圧縮しなければなりません。 (必ずしもグリフが1em内に収まるとは限りません。グリフ設計上枠外に描画される場合もあります。) OpenType実装では、幅固有のバリアント(OpenType機能hwid/twid/qwidfwidpwid等は含まない)を 合成内の全組版文字単位で利用可能な場合は必ず用いて圧縮します。 そうでない場合、UAはフォントが提供する半角・3分幅・4分幅グリフの代用、他の横圧縮用フォント機能、文字のジオメトリ的スケーリング、 それらの組み合わせ等、任意の方法でテキストを圧縮して構いません。

例えば、OpenTypeベースの単純な実装では以下のように圧縮できます:

  1. 合成テキストがn個の組版文字単位なら、1/n幅グリフを有効化 (2文字ならOpenType hwid、3文字ならtwidなど)。 組版文字単位の数はUnicodeコードポイント数とは異なります!
  2. 結果が1emより広ければ、水平方向に1emへスケールします。

OpenTypeレイアウト機能を活用した別実装では、まず通常グリフで合成して1emに収まるか確認し、 必要に応じて半角・3分幅グリフに差し替え、場合によってはスケーリングを併用する等 利用可能な代替字形に応じて調整することもできます。

一部フォントでは、漢字グリフが1em幅で1em高さより短く設計されています。 こうしたフォントに対応するため、UAは合成全体を「水」U+6C34のアドバンス高さに合わせて垂直スケールしてもよいです。 この場合、合成の高さは1emでなく「水」U+6C34のアドバンス高さとなります。

9.1.3.1. 全角文字

テキストを1emに圧縮する際に組版の色感(typographic color)を保つため、 合成テキストが2文字以上の組版文字単位からなる場合、 全角組版文字単位はまず text-transform: full-widthのアルゴリズムを逆にして 非全角に変換し、他の圧縮技法を適用します。[CSS-TEXT-3]

例えば、著者がtext-transformtext-combine-uprightを 縦書きの日付に両方指定する場合:

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

このスタイルを次の日付に適用すると:

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

「2010」は長すぎて合成されない(4桁)、"2"や"23"は合成対象となる。 "23"は2文字なのでtext-transform: full-widthは効果なし、 "2"は1文字なので全角"2"に変換される。 合成されない"2010"の数字も全角"2010"となり、立て組みで配置されるため、結果は下記のようになる:

2
0
1
0
年
2
月
23
日

グリフ選択に影響するプロパティ(font-variantfont-feature-settings[CSS3-FONTS]) は、合成テキストランでの文字の字形選択に影響する可能性があります。 text-combine-upright利用時は これらのプロパティの利用に注意してください。

10. プライバシーとセキュリティの考慮

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

変更点

2018年5月 CSS Writing Modes Module Level 4 Candidate Recommendation以降の変更点

Level 4の新規追加項目

このモジュールは2015年版CSS Writing Modes Level 3候補勧告の単なるコピーです。 現行CSS Writing Modes Level 3との違いは、 実装が遅れてLevel 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"を用いて規範的な本文から区別されます。例えば、次のようになります:

これは情報的な例です。

情報的な注記は「Note」という言葉で始まり、class="note"を使って規範的な本文から区別されます。例えば、次のようになります:

Note、これは情報的な注記です。

助言は、特別な注意を喚起するために規範的なセクションとしてスタイリングされ、他の規範的な本文と区別するために<strong class="advisement">を用います。例えば、次のようになります:UAはアクセシブルな代替手段を提供しなければなりません。

適合クラス

この仕様書への適合性は、3つの適合クラスで定義されます:

style sheet
CSSスタイルシート
renderer
UAがスタイルシートのセマンティクスを解釈し、それらを使用する文書をレンダリングします。
authoring tool
UAがスタイルシートを作成します。

スタイルシートが本仕様書に適合しているとされるためには、本モジュールで定義された構文を使用したすべての文が、汎用CSS文法および本モジュールで定義された各機能の個別文法に従って有効である必要があります。

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

オーサリングツールが本仕様書に適合しているとされるためには、汎用CSS文法および本モジュールの各機能の個別文法に従って構文的に正しいスタイルシートを書き、本モジュールで記載されているスタイルシートのすべてのその他の適合要件を満たす必要があります。

CSSの責任ある実装のための要件

以下のセクションでは、現在および将来の相互運用性を促進する方法でCSSを責任を持って実装するためのいくつかの適合要件を定義します。

部分的な実装

著者が将来互換性のあるパースルールを利用してフォールバック値を指定できるようにするため、CSSレンダラーは、サポート可能なレベルがないat-rule、プロパティ、プロパティ値、キーワード、その他の構文要素を無効として扱い (適切に無視すべきです)。 特に、ユーザーエージェントは 未対応のプロパティ値のみを選択的に無視し、単一の複数値プロパティ宣言で対応している値のみを適用してはならない:いずれかの値が無効(未対応値は無効とみなす)とされる場合、 CSSでは宣言全体を無視する必要があります。

不安定機能や独自機能の実装

将来の安定したCSS機能との衝突を避けるため、CSSWGはCSSのベストプラクティスに従って不安定な機能および独自拡張の実装を推奨します。

CRレベルの機能の実装

仕様書がCandidate Recommendation段階に達した場合、実装者は、仕様に従って正しく実装できるCRレベルの機能について、非プレフィックスの実装を公開すべきであり、その機能のプレフィックス付きバージョンの公開を避けるべきです。

CSSの実装間で相互運用性を確立・維持するため、CSSワーキンググループは実験的でないCSSレンダラーが実装レポート(必要に応じてその実装レポートで使用したテストケース)をW3Cに提出するよう求めています。 W3Cに提出されたテストケースは、CSSワーキンググループによってレビュー・修正される場合があります。

テストケースおよび実装レポートの提出方法などの詳細は、CSSワーキンググループのウェブサイトhttps://www.w3.org/Style/CSS/Test/から確認できます。 質問はpublic-css-testsuite@w3.orgのメーリングリストへお問い合わせください。

CR終了基準

本仕様書がProposed Recommendationに進むためには、各機能に対して独立した2つ以上の相互運用可能な実装が必要です。各機能は異なる製品群で実装されてもよく、すべての機能が単一製品で実装される必要はありません。この基準のために、以下の用語を定義します:

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

本仕様書は少なくとも6か月間Candidate Recommendationのままとなります。

索引

本仕様書で定義されている用語

参照によって定義される用語

参考文献

規定参考文献

[CSS-BOX-3]
Elika Etemad. CSS Box Model Module Level 3. 2018年12月18日. WD. URL: https://www.w3.org/TR/css-box-3/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 2018年12月4日. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 2018年12月18日. WD. URL: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-4]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 4. 2018年8月28日. CR. URL: https://www.w3.org/TR/css-cascade-4/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2019年7月11日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-INLINE-3]
Dave Cramer; Elika Etemad; Steve Zilles. CSS Inline Layout Module Level 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 Masking Module Level 1. 2014年8月26日. CR. URL: https://www.w3.org/TR/css-masking-1/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2018年7月31日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2018年12月12日. WD. URL: https://www.w3.org/TR/css-text-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2019年6月6日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2019年1月31日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS2/
[CSS3-IMAGES]
Elika Etemad; Tab Atkins Jr.. CSS Image Values and Replaced Content Module Level 3. 2012年4月17日. CR. URL: https://www.w3.org/TR/css3-images/
[CSS3-SIZING]
Tab Atkins Jr.; Elika Etemad. CSS Intrinsic & Extrinsic Sizing Module Level 3. 2019年5月22日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS3-TEXT-DECOR]
Elika Etemad; Koji Ishii. CSS Text Decoration Module Level 3. 2018年7月3日. CR. URL: https://www.w3.org/TR/css-text-decor-3/
[CSS3BG]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2017年10月17日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS3COL]
Florian Rivoal; Rachel Andrew. CSS Multi-column Layout Module Level 1. 2018年5月28日. WD. URL: https://www.w3.org/TR/css-multicol-1/
[CSS3PAGE]
Elika Etemad; Simon Sapin. CSS Paged Media Module Level 3. 2018年10月18日. WD. URL: https://www.w3.org/TR/css-page-3/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[RFC6919]
R. Barnes; S. Kent; E. Rescorla. Further Key Words for Use in RFCs to Indicate Requirement Levels. 2013年4月1日. Experimental. URL: https://tools.ietf.org/html/rfc6919
[SVG11]
Erik Dahlström; et al. Scalable Vector Graphics (SVG) 1.1 (Second Edition). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/
[UAX11]
Ken Lunde 小林劍󠄁. East Asian Width. 2019年1月25日. Unicode Standard Annex #11. URL: https://www.unicode.org/reports/tr11/tr11-36.html
[UAX24]
Ken Whistler. Unicode Script Property. 2019年2月6日. Unicode Standard Annex #24. URL: https://www.unicode.org/reports/tr24/tr24-29.html
[UAX9]
Mark Davis; Aharon Lanin; Andrew Glass. Unicode Bidirectional Algorithm. 2019年2月4日. Unicode Standard Annex #9. URL: https://www.unicode.org/reports/tr9/tr9-41.html
[UNICODE]
The Unicode Standard. URL: https://www.unicode.org/versions/latest/
[UTR50]
Koji Ishii 石井宏治; Ken Lunde 小林劍󠄁. Unicode Vertical Text Layout. 2019年2月4日. Unicode Standard Annex #50. URL: https://www.unicode.org/reports/tr50/tr50-22.html

参考情報文献

[CSS3-FLEXBOX]
Tab Atkins Jr.; 他 CSS Flexible Box Layout Module Level 1. 2018年11月19日. CR. URL: https://www.w3.org/TR/css-flexbox-1/
[CSS3-FONTS]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 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; 他 HTML5. 2018年3月27日. REC. URL: https://www.w3.org/TR/html5/
[UTN22]
Elika J. Etemad. 堅牢な縦書きレイアウト. 2005年4月25日. Unicode Technical Note #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 表の行グループ、列グループ、行、列、rubyベースコンテナ、ruby注釈コンテナを除くすべての要素 はい n/a アニメーション不可 n/a 指定値

課題索引

この式で、ボックスのmin-content block sizeを考慮すべきか? 例えば大きな画像がボックスからはみ出さず、ボックスが包含ブロックからはみ出すようになるべきか?
@pageボックスにも伝播するか?