CSS 多段組みレイアウトモジュール レベル2

W3C 最初の公開作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2024/WD-css-multicol-2-20241219/
最新版:
https://www.w3.org/TR/css-multicol-2/
編集者ドラフト:
https://drafts.csswg.org/css-multicol-2/
履歴:
https://www.w3.org/standards/history/css-multicol-2/
フィードバック:
CSSWG イシューレポジトリ
仕様内インライン
編集者:
Florian Rivoal (ブルームバーグを代表して)
(Google)
前任編集者:
(Opera Software)
この仕様への編集提案:
GitHub エディタ
テストスイート:
https://wpt.fyi/results/css/css-multicol/

概要

この仕様書は、Webのスタイルシート言語であるCSSにおける多段組みレイアウトについて説明します。本仕様で記載された機能を用いることで、コンテンツを複数の段に分け、それぞれの段の間に間隔や罫線を設けて流し込むことができます。

CSSは、構造化文書(HTMLやXMLなど)を画面や印刷物等でどのように描画するかを記述する言語です。

この文書の位置付け

この節は、本書が公開された時点での文書の位置付けについて説明しています。 現在のW3Cの出版物の一覧およびこの技術報告書の最新版は、W3C技術報告書インデックス https://www.w3.org/TR/ で確認できます。

本文書は CSSワーキンググループ によって、最初の公開作業草案(First Public Working Draft)として勧告プロセスに従って公開されました。 最初の公開作業草案として公開されたことは、W3Cおよびそのメンバーによる賛同を意味しません。

本文書はドラフト(草案)であり、今後いつでも更新・置換・廃止される可能性があります。 この文書を進行中の作業以外のものとして引用するのは適切ではありません。

ご意見は、GitHubでissueを登録(推奨、タイトルに "css-multicol" を含めてください。例: "[css-multicol] …コメント要約…")してください。 すべてのissueとコメントはアーカイブされます。 または、アーカイブされる公開メーリングリスト www-style@w3.org までフィードバックを送ることもできます。

本書は2023年11月3日版W3Cプロセス文書に従って運用されています。

この文書はW3C特許ポリシーの下で活動するグループによって作成されました。 W3Cは、本グループの成果物に関連してなされた特許開示の公開リストを保持しています。 そのページには特許開示手続きの案内も掲載されています。 ある個人が、必須クレームを含むと信じる特許を実際に知っている場合、 W3C特許ポリシー第6節に従い、その情報を開示しなければなりません。

1. はじめに

(この節は規範的ではありません。)

このモジュールはCSSにおける多段組みレイアウトについて説明します。 本書で記載されている機能を使うことで、 スタイルシートは要素の内容を複数の段にレイアウトするよう宣言できます。

CSSの他のレイアウト手法では、 親要素に適用すると、直接の子要素の表示プロパティが変更されます。 例えば、3カラムのグリッドレイアウトを作成した場合、 グリッドコンテナの直接の子要素はグリッドアイテムとなり、カラムのトラックに配置されます。 1セルにつき1要素が入り、必要に応じて追加の行も生成されます。

多段組みコンテナの子要素は、通常のフローのままですが、 そのフローが複数カラムに分割されて配置されます。 これらのカラムはインラインサイズが柔軟で、 利用可能なスペースによってカラムのサイズや表示カラム数が変化します。

多段組みレイアウトはCSSで簡単に記述できます。 以下はシンプルな例です:

body { column-width: 12em }

この例では、body要素の各カラム幅を少なくとも12emに設定しています。正確なカラム数は利用可能なスペースに応じて決まります。

カラム数もスタイルシートで明示的に指定できます:

body { column-count: 2 }

この場合、カラム数は固定され、カラム幅は利用可能な幅によって変化します。

ショートハンドのcolumnsプロパティを使えば、どちらか一方または両方を1つの宣言で指定できます。

これらの例では、カラム数、カラムの幅、カラム数と幅の両方をそれぞれ指定しています:
body { columns: 2 }
body { columns: 12em }
body { columns: 2 12em }

このモジュールで導入された別のプロパティ群は、 カラム間の間隔や罫線について記述します。

body {
  column-gap: 1em;
  column-rule: thin solid black;
}

上記の例の最初の宣言は、 隣接する2つのカラムの間の間隔を1emに設定します。 カラムの間隔はパディング領域に似ています。 間隔の中央には column-ruleプロパティで指定される罫線が描かれます。

column-ruleプロパティの値は、CSSのborderプロパティと同様です。 borderと同じく、column-ruleもショートハンドプロパティです。

この例では、上記のショートハンドcolumn-rule宣言を展開しています:
body {
  column-gap: 1em;
  column-rule-width: thin;
  column-rule-style: solid;
  column-rule-color: black;
}

column-fillcolumn-spanプロパティにより、 多段組みレイアウトでより多様なビジュアル表現が可能になります。

この例では、カラムがバランスされ(すなわちほぼ同じ長さになり)、 h2要素はすべてのカラムをまたぐように設定されています。
div { column-fill: balance }
h2 { column-span: all }

この仕様では、上記の例ですべて使用されている10個の新しいプロパティを導入しています。

すべてのカラムプロパティが初期値の場合、 要素のレイアウトは実質的に1カラムの多段組みレイアウトと同じになります。

カラムギャップ(斜線ハッチ)やカラム罫線を持つ多段組みコンテナの例です(パディングはクロスハッチで表示)。 ハッチ部分は図示のためだけに描かれています。 実装ではこれらの領域は背景で決まります。 2枚目の画像は、多段組みコンテナのカラム罫線の描画例です。
a diagram showing the various parts of multi-column layout key to the conventions used to display invisible parts of diagram
多段組みレイアウトのうち不可視のcolumn-spanやパディング部分を強調表示したもの。
a diagram showing the various parts of multi-column layout
最初の画像と同じレイアウトを実装で表示した場合の例。

1.1. 値の定義

本仕様では、CSSプロパティ定義規約[CSS21])に従い、値定義構文[CSS-VALUES-3])を用いています。 本仕様で定義されていない値型は CSS Values & Units [CSS-VALUES-3] で定義されています。 他のCSSモジュールとの組み合わせで値型の定義が拡張される場合もあります。

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

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

この文書は従来の仕様にはなかった新機能を定義します。 また、最終的には以下を置き換え、廃止します:

3. 多段組みモデル

column-widthまたはcolumn-countプロパティがauto以外である要素は、多段組みコンテナ(略してmulticol container)となり、 多段組みレイアウトのコンテナとなります。

従来のCSSボックスモデルでは、 要素の内容は対応する要素の内容ボックス内にフローします。 多段組みレイアウトでは、 分断コンテキストが作られ、 そこに匿名分断コンテナであるカラムボックス(略してカラム)が並びます。 これらのカラムボックスは 独立したブロック整形コンテキストを確立し、multi-columnコンテナの内容が流れ込みます。 また、カラムボックスは非positionedな子の包含ブロックとなります。

この例では、画像の幅を次のルールで設定しています:
img {
  display: block;
  width: 100%;
}

カラムボックスが新しいブロック整形コンテキストを作るため、 widthはカラムボックスに対して計算されます。 よって画像がカラムボックスからはみ出すことはありません:

an image contained inside a column box
画像は表示されているカラムボックスの範囲内に制約されます。
カラムボックスが新しいブロック整形コンテキストを作るため、multicolコンテナの最初の子要素にtopマージンを設定してもmulticolコンテナのマージンとは折り重なりません。
The first paragraph has a 'margin-top' of ''1em'', which appears before the text.
最初の段落上部のマージンは折り重ならず、multicolコンテナ内の最初の行の上に1emのマージンができます。

多段組みレイアウト内のfloat要素は、 floatが現れるカラムボックスを基準に配置されます。

この例では、画像の表示を次のCSSで記述しています:
img {
  display: block;
  float: right;
}

HTMLでは、この画像は "the leg of a chicken" で終わる文の後に登場します。

an image floated and contained inside a column box
画像は現れるカラムボックス内でフロート配置されます。

カラムボックスからブロック軸方向にはみ出した内容は分割され、次のカラムボックスへ続きます。

注: 匿名ボックスであるカラムボックスは、 包含ブロックにはなりません(絶対位置ボックスの)。 そのようなボックスの包含ブロックを確立するpositionプロパティは、 multicolコンテナに適用され、それがプリンシパルボックスとなります。

この例では、multi-column containerposition: relativeなので包含ブロックになります。 画像はmulti-column containerの直接の子で、 position: absoluteが指定されています。 配置基準はmulti-column containerであり、 カラムボックスではありません。
.container {
  position: relative;
  column-count: 3;
}
img {
  position: absolute;
  top: 20px;
  left: 40px;
}
The absolutely positioned image is positioned by reference to the [=multi-column container=] not the [=column box=].
この図は絶対位置指定された画像がカラムボックスではなくmulti-column containerを基準に配置されることを示しています。

multi-column containerのアウトオブフローの子孫もカラムバランスや multi-column containerのブロックサイズに影響します。

カラムボックスの並び順はmulticol containerのインライン基準方向で決まり、multicol行に配置されます。 カラム幅はインライン方向の長さ、 カラム高さはブロック方向の長さです。 同一行の全カラムボックスは同じカラム幅・高さを持ちます。

注: 縦書きで組まれたテキストではブロック方向は水平方向となります。 縦書きの場合、カラムは水平方向に並び、ブロックの流れ方向は右から左や左から右にもなります。 column-widthプロパティはカラムのインラインサイズ(物理的な横幅ではない)を指します。

The first image shows horizontal text with a LTR inline direction. The second shows vertical text with blocks flowing right to left. The third shows vertical text with blocks flowing left to right.
書字モードによってカラムがどのように並ぶかの例。
左から:horizontal-tb、vertical-rl、vertical-lr。

multicol行ごとに、 隣接するカラムボックスはカラムギャップで分離され、 そこにはカラム罫線が入る場合もあります。 同じmulti-column container内のカラムギャップ・罫線は全て等しくなります。 カラム罫線は両側に内容があるカラム間だけに現れます。

単純な場合、multicol containerは1行のカラムだけを持ち、 各カラムの高さはmulti-column containerの内容ボックスの使用高さと等しくなります。 ただし、分割スパナーによって、 multi-column containerの内容が複数のmulticol行に分割されることもあります。

multi-column containerがページ分割される場合、各カラムの高さはページで制約され、次のページの新しいカラム行に内容が続きます。カラムボックスがページをまたいで分割されることはありません。

同じ効果はスパニング要素がmulti-column containerを分割する場合にも発生します。スパナーの前のカラムは内容に合わせてバランスよく短縮され、スパナーの後の内容は新しいカラム行に流れ込みます。

a diagram showing a spanning element causing the shortened columns above the element with text continuing in new columns below
スパニング要素がmulticol containerを分割する様子の例。

multi-column containerは、 したがって通常のブロックコンテナであり、 その内容は一連のmulticol行とmulticolスパナーから構成される新たな独立整形コンテキストを確立します。 各multi-column行ブロックレベルボックスとして そのカラムボックスのための多段組み整形コンテキストを確立します。 スパナーブロックレベルボックスとして、通常通りdisplay値に応じた独立整形コンテキストを確立します。

多段組みコンテナの入れ子も可能ですが、実装依存の制限がある場合があります。

注: カラムボックスにプロパティや値を直接設定することはできません。 例えば、特定のカラムボックスの背景を設定したり、カラムボックスにパディング・マージン・ボーダーの概念はありません。 将来的な仕様で追加機能が検討される可能性があります(例:カラムごとに幅や背景を変えるなど)。

注: ビューポートより高いカラム高さを持つmulticol containerはアクセシビリティ上の問題を招くことがあります。 詳細はアクセシビリティに関する考慮事項を参照ください。

4. カラムの数と幅

多段組みコンテンツをレイアウトする際、カラム数とカラム幅の決定は基本となります。 これらのプロパティを使ってカラム数とカラム幅を設定します:

3つ目のプロパティcolumnsは、 column-widthcolumn-countの両方を設定できるショートハンドプロパティです。

明示的なカラム区切りや内容、高さの制約など、他の要因も実際のカラム数や幅に影響を与えることがあります。

4.1. カラムのインラインサイズ: column-width プロパティ

名前: column-width
値: auto | <length [0,∞]>
初期値: auto
適用対象: ブロックコンテナテーブルラッパーボックスを除く)
継承: no
パーセンテージ: N/A
算出値: キーワードautoまたは絶対長さ
正規順序: 文法に従う
アニメーション型: 算出値型による

このプロパティは多段組みコンテナのカラム幅を指定します。

auto
他のプロパティ(例:column-countがautoでない場合など)によってカラム幅が決まることを意味します。
<length [0,∞]>
最適なカラム幅を指定します。 実際のカラム幅は(利用可能なスペースを満たすために)より広くなることもあり、 または(利用可能なスペースが指定幅より小さい場合は)より狭くなることもあります。 負の値は指定できません。 使用値は最低でも1pxに丸められます。
例えば次のスタイルシートを考えます:
div {
  width: 100px;
  column-width: 45px;
  column-gap: 0;
  column-rule: none;
}

100px幅の要素の中に45pxのカラムを2つ入れる余地があります。 利用可能スペースを満たすため、実際のカラム幅は50pxに拡大されます。

また、次のスタイルシートも考えられます:
div {
  width: 40px;
  column-width: 45px;
  column-gap: 0;
  column-rule: none;
}

利用可能スペースが指定されたカラム幅より小さいため、実際のカラム幅は縮小されます。

column-widthを縦書きテキストにも使えるようにするため、 カラム幅とはカラム内の行ボックスの長さ(インライン方向)を指します。

注: column-widthがある程度柔軟なのは、 さまざまな画面サイズに対応したスケーラブルなデザインを実現するためです。 正確なカラム幅を指定するには、 カラム間ギャップと多段組みコンテナの幅(横書きの場合)も指定する必要があります。

4.2. カラム数: column-count プロパティ

名前: column-count
値: auto | <integer [1,∞]>
初期値: auto
適用対象: ブロックコンテナテーブルラッパーボックスを除く)
継承: no
パーセンテージ: N/A
算出値: 指定値
正規順序: 文法に従う
アニメーション型: 算出値による

このプロパティは多段組みコンテナのカラム数を指定します。

auto
他のプロパティ(例:column-widthがautoでない場合など)によってカラム数が決まることを意味します。
<integer [1,∞]>
要素の内容が流し込まれる最適なカラム数を指定します。 値は0より大きくなければなりません。 column-widthcolumn-countがどちらもautoでない場合、 この整数値は最大カラム数を示します。
例:
body { column-count: 3 }

4.3. column-widthcolumn-countのショートハンド: columns プロパティ

名前: columns
値: <'column-width'> || <'column-count'>
初期値: 個別プロパティ参照
適用対象: 個別プロパティ参照
継承: 個別プロパティ参照
パーセンテージ: 個別プロパティ参照
算出値: 個別プロパティ参照
アニメーション型: 個別プロパティ参照
正規順序: 文法に従う

これはcolumn-widthcolumn-countをまとめて設定できるショートハンドプロパティです。 省略された値は初期値となります。

columnsプロパティの有効な宣言例:
columns: 12em;      /* column-width: 12em; column-count: auto */
columns: auto 12em; /* column-width: 12em; column-count: auto */
columns: 2;         /* column-width: auto; column-count: 2 */
columns: 2 auto;    /* column-width: auto; column-count: 2 */
columns: auto;      /* column-width: auto; column-count: auto */
columns: auto auto; /* column-width: auto; column-count: auto */

4.4. 疑似アルゴリズム

下記の疑似アルゴリズムはcolumn-count(N)とcolumn-width(W)の使用値を決定します。他の変数としてU(多段組みコンテナの使用幅)があります。

注: 多段組みコンテナの使用幅Uは要素の内容によって決まる場合があり、 その場合column-countcolumn-widthの算出値にも依存します。 本仕様はUの計算方法を定義しません。 別のモジュール(おそらくBasic Box Model [CSS3BOX]やBox Sizing Module [CSS3-SIZING])で定義される予定です。

floor(X)関数はX以下の最大の整数Yを返します。

(01)  if ((column-width = auto) and (column-count = auto)) then
(02)      exit; /* not a multicol container */
(03)  if column-width = auto then
(04)      N := column-count
(05)  else if column-count = auto then
(06)      N := max(1,
(07)        floor((U + column-gap)/(column-width + column-gap)))
(08)  else
(09)      N := min(column-count, max(1,
(10)        floor((U + column-gap)/(column-width + column-gap))))

そして:

(11)  W := max(0, ((U + column-gap)/N - column-gap))

自動反復カラム数を決定する目的で、 UAはカラムサイズをゼロ除算を避けるためUA指定値までfloorしなければなりません。 この下限値は1px以下が推奨されます。

ページ分割メディアなどの分断文脈では、 UAはこの計算をフラグメントごとに行っても構いません。

column-countの使用値は明示的なカラム区切りやカラム高さ制約を考慮せずに計算されますが、 実際の値はこれらを考慮します。

この例では、明示的なカラム区切りによって実際のcolumn-countが使用値より多くなっています:
div {
  width: 40em;
  columns: 20em;
  column-gap: 0;
}

p {
  break-after: column;
}
<div>
  <p>one
  <p>two
  <p>three
</div>
Two columns drawn inside the container, one outside
算出column-countはauto、使用column-countは2、実際のcolumn-countは3です。
実際のcolumn-countが使用値より少なくなる場合もあります。 例えば:
div {
  width: 80em;
  height: 10em;
  columns: 20em;
  column-gap: 0;
  column-fill: auto;
}
<div>foo</div>

算出column-countはauto、使用column-countは4、実際のcolumn-countは1です。

4.5. スタッキングコンテキスト

多段組みコンテナ内のすべてのカラムボックスは同じスタッキングコンテキストに属し、内容の描画順序はCSS 2.1で規定されたとおりです。 カラムボックスは新たなスタッキングコンテキストを確立しません。

4.6. カラムのスタイリング: ::column 疑似要素

::column 疑似要素は、 多段組みコンテナ内の個々のカラムを表します。 これは多段組みコンテナにのみ存在します。

多段組みコンテナには、カラム数と同じ数の::column疑似要素があります。 これらは個別に指定することはできません。 multicolの::column疑似要素に指定したスタイルは その要素のすべてのカラムに適用されます。 各::columnは対応するカラムと同じサイズ・位置を持ちます。 カラムの利用可能スペース(インライン軸)や、コンテナの内容ボックス(ブロック軸)に一致します。 (カラム間のギャップや罫線部分は含みません。)

::column疑似要素は、自身の多段組みコンテナの子として扱われますが、内容は持ちません。 これらはカラムの内容をラップしません。同じスペースを塗りつぶすだけです。

::column疑似要素は、非常に限られたプロパティのみ受け付けます:

さらに、::column疑似要素には自身の::scroll-marker疑似要素を持つことができます(::column::scroll-marker)。 (その他の疑似要素は::columnには存在しません。) この::scroll-marker疑似要素は、::column疑似要素自身ではなく、 その起点要素から継承します。

注: ::columnで利用できるプロパティや疑似要素は、今後さらに拡張される可能性があります。 カラムの内容ではなく位置を気にする機能が増えれば、今後の追加が予想されます。

5. カラム間の間隔と罫線

カラムギャップとカラム罫線は、同じ多段組みコンテナのカラム間に配置されます。 カラムギャップとカラム罫線の長さはカラムの高さと等しくなります。 カラムギャップはスペースを占有します。 つまり、カラムギャップは隣接するカラム(同じ多段組みコンテナ内)の内容を離して配置します。

カラム罫線は、カラムギャップの中央に描画され、 その端点は多段組みコンテナの内容エッジの反対側に位置します。 カラム罫線はスペースを占有しません。 つまり、カラム罫線の有無や太さによって、他のものの配置は変わりません。 カラム罫線がギャップより太い場合は、隣接カラムボックスが罫線と重なり、 罫線が多段組みコンテナの外まで伸びる場合もあります。 カラム罫線は多段組みコンテナのボーダーのすぐ上に描画されます。 スクロール可能な多段組みコンテナでは、 ボーダーや背景は当然スクロールしませんが、 罫線はカラムと一緒にスクロールする必要があります。 カラム罫線は両側に内容があるカラムの間だけ描画されます。

5.1. カラム間のガター: column-gap プロパティ

column-gapプロパティは[CSS3-ALIGN]で定義されています。

多段組み整形コンテキストでは、normal値のcolumn-gap使用値は1emです。 これにより初期値のままでも可読性が確保されます。 カラム間に罫線がある場合は、そのギャップの中央に表示されます。

5.2. カラム罫線の色: column-rule-color プロパティ

名前: column-rule-color
値: <color>
初期値: currentcolor
適用対象: 多段組みコンテナ
継承: no
パーセンテージ: N/A
算出値: 算出色
正規順序: 文法に従う
アニメーション型: 算出値型による
<color>
カラム罫線の色を指定します。

5.3. カラム罫線のスタイル: column-rule-style プロパティ

名前: column-rule-style
値: <line-style>
初期値: none
適用対象: 多段組みコンテナ
継承: no
パーセンテージ: N/A
算出値: 指定キーワード
正規順序: 文法に従う
アニメーション型: discrete

column-rule-styleプロパティは、要素のカラム間の罫線スタイルを設定します。 <line-style>値はcollapsing border modelと同様に解釈されます。

nonehiddenは、column-rule-widthの算出値を0にします。

5.4. カラム罫線の幅: column-rule-width プロパティ

名前: column-rule-width
値: <line-width>
初期値: medium
適用対象: 多段組みコンテナ
継承: no
パーセンテージ: N/A
算出値: 絶対長さ、ボーダー幅としてスナップされた値;カラム罫線スタイルがnoneまたはhiddenの場合は0
正規順序: 文法に従う
アニメーション型: 算出値型による

このプロパティはカラム間の罫線の幅を設定します。 負の値は指定できません。

5.5. カラム罫線ショートハンド: column-rule プロパティ

名前: column-rule
値: <'column-rule-width'> || <'column-rule-style'> || <'column-rule-color'>
初期値: 個別プロパティ参照
適用対象: 個別プロパティ参照
継承: 個別プロパティ参照
パーセンテージ: 個別プロパティ参照
算出値: 個別プロパティ参照
アニメーション型: 個別プロパティ参照
正規順序: 文法に従う

このプロパティは、スタイルシート上でcolumn-rule-widthcolumn-rule-stylecolumn-rule-colorをまとめて設定できるショートハンドです。 省略された値は初期値となります。

この例ではカラム罫線カラムギャップの幅が同じです。 よって、両者は正確に同じスペースを占めます。
body {
  column-gap: 35px;
  column-rule-width: 35px;
  column-rule-style: solid;
  column-rule-color: black;
}
The rule completely covers any gap.
カラム罫線とカラムギャップが同じスペースを占めます。

6. カラム区切り

内容が複数カラムにレイアウトされる場合、 ユーザーエージェントはカラム区切り位置を決定しなければなりません。 内容をカラムに分割する問題は、ページへ分割する問題(CSS 2.1 セクション13.3.3 [CSS21])とよく似ています。

カラム区切りをページ区切りと同じプロパティで記述できるよう、3つの新しいプロパティが導入されました:break-beforebreak-afterbreak-insideです。

6.1. 分断制御: break-beforebreak-afterbreak-insideプロパティ

break-beforebreak-afterbreak-inside[CSS3-BREAK]で定義されています。

7. カラムのまたぎ(スパニング)

column-spanプロパティにより、要素が複数のカラムにまたがって表示されることが可能になります。 本仕様では、前レベルで利用できた値に<integer>を追加しています。

7.1. column-span

名前: column-span
値: none | <integer [1,∞]> | all | auto
初期値: none
適用対象: フロー内のブロックレベル要素
継承: no
パーセンテージ: N/A
算出値: 指定値
正規順序: 文法に従う
アニメーション型: discrete

このプロパティは要素がまたがるカラム数を指定します。値は以下の通りです:

none
この要素は複数カラムにまたがりません。
all
要素はカラム区切りを強制し、フロー外となって、同じブロック整形コンテキストで最も近いmulticol祖先の全カラムにまたがります。 要素より前に現れる通常フローの内容は、直前のmulti-column行のすべてのカラムに自動的にバランスよく配置され、 要素の後の内容は新規のmulti-column行に流れ込みます。 要素は独立整形コンテキストを確立します。

注: 要素が新たな整形コンテキストを確立するかどうかは、その要素がmulticolの子孫かどうかに依存しません。 column-spanallのときは常に確立します。 これは後でmulticolが削除されたり、メディアクエリ等でmulticolが無効になった場合にもデザインの堅牢性を保つためです。

<integer [1,∞]>
指定したカラム数だけ要素がまたがります。 値は0より大きくなければなりません。 指定された整数値がmulticol要素のカラム数以上なら、 column-span: allと同じになります。
この定義は不十分です。
  • column-span: 1column-span: noneとみなすのか、それともスパナー(BFC)を作るのか?
  • どのカラムをまたぐのか?
  • 高さ計算やcolumn-fillとの相互作用は?
auto
要素がまたがるカラム数は、そのmin-content 外部サイズ(multi-column containerのインライン方向)によって決まります。 それがcolumn-widthの使用値より小さい場合は column-span: noneと同じです。 そうでなければ、またがりに必要な最小の正の整数nn × column-width + (n - 1) × column-gapmin-content外部サイズを超える最小のn。 これがカラム数を超える場合は、column-span: allと同様に扱います。

column-span: 1column-span: noneと同じでない場合、要素が小さい時はcolumn-span: 1column-span: noneどちらの動きにすべきか?

複数のカラムにまたがる要素を多段組みスパニング要素、その際に生成されるボックスを多段組みスパナーと呼びます。

スパナー包含ブロックmulti-column container自身です。 そのため、スパナー自身がスパナー内の絶対配置ボックス包含ブロックチェーンを確立しない場合には、 multi-column containerまでスキップされます(スパナーmulti-column container間の祖先はスキップされます)。

スパナーはフロー外扱いですが、 これによってスパニング要素の描画順 [CSS21]には影響しません。

この例では、h2要素がサンプル文書の6文目("the leg of a"の後)に追加されています。 このスタイルが適用されます:
h2 { column-span: all; background: silver }

column-spanallに設定することで、 h2要素より前に現れるすべての内容はh2の上に表示されます。

An element spans all three columns
h2要素はcolumn-span: allが指定されています

スパナーはmulti-column行を分割するため、カラム罫線(これは同じカラム間でのみ描画される)も中断されることに注意してください。

スパニング要素は、同じ整形コンテキストに属し、かつスパニング要素とmulti-column containerの間にfixed位置子孫のための包含ブロックを確立するものがなければ、 第一レベル以外の子孫でも問題ありません。

この例では、column-span: allが指定された要素がtransform: rotate(90deg)の中にあります。 transformはfixed位置子孫のための包含ブロックを作るため、スパナーは生成されません。
<article>
  <section>
    <div class="spanner">Attempted spanner</div>
  </section>
</article>
article {
  columns: 2;
}

section {
  transform: rotate(90deg);
}

.spanner {
  column-span: all;
  background: silver;
}

スパナーの前のフラグメントが空なら特別なことは起こりません。 上マージン・ボーダー・パディングはスパニング要素上に現れ、空のフラグメントとなります。

この例ではmulti-column containerarticle要素です。 その中に段落とsection要素があり、sectionの中にh2見出し(column-span: all)があり、section自体はカラムボックス内に収まっています。

h2はsectionの最初の子なので、 このsectionのmargin・border(図中赤)・paddingはスパニング h2より前の空フラグメントになります。

<article>
  <p>...</p>
  <section>
    <h2>An h2 element</h2>
    <p>...</p>
  </section>
</article>
section {
  border: 2px solid red;
  margin-top: 65px;
  padding-top: 20px;
}

h2 {
  column-span: all;
  background: silver
}
An element spans all three columns, the red border around the section breaks before the spanner.
h2要素にcolumn-span: all、sectionには赤枠と上部padding・margin

スパニング要素は、通常の場合よりも多くのスペースを必要とします。 スペースが足りない場合、スパニング要素を配置できないことがあります。 その場合、ユーザーエージェントはこのプロパティにnoneが指定されたものとして扱うことがあります。

この例ではh2要素が後ろに現れ、multi-column containerの高さが制限されています。 そのためh2はオーバーフロー内に現れ、スパニングできる余地がありません。 結果として、column-span: noneのように表示されます。
The h2 element is in an overflow column
h2要素はオーバーフローカラムにあり、column-span noneのように見えます
この例は前述とほぼ同じですが、H2要素が自然に最後のカラムに現れています。 それでもスパニングする余地がありません。
The h2 element is in the final column
h2要素は最終カラムにあり、column-span noneのように見えます
分断文脈でもスパニング要素はすべてのフラグメントで有効です。 この例では、ページ分割メディアの中で、最初の3つの段落の後にカラム区切りがあります。 スパニングH2要素が4段落目の後に現れます。
Three columns with two lines of text each
これは1ページ目の表示例
A spanning element across the three columns, text above and below.
これは2ページ目の表示例

スパナーはブロックレベルボックスなので、隣接するスパナー同士のマージンは相殺(マージンの折りたたみ)されます。 絶対配置要素だけで区切られた2つのスパナーのマージンも相殺されます(絶対配置要素はカラムボックスを生成しないため)。 カラムボックスは新たなブロック整形コンテキストを確立するため、カラムボックス内要素のマージンはスパナーのマージンと相殺されません。

スパナーは新たな整形コンテキストを確立しますが、そのマージンは周囲に影響される場合があります。 この例では、2つのスパナーが偶然ページ先頭に来ています。 1つ目スパナーの上マージンは非強制区切りと隣接しているため切り詰められます。 2つのスパナー間のマージンは相殺されます。 しかし2つ目スパナーの下マージンは次の要素の上マージンとは相殺されません。
h2 {
  margin: 16px 0;
  column-span: all;
  background: silver
}
p { margin-top: 16px }
Two spanning elements after a page break
2つのスパニング要素間のマージンは相殺されるが、スパナーの下マージンと次要素の上マージンは相殺されません。

8. カラムの充填

カラムの内容の詰め方には2つの戦略があります。 バランスさせるか、しないかです。 バランスする場合、ユーザーエージェントはカラム高さの差異を最小限にしようとしますが、強制区切りやwidowsorphans等のカラム高さに影響するプロパティも考慮されます。 バランスしない場合は、カラムを順番に埋めていき、途中や最後のカラムが空になることもあります。

8.1. カラムのバランス調整: column-fillプロパティ

名前: column-fill
値: auto | balance | balance-all
初期値: balance
適用対象: multi-column container
継承: no
パーセンテージ: N/A
算出値: 指定キーワード
正規順序: 文法に従う
アニメーション型: discrete

このプロパティは、multi-column行内で スパナーの直前でない内容がカラム間でバランスされるかどうかを指定します。

値は以下の通りです:

balance
可能な限り均等にカラム間で内容を分割します。 分断文脈では、最後のフラグメントだけバランスされます。
balance-all
可能な限り均等にカラム間で内容を分割します。 分断文脈ではすべてのフラグメントでバランスされます。
auto
カラムを順番に埋めていきます

連続文脈では、オーバーフローカラムがある場合このプロパティは効果を持ちません。

この例では、記事が短い段落1つだけで3行分しかありません。 カラムバランスにより3行が3カラムに分割表示されます。
article {
  width: 60em;
  height: auto;
  columns: 4;
  column-fill: balance;
}
Four columns, the first three have content.
カラムバランスにより3行が3カラムに分かれて表示されます。
この例ではカラムバランスをオフにし、記事の高さを指定しています:
article {
  width: 60em;
  height: 4em;
  columns: 4;
  column-fill: auto;
}

結果として、すべての内容が最初のカラムに詰められます:

Four columns, the first one has content.
バランスしないので、全文が1カラムに表示されます。
この例では、記事内に段落が2つあります。 最初は長く、次は短い段落です。 このコードが適用されています:
article {
  width: 60em;
  height: auto;
  columns: 4;
  column-fill: balance;
}

p { break-after: column;
}

最短カラム高さは5行です。 カラム高さが決まった後は、カラムを順に埋めていきます。 そのため3カラム目は前2つと同じ高さですが、最後のカラムはかなり短くなります。

Four columns, all have content.
カラム高さが決まった後、順次カラムを埋めていきます。
article {
  width: 60em;
  height: auto;
  columns: 4;
  column-fill: balance;
}

この例では最初に分割できないfigure要素があり、これがカラム高さを決めます。 以降の内容は残ったカラムに順次埋められます:

Column one contains an image, two and three have content.
カラム高さはfigureで決まります。

9. オーバーフロー

9.1. 多段組みコンテナ内のオーバーフロー

カラム区切りを発生させる場合を除き、カラムボックスの外側にはみ出た内容は 目に見える形でオーバーフローし、カラムボックスでクリップされません。

注: カラム区切りについては§6 カラム区切り、 多段組みコンテナの内容ボックスでクリップされるかどうかは§9.2 多段組みコンテナ外部のページ分割とオーバーフローを参照してください。

この例では、画像がカラムよりも幅広です:
An imagine in the first column has visible overflow
内容は目に見えてオーバーフローし、カラムボックスでクリップされません。

9.2. 多段組みコンテナ外部のページ分割とオーバーフロー

多段組みコンテナの端でカラムボックスの外側にはみ出した内容やカラム罫線は、overflowプロパティに従ってクリップされます。

多段組みコンテナは、以下の理由で収まりきらないほど多くのカラムを持つことがあります:

連続文脈で多段組みコンテナの外側に現れるカラムは、オーバーフローカラムと呼ばれます。 オーバーフローカラムは多段組みコンテナの高さに影響を与えることがあります。

この例では、多段組みコンテナの高さが最大値で制限されています。 さらに、スタイルシートでオーバーフロー内容が見えるように指定されています:
div {
  max-height: 5em;
  overflow: visible;
}

その結果、カラム数が増えます。

Four columns, one outside the multicol container
インライン方向にオーバーフローカラムが生成されます。

連続文脈では、オーバーフローカラムが多段組みコンテナの高さに影響を与える場合があります。 この例では、オーバーフロー内に4行のテキストを含むカラムが現れ、 多段組みコンテナはこのカラムを収容できる高さになります。

Four columns, overflow column is taller than the first three
最後のカラムがオーバーフローカラムで他より高くなっています。 コンテナはこのカラムに合わせて高くなります。
分断文脈では、オーバーフロー内容は後続のフラグメントのカラムに入ります。 例31と同じ内容・1ページに5行しか収まらないページボックスの場合、 1ページ目はこうなります:
Three columns
最初の3つの段落が1ページ目に表示されます。

カラムバランスを仮定すると、2ページ目はこうなります:

Three columns
オーバーフローカラムが2ページ目に移動されています。
この例では、段落ごとに明示的なカラム区切りが生成されています:
p {
  break-after: column;
}

その結果、カラム数が増え、追加のカラムがインライン方向に追加されます:

Four columns, one outside the multicol container
インライン方向にオーバーフローカラムが生成されます。
ページ分割メディアでは、 追加のカラムは次ページに表示されます。 前例と同じコードの場合、最後の段落は2ページ目に現れます。 1ページ目はこうなります:
Three columns
最初の3段落が1ページ目に表示されます。

2ページ目はこうなります:

Three columns
オーバーフローカラムが2ページ目に移動されています。

カラムバランスのため、最後の段落は3カラムに分割されます。

付録B. 変更点

この付録は参考情報です。

2024年5月16日付 CSS-MULTICOL-1 Candidate Recommendation (CR)からの変更点

プライバシーに関する考慮事項

多段組みは新たなプライバシー漏洩をもたらしません。

セキュリティに関する考慮事項

多段組みは新たなセキュリティ上の考慮事項をもたらしません。

アクセシビリティに関する考慮事項

コンテナの高さや行長の設定は、視覚・認知障害のある人にとって課題となる場合があります。 ユーザーのニーズを理解するには WCAG 達成基準 1.4.10 リフローWCAG 1.4.8 ビジュアルプレゼンテーションを参照してください。

謝辞

本書はHåkon Wium Lieによる[CSS3-MULTICOL]の成果に基づいており、 複数の過去提案やそのコメントを参考にしています。 貢献者は次の通りです:

Alex Mogilevsky、 Andy Clarke、 Anton Prowse、 Bert Bos、 Björn Höhrmann、 Cédric Savarese、 Chris Lilley、 Chris Wilson、 Daniel Glazman、 Dave Raggett、 David Hyatt、 David Singer、 David Woolley、 Elika Etemad、 Giovanni Campagna、 Ian Hickson、 Joost de Valk、 Kevin Lawver、 L. David Baron、 Markus Mielke、 Melinda Grant、 Michael Day、 Morten Stenshorne、 Øyvind Stenhaug、 Peter Linss、 Peter-Paul Koch、 Robert O’Callahan、 Robert Stevahn、 Sergey Genkin、 Shelby Moore、 Steve Zilles、 Sylvain Galineau、 Tantek Çelik、 Till Halbach

適合性

文書の規約

適合要件は、記述的な断言と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はアクセシブルな代替手段を必ず提供しなければなりません。

適合クラス

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

style sheet
CSSスタイルシート
renderer
UAで、スタイルシートの意味を解釈し、それを使う文書を描画するもの。
authoring tool
UAで、スタイルシートを書くもの。

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

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

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

部分的な実装

著者が将来互換性のある構文解析ルールを利用してフォールバック値を指定できるように、CSSレンダラーは必ず、サポートしていないat-ルール、プロパティ、プロパティ値、キーワード、その他の構文構造を無効とし(そして適切に無視)なければなりません。特に、ユーザーエージェントは決してサポートしていない値とサポートしている値を同じ複数値プロパティ宣言内で選択的に無視してはなりません。いずれかの値が無効(未サポート値は必ず無効)と見なされる場合、CSSでは宣言全体を無視する必要があります。

不安定機能・独自拡張の実装

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

非実験的な実装

仕様がCandidate Recommendation段階に到達すると、非実験的な実装が可能となり、実装者は仕様に従って正しく実装されていることを実証できるCRレベルの機能については、プリフィックスなしの実装をリリースするべきです。

CSSの相互運用性を実現・維持するため、CSSワーキンググループは、非実験的なCSSレンダラーに対し、プリフィックスなしの実装をリリースする前に実装レポート(および必要に応じてそのレポートに使ったテストケース)をW3Cに提出することを求めています。W3Cに提出されたテストケースはCSSワーキンググループによるレビュー・修正の対象となります。

テストケースや実装レポートの提出方法など詳細は、CSSワーキンググループのWebサイト https://www.w3.org/Style/CSS/Test/ を参照してください。 質問は public-css-testsuite@w3.org メーリングリスト宛にお送りください。

索引

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

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

参考文献

規範的参照

[CSS-BACKGROUNDS-3]
Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2024年3月11日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2024年8月4日. WD. URL: https://www.w3.org/TR/css-box-4/
[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-COLOR-5]
Chris Lilley; 他. CSS Color Module Level 5. 2024年2月29日. WD. URL: https://www.w3.org/TR/css-color-5/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 2023年3月30日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-GRID-2]
Tab Atkins Jr.; Elika Etemad; Rossen Atanassov. CSS Grid Layout Module Level 2. 2020年12月18日. CR. URL: https://www.w3.org/TR/css-grid-2/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2023年3月29日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-OVERFLOW-5]
CSS Overflow Module Level 5. Editor's Draft. URL: https://drafts.csswg.org/css-overflow-5/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 2024年8月10日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-SCROLL-SNAP-1]
Matt Rakow; 他. CSS Scroll Snap Module Level 1. 2021年3月11日. CR. URL: https://www.w3.org/TR/css-scroll-snap-1/
[CSS-TABLES-3]
François Remy; Greg Whitworth; David Baron. CSS Table Module Level 3. 2019年7月27日. WD. URL: https://www.w3.org/TR/css-tables-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2024年3月22日. 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. 2024年3月12日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS21]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSS3-ALIGN]
Elika Etemad; Tab Atkins Jr.. CSS Box Alignment Module Level 3. 2023年2月17日. WD. URL: https://www.w3.org/TR/css-align-3/
[CSS3-BREAK]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 2018年12月4日. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS3-SIZING]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021年12月17日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[MEDIAQUERIES-5]
Dean Jackson; 他. Media Queries Level 5. 2021年12月18日. WD. URL: https://www.w3.org/TR/mediaqueries-5/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2022年11月11日. WD. URL: https://www.w3.org/TR/selectors-4/

参考情報

[CSS-TRANSFORMS-1]
Simon Fraser; 他. CSS Transforms Module Level 1. 2019年2月14日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS3-MULTICOL]
Florian Rivoal; Rachel Andrew. CSS Multi-column Layout Module Level 1. 2024年5月16日. CR. URL: https://www.w3.org/TR/css-multicol-1/
[CSS3BOX]
Elika Etemad. CSS Box Model Module Level 3. 2024年4月11日. REC. URL: https://www.w3.org/TR/css-box-3/

プロパティ索引

名前 初期値 適用対象 継承 %指定 アニメーション型 正規順序 算出値
column-count auto | <integer [1,∞]> auto ブロックコンテナ(table wrapper boxを除く) no N/A 算出値による 文法に従う 指定値
column-fill auto | balance | balance-all balance 多段組みコンテナ no N/A 離散 文法に従う 指定キーワード
column-rule <'column-rule-width'> || <'column-rule-style'> || <'column-rule-color'> 個別プロパティ参照 個別プロパティ参照 個別プロパティ参照 個別プロパティ参照 個別プロパティ参照 文法に従う 個別プロパティ参照
column-rule-color <color> currentcolor 多段組みコンテナ no N/A 算出値型による 文法に従う 算出色
column-rule-style <line-style> none 多段組みコンテナ no N/A 離散 文法に従う 指定キーワード
column-rule-width <line-width> medium 多段組みコンテナ no N/A 算出値型による 文法に従う 絶対長さ、ボーダー幅としてスナップ; カラム罫線スタイルがnoneまたはhiddenの場合は0
column-span none | <integer [1,∞]> | all | auto none フロー内ブロックレベル要素 no N/A 離散 文法に従う 指定値
column-width auto | <length [0,∞]> auto ブロックコンテナ(table wrapper boxを除く) no N/A 算出値型による 文法に従う キーワードauto または絶対長さ
columns <'column-width'> || <'column-count'> 個別プロパティ参照 個別プロパティ参照 個別プロパティ参照 個別プロパティ参照 個別プロパティ参照 文法に従う 個別プロパティ参照

課題索引

この定義は不十分です。
column-span: 1column-span: noneと同じでない場合、要素が小さい時はcolumn-span: 1として扱うかcolumn-span: noneとして扱うか?