CSSリストとカウンター モジュール レベル3

W3C作業草案,

このバージョン:
https://www.w3.org/TR/2020/WD-css-lists-3-20201117/
最新公開バージョン:
https://www.w3.org/TR/css-lists-3/
編集者草案:
https://drafts.csswg.org/css-lists-3/
以前のバージョン:
課題追跡:
CSSWG課題リポジトリ
仕様内インライン
編集者:
Elika J. Etemad / fantasai (招待専門家)
Tab Atkins (Google)
元編集者:
(Google)
(元Microsoft)
この仕様への編集提案:
GitHubエディター
貢献者:
Simon Montagu, AOL-TW/Netscape, smontagu@netscape.com
Daniel Yacob, yacob@geez.org
Christopher Hoess, choess@stwing.upenn.edu
Daniel Glazman, AOL-TW/Netscape, glazman@netscape.com

概要

このモジュールはリストカウンターに関連するCSSの機能、つまりそのスタイリング、配置、および値の操作方法を含みます。

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

この文書のステータス

このセクションは公開時点での文書のステータスを説明します。 他の文書が本書を置き換える場合があります。 現在のW3Cの出版物一覧と本技術報告書の最新版は https://www.w3.org/TR/ のW3C技術報告書インデックスで確認できます。

この文書は CSS作業グループによって作業草案として公開されました。 作業草案として公開されても、W3C会員による承認を意味するものではありません。

この文書は草案であり、 他の文書によって随時更新、置換、または廃止される可能性があります。 進行中の作業以外としてこの文書を引用することは適切ではありません。

ご意見は GitHubで課題を提出(推奨)してお送りください。 件名には「css-lists」を含めて、例: “[css-lists] …コメントの概要…” のようにしてください。 すべての課題とコメントはアーカイブされています。 または、(アーカイブ)パブリックメーリングリスト www-style@w3.orgに送信することもできます。

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

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

1. はじめに

この仕様は::marker疑似要素、 マーカーを生成するlist-item display型、 そしてマーカーの配置やスタイリングを制御するいくつかのプロパティを定義します。

また、特別な数値オブジェクトであるカウンターを定義します。 これはマーカーのデフォルト内容の生成によく使われます。

例えば、次の例はマーカーを使って各番号付きリスト項目の周りに括弧を追加する方法を示しています:
<style>
li::marker { content: "(" counter(list-item, lower-roman) ")"; }
li { display: list-item; }
</style>
<ol>
  <li>This is the first item.
  <li>This is the second item.
  <li>This is the third item.
</ol>

このような表示になります:

  (i) This is the first item.
 (ii) This is the second item.
(iii) This is the third item.

注: この例はHTMLで通常必要となるよりもかなり冗長ですが、 必要なスタイリングのほとんどはUAのデフォルトスタイルシートで処理されます。

子孫セレクターや子セレクターを使うことで、埋め込みリストの深さに応じて異なるマーカータイプを指定できます。

1.1. 値の定義

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

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

2. リスト項目の宣言

リスト項目とは、 display プロパティがlist-itemに設定されている要素です。リスト項目::marker疑似要素を生成します。 他の要素は生成しません。 さらに、リスト項目は暗黙のlist-item カウンターを自動的にインクリメントします(§ 4.6 暗黙のlist-itemカウンター参照)。

3. マーカー

リスト項目 display型の定義的特徴は、マーカーです。 これはリスト内の各リスト項目の先頭を示す記号や序数です。 CSSレイアウトモデルでは、リスト項目マーカーは 各リスト項目に関連付けられたマーカーボックスとして表現されます。 このマーカーの内容は、 リスト項目上のlist-style-typelist-style-imageプロパティ、 そしてその::marker疑似要素にプロパティを割り当てることで制御できます。

3.1. ::marker 疑似要素

マーカーボックスは、 ::marker疑似要素によってリスト項目の最初の子として生成されます。 これは、要素上に存在する場合::before疑似要素の前に配置されます。 内容は§ 3.2 マーカー内容の生成で定義されています。

この例では、マーカーを使って「note」と指定された段落に番号を付けています:
<style>
p { margin-left: 12 em; }
p.note {
  display: list-item;
  counter-increment: note-counter;
}
p.note::marker {
  content: "Note " counter(note-counter) ":";
}
</style>
<p>This is the first paragraph in this document.
<p class="note">This is a very short document.
<p>This is the end.

次のように表示されます:

        This is the first paragraph
        in this document.

Note 1: This is a very short
        document.

        This is the end.
::marker疑似要素を使うことで、 リストのマーカーをリスト項目自体のテキストとは独立してスタイリングできます:
<style>
p { margin-left: 8em } /* カウンター用のスペース */
li { list-style-type: lower-roman; }
li::marker { color: blue; font-weight:bold; }
</style>
<p>This is a long preceding paragraph ...
<ol>
  <li>This is the first item.
  <li>This is the second item.
  <li>This is the third item.
</ol>
<p>This is a long following paragraph ...

この文書は次のように表示されます:

       This is a long preceding
       paragraph ...

  i.   This is the first item.
 ii.   This is the second item.
iii.   This is the third item.

       This is a long following
       paragraph ...

以前はマーカーをスタイリングする唯一の方法は継承を利用することでした。 望むマーカースタイリングをリスト項目に設定し、 実際のリスト項目内容のラッパー要素でそれを解除する必要がありました。

マーカーボックスリスト項目にのみ存在します。 他の要素では、 ::marker疑似要素のcontentプロパティはnoneに計算され、 これにより生成が抑制されます。

3.1.1. ::markerに適用されるプロパティ

全てのプロパティは::marker疑似要素に設定可能で、 計算値を持ちます。 ただし、実際にマーカーボックスに適用されるCSSプロパティは以下の通りです:

今後の仕様でこのプロパティリストが拡張されることが期待されますが、 現時点ではマーカーボックスの外部レイアウトは完全に定義されていないため、 これらのプロパティだけが許可されています。

その他のプロパティは、マーカーボックスに対して作者起源で設定しても効果を持つべきではありません。 UAはそのようなプロパティを適用しないか、 ユーザーエージェント起源!importantルールで値を強制できます。 ただし、テキストに適用される継承可能なプロパティは ::marker疑似要素に設定でき、 これらはテキスト内容に継承されて効果を持ちます。

テキストに適用されるプロパティの例、および ::marker上で宣言した場合::marker内容にも適用される例:

UAは次のルールをデフォルトスタイルシートに追加しなければなりません:

::marker, ::before::marker, ::after::marker {
  unicode-bidi: isolate;
  font-variant-numeric: tabular-nums;
  white-space: pre;
  text-transform: none;
}

注: ::marker疑似要素は マーカーボックス::beforeまたは::after 疑似要素のためにも表現できますが、 複合セレクター::marker*::markerに展開、[SELECTORS-4])はこれらのマーカーを選択しません。 起点要素疑似要素である場合は、 セレクターで明示的に指定する必要があります(例:::before::marker)。

white-space: preは完全に望ましい挙動にはなりません。 text-space-collapse: preserve-spaces + text-space-trim: discard-afterの方がここで必要な動作に近いかもしれません。 詳細はIssue 4448およびIssue 4891の議論を参照してください。

3.2. マーカー内容の生成

マーカーボックスの内容は、次の条件のうち最初に該当するものによって決定されます:

content::marker自身に対してnormalでない場合
マーカーボックスの内容は、contentプロパティで定義されている通りに決定されます。::beforeと同様です。
list-style-image起点要素に指定され、マーカー画像を定義している場合
'マーカーボックスには、 指定されたマーカー画像を表す 匿名 インライン 置換要素が入り、 その後に1つのスペース(U+0020 SPACE)からなるテキストランが続きます。
list-style-type起点要素に指定され、マーカー文字列を定義している場合
マーカーボックスには、指定されたマーカー文字列からなるテキストランが入ります。
その他
マーカーボックスには内容がなく、::markerはボックスを生成しません。

加えて、UAは保持された強制改行をスペースに変換したり、破棄したりすることがあります。

3.3. 画像マーカー: list-style-image プロパティ

Name: list-style-image
Value: <image> | none
Initial: none
Applies to: リスト項目
Inherited: yes
Percentages: n/a
Computed value: キーワードnoneまたは計算された<image>
Canonical order: 文法順
Animation type: 離散的

マーカー画像を指定します。 これは、リスト項目マーカーcontentnormalの場合に使用されます。 値は以下の通りです:

<image>
<image>有効な画像を表している場合、 要素のマーカー画像として<image>を指定します。 そうでない場合、 要素にはマーカー画像がありません。
none
要素にはマーカー画像がありません。
次の例では、各リスト項目の先頭に"ellipse.png"画像をマーカーとして設定します。
li { list-style-image: url("http://www.example.com/ellipse.png") }

3.4. テキストベースのマーカー: list-style-type プロパティ

Name: list-style-type
Value: <counter-style> | <string> | none
Initial: disc
Applies to: リスト項目
Inherited: yes
Percentages: n/a
Computed value: 指定値
Canonical order: 文法順
Animation type: 離散的

マーカー文字列を指定します。 これは、リスト項目マーカーcontent値がnormalで、マーカー画像がない場合に使用されます。 値は以下の通りです:

<counter-style>
要素のマーカー文字列を、指定されたlist-itemカウンター値を 指定された<counter-style>で表現した値にします。

具体的には、 マーカー文字列は、カウンター表現生成の結果であり、 指定されたlist-itemカウンター値を 指定された<counter-style>で生成し、 prefix<counter-style>の接頭辞)で始まり、 suffix<counter-style>の接尾辞)で終わります。 指定された<counter-style>が存在しない場合は、decimalが使用されます。

<string>
要素のマーカー文字列は、指定された<string>です。
none
要素にはマーカー文字列がありません。
次の例は、マーカーを様々な値に設定する方法を示しています:
ul { list-style-type: "★"; }
/* マーカーを「星」文字に設定 */

p.note {
  display: list-item;
  list-style-type: "Note: ";
  list-style-position: inside;
}
/* 注記段落に「Note: 」という文字列のマーカーを付与 */

ol { list-style-type: upper-roman; }
/* 全ての順序付きリストをupper-romanカウンタースタイルに設定
   (Counter Styles仕様[[CSS-COUNTER-STYLES]]で定義) */

ul { list-style-type: symbols(cyclic '○' '●'); }
/* 全ての順序なしリスト項目のマーカーを、空円と塗り円で交互に設定 */

ul { list-style-type: none; }
/* マーカーを完全に非表示にする。ただし有効なlist-style-imageが指定されている場合は除く。 */

3.5. マーカーの配置: list-style-position プロパティ

Name: list-style-position
Value: inside | outside
Initial: outside
Applies to: リスト項目
Inherited: yes
Percentages: n/a
Computed value: キーワード(ただし本文参照)
Canonical order: 文法順
Animation type: 離散的

このプロパティは::markerがインラインで描画されるか、 またはリスト項目のすぐ外側に配置されるかを指定します。 値は以下の通りです:

inside
特別な効果はありません。 (::markerはリスト項目内容の先頭にあるインライン要素です。)
outside
リスト項目ブロックコンテナの場合: マーカーボックスはブロックコンテナとなり、主ブロックボックスの外側に配置されます。 ただし、list-itemマーカーのフロートに隣接する位置は未定義です。 CSSはマーカーボックスの正確な位置や描画順を明確に規定しませんが、 ボックスのinline-start側に、 writing-modeで指定されたボックスの書字モードを用いて配置することを要求します。 マーカーボックスは主ブロックボックスのボーダーに固定され、主ボックスの内容と一緒にスクロールしません。 UAは、要素のoverflowvisible以外の場合、マーカーを非表示にすることがあります。 (この許可は将来的に変更される可能性があります) マーカーボックスのサイズや内容は、主ブロックボックスの高さやその最初のラインボックスの高さに影響を与えたり、 場合によっては新しいラインボックスの生成を引き起こすことがあります。 この相互作用も未定義です。

これはCSS2由来の曖昧な記述で、実際の定義が必要です。

リスト項目インラインボックスの場合: この値はinsideと同等です。

あるいは、outsideはマーカーを主インラインボックスの直前の兄弟要素としてレイアウトすることもできます。

例:
<style>
  ul.compact { list-style: inside; }
  ul         { list-style: outside; }
</style>
<ul class=compact>
  <li>first "inside" list item comes first</li>
  <li>second "inside" list item comes first</li>
</ul>
<hr>
<ul>
  <li>first "outside" list item comes first</li>
  <li>second "outside" list item comes first</li>
</ul>

上記の例は次のように整形される可能性があります:

  * first "inside" list
  item comes first
  * second "inside" list
  item comes second

========================

* first "outside" list
  item comes first
* second "outside" list
  item comes second

3.6. マーカーのスタイリング: list-style ショートハンドプロパティ

Name: list-style
値: <'list-style-position'> || <'list-style-image'> || <'list-style-type'>
初期値: 個々のプロパティを参照
適用対象: リスト項目
継承: 個々のプロパティを参照
パーセンテージ: 個々のプロパティを参照
算出値: 個々のプロパティを参照
アニメーション型: 個々のプロパティを参照
規範順序: 文法順

list-styleプロパティは、 list-style-typelist-style-imagelist-style-position の3つのプロパティをスタイルシート内で同時に設定するためのショートハンド記法です。

例:
ul { list-style: upper-roman inside }  /* すべての UL */
ul ul { list-style: circle outside } /* ULの子UL */

ショートハンドでnoneという値を使用する場合、nonelist-style-imagelist-style-type の両方に有効な値であるため、曖昧さが生じる可能性があります。 この曖昧さを解消するために、 ショートハンド内のnone値は、ショートハンドで他に設定されていない方のプロパティに適用されなければなりません。

list-style: none disc;
/* 画像は"none"、型は"disc"に設定 */

list-style: none url(bullet.png);
/* 画像は"url(bullet.png)"、型は"none"に設定 */

list-style: none;
/* 画像も型も"none"に設定 */

list-style: none disc url(bullet.png);
/* 構文エラー */

注: <counter-style> 型のlist-style-type値でも文法上の曖昧さが生じます。 これらの値は最終的に<custom-ident>値であるため、 [CSS-VALUES-3]の構文解析ルールが適用されます。

著者はlist-style情報を リスト項目要素(例:li HTML)に直接指定することもできますが、 注意して行うべきです。 次のようなルールを考えてみましょう:
ol.alpha li { list-style: lower-alpha; }
ul li       { list-style: disc; }

上記の方法では期待通りに動作しません。 もしulol class=alphaの中にネストすると、 最初のルールの詳細度によってulのリスト項目がlower-alphaスタイルになります。

ol.alpha > li { list-style: lower-alpha; }
ul > li       { list-style: disc; }

これらは意図通りに動作します。

ol.alpha { list-style: lower-alpha; }
ul       { list-style: disc; }

これらはさらに良く、継承によってlist-style値がリスト項目に伝わります。

3.7. marker-side プロパティ

Name: marker-side
値: match-self | match-parent
初期値: match-self
適用対象: リスト項目
継承: yes
パーセンテージ: n/a
算出値: 指定キーワード
規範順序: 文法順
アニメーション型: 離散的

marker-sideプロパティは、 outsideマーカーボックスが リスト項目自身(すなわち起点要素)の方向性で配置されるか、 リストコンテナ(つまり起点要素の親)の方向性で配置されるかを指定します。 前者の場合、リスト内の各項目ごとに方向性で位置が異なることがあります。 後者の場合はリスト全体に割り当てられた方向性に従ってすべて同じ側に揃います。

match-self
マーカーボックスは、 ::marker起点要素の方向性で配置されます。
match-parent
マーカーボックスは、 ::marker起点要素の親要素の方向性で配置されます。
デフォルトでは、要素や::marker疑似要素はリスト項目の方向性に従って自分自身を配置します。 しかし、リスト項目が異なる方向性(例えばHTMLの<ol>内で"dir"属性が異なる複数の<li>)でグループ化されている場合、 全てのマーカーを同じ側に揃えた方が便利な場合があります。 そのため著者は一つの「ガター」を指定し、 すべてのマーカーがそのガターに揃い、見えるようにできます。

以下の2つのレンダリング例は、次のHTMLから生成されます。違いはリスト上のmarker-side値のみです:

<ul>
  <li>english one
  <li dir=rtl>OWT WERBEH
  <li>english three
  <li dir=rtl>RUOF WERBEH
</ul>
match-self match-parent
* english one
     OWT WERBEH *
* english three
    RUOF WERBEH *
* english one
*    OWT WERBEH
* english three
*   RUOF WERBEH

この順序でマーカー内の句読点を正しく配置するには、 親のdirection値も考慮する必要があります。 <https://github.com/w3c/csswg-drafts/issues/4202>

キーワードの名称変更や キーワードのリネームlist-style-positionとの統合 に関する課題がオープンです。

4. カウンターによる自動番号付け

カウンターは、 CSSでリスト項目を自動的に番号付けするなどの用途で使われる特別な数値トラッカーです。 すべての要素は0個以上のカウンターを持っており、 文書ツリー内でプロパティ値の継承と同様の方法で継承されます。カウンターには、 カウンターを識別するnamecreator、 そして整数のvalueがあります。 これらは カウンタープロパティcounter-incrementcounter-setcounter-reset)で作成・操作され、 counter()counters()という 関数記法で利用されます。

CSS構文ではカウンターは <counter-name>型で参照されます。 これは名前を<custom-ident>として表します。 <counter-name>名はキーワードnoneと一致してはなりません。 そのような識別子は<counter-name>として無効です。

ある要素でカウンター値を解決するには、以下の手順を踏みます:

  1. 既存のカウンターが前の要素から継承される。

  2. 新しいカウンターがインスタンス化される(counter-reset)。

  3. カウンター値がインクリメントされる(counter-increment)。

  4. カウンター値が明示的に設定される(counter-set)。

  5. カウンター値が利用される(counter()/counters())。

UAはカウンターの最大値や最小値に実装依存の制限を設ける場合があります。 リセット・設定・インクリメントによって値がその範囲を超える場合、 値はその範囲にクランプされなければなりません。

4.1. カウンターの作成: counter-reset プロパティ

名前: counter-reset
値: [ <counter-name> <integer>? ]+ | none
初期値: none
適用対象: すべての要素
継承: no
パーセンテージ: n/a
算出値: キーワードnoneまたは、各項目が識別子と整数のペアとなるリスト
規範順序: 文法順
アニメーション型: 算出値型による

ユーザーエージェントは、非視覚メディアを含む全てのメディアでこのプロパティをサポートすることが期待されています。

counter-resetプロパティは、要素上に新しいカウンターインスタンス化し、指定された整数値に設定します。 その値は以下の通り定義されます:

none
この要素は新しいカウンターを作成しません。
<counter-name> <integer>?
指定された<counter-name>のカウンターを、 指定された<integer>で初期化します。省略時は0です。
カウンタープロパティは通常のカスケード規則に従います。 したがって、以下のスタイルシートでは:
h1 { counter-reset: section -1 }
h1 { counter-reset: imagenum 99 }

imagenumのみをリセットします。 両方のカウンターをリセットするには、同時に指定する必要があります:

H1 { counter-reset: section -1 imagenum 99 }

同じ原則はcounter-setcounter-incrementにも適用されます。 [css-cascade-4]を参照。

同じ<counter-name>がプロパティ値内に複数回現れる場合、 最後に指定されたもののみが有効となります。

4.2. カウンター値の操作: counter-increment および counter-setプロパティ

名前: counter-increment
値: [ <counter-name> <integer>? ]+ | none
初期値: none
適用対象: すべての要素
継承: no
パーセンテージ: n/a
算出値: キーワードnoneまたは、各項目が識別子と整数のペアとなるリスト
規範順序: 文法順
アニメーション型: 算出値型による

ユーザーエージェントは、非視覚メディアを含む全てのメディアでこのプロパティをサポートすることが期待されています。

名前: counter-set
値: [ <counter-name> <integer>? ]+ | none
初期値: none
適用対象: すべての要素
継承: no
パーセンテージ: n/a
算出値: キーワードnoneまたは、各項目が識別子と整数のペアとなるリスト
規範順序: 文法順
アニメーション型: 算出値型による

ユーザーエージェントは、非視覚メディアを含む全てのメディアでこのプロパティをサポートすることが期待されています。

counter-incrementおよびcounter-set プロパティは 既存のカウンターの値を操作します。 これらは、要素上にまだ同名のカウンターが存在しない場合のみ新しいカウンターをインスタンス化します。 それぞれの値は次の通りです:

none
この要素はどのカウンターの値も変更しません。
<counter-name> <integer>?
counter-setの場合は値を設定、 counter-incrementの場合は値を加算) 要素上の指定されたカウンターの値を、指定された<integer>に設定/加算します。 <integer>が省略された場合、 1counter-incrementの場合)、 0counter-setの場合)がデフォルトです。

要素上に同名のカウンターが現時点で存在しない場合、 0で新しいカウンターをインスタンス化してから値を設定/加算します。

この例は「Chapter 1」「1.1」「1.2」などのように章や節に番号を付ける方法を示します。

h1::before {
    content: "Chapter " counter(chapter) ". ";
    counter-increment: chapter;  /* Chapterに1加算 */
    counter-reset: section;      /* sectionを0にリセット */
}
h2::before {
    content: counter(chapter) "." counter(section) " ";
    counter-increment: section;
}

同じ<counter-name>がプロパティ値内に複数回現れる場合、 すべて順番に処理されます。 したがってインクリメントは累積されますが、設定値は最後のもののみが有効です。

4.3. ネストされたカウンターとスコープ

カウンターは「自己ネスト」されます。親から同名のカウンターを継承した要素で新しいカウンターをインスタンス化すると、既存カウンターの内側に同名の新しいカウンターが作られます。 これはHTMLのリストのように、リストが任意の深さでネストされる状況で重要です。 各レベルごとにユニークなカウンター名を定義するのは不可能だからです。 counter()関数は指定された名前の最も内側のカウンターだけを取得し、 counters()関数は要素を含む同名カウンターをすべて利用します。

カウンタースコープは、文書中で最初にインスタンス化された要素から始まり、 その要素の子孫と、その後続の兄弟とその子孫を含みます。 ただし、同名カウンターを後続兄弟要素でcounter-resetで新規作成した場合、 それらのスコープには含まれません。これにより、後続兄弟による明示的なカウンター生成が先行兄弟を隠すことができます。

カウンターとその値のスコープを厳密に定義する規則については§ 4.4 カウンターの作成と継承を参照してください。

次のコードはネストされたリスト項目に番号を付与します。 結果はLI要素にdisplay:list-itemlist-style: insideを設定した場合と非常に似ています:
ol { counter-reset: item }
li { display: block }
li::before { content: counter(item) ". "; counter-increment: item }

この例では、 olがカウンターを作成し、 olのすべての子がそのカウンターを参照します。

n番目のitemカウンターを itemnと表すと、 以下のHTML断片は示されたカウンターを利用します。

<ol> item0が作成され、0に設定される
<li> item0が1に加算される
<li> item0が2に加算される
<ol> item1が作成され、item0の内側に0でネストされる
<li> item1が1に加算される
<li> item1が2に加算される
<li> item1が3に加算される
<ol> item2が作成され、item1の内側に0でネストされる
<li> item2が1に加算される
</ol>
<li> item1が4に加算される
<ol> item3が作成され、item1の内側に0でネストされる
<li> item3が1に加算される
</ol>
<li> item1が5に加算される
</ol>
<li> item0が3に加算される
<li> item0が4に加算される
</ol>
<ol> item4が作成され、0に設定される
<li> item4が1に加算される
<li> item4が2に加算される
</ol>

4.4. カウンターの作成と継承

文書内の各要素または疑似要素は、 その要素のカウンター(空の場合もある)をスコープとして持っています。 これは他の要素からの継承または直接要素上でインスタンス化されたものです。 これらのカウンターはCSSカウンター集合として表現されます。 集合の各値は タプルです: 文字列 (カウンターの名前を表す)、 要素(カウンターの作成者を表す)、 整数(カウンターのを表す)。 その集合内で指定された名前の最新のカウンターが その名前の最も内側のカウンターを表します。

4.4.1. カウンターの継承

要素は親と直前の兄弟から初期カウンター集合を継承します。 その後、それらのカウンターの値は一致するカウンターを持つ直前のツリー順の要素(親、直前兄弟、または前兄弟の子孫である場合もある)から取得します。 カウンターの継承elementに対して行う:
  1. もしelementが文書ツリーのルートなら、 要素は初期状態で空のCSSカウンター集合を持ちます。 終了。

  2. element counterselement自身のCSSカウンター集合を表す)を elementの親要素のCSSカウンター集合のコピーとする。

  3. sibling counterselementの直前兄弟のCSSカウンター集合とし(兄弟がなければ空のCSSカウンター集合)とする。

    sibling counterscounterについて、 element countersに同じ名前のカウンターがなければ、 counterのコピーをelement countersに追加する。

  4. value sourceelementの直前のCSSカウンター集合ツリー順で直前の要素)とする。

    value sourcesource counterについて、 element countersが同じ名前作成者を持つカウンターを含む場合、 そのカウンターのsource counterに設定する。

次のコードを例にします:
<ul style='counter-reset: example 0;'>
  <li id='foo' style='counter-increment: example;'>
    foo
    <div id='bar' style='counter-increment: example;'>bar</div>
  </li>
  <li id='baz'>
    baz
  </li>
</ul>

ツリー順は文書ツリーを順序付きリストに変換し、 要素は自身の子より前に現れ、子は次兄弟より前に現れます。 つまりHTMLのような言語では、 パーサが文書を読む際に開始タグに遭遇する順序です。

この例では ul 要素がexampleという新しいカウンターを作成し、その値を0に設定します。 #foo要素は ul の最初の子なので、このカウンターを継承します。 親は同時にツリー順でも直前要素なので、 値0も継承し、直後に値を1へインクリメントします。

#bar要素も同様です。 exampleカウンターを#fooから継承し、 値1も継承して2にインクリメントします。

しかし、#baz要素は少し異なります。 exampleカウンターを直前兄弟の#fooから継承します。 しかし値は#foo1ではなく、 ツリー順で直前要素の#bar2を継承します。

この挙動により、文書全体で単一のカウンターを使い続け、ネスト構造を意識せずに連続的インクリメントが可能になります。

注: 通常のCSS継承と同じく、 カウンター継承は[DOM]の「フラット化要素ツリー」上で動作します。

4.4.2. カウンターのインスタンス化

カウンターインスタンス化されます。 これはcounter-resetで名前付き指定時、 またはcounter-incrementcounter-setcounter()counters()記法で未定義名指定時にも発生します。 (新しくインスタンス化されたカウンターは 直前兄弟由来の同名カウンターを置換しますが、 祖先由来の同名カウンターには追加されます。 § 4.3 ネストされたカウンターとスコープ参照。) カウンターをインスタンス化する(nameelement、初期value):
  1. counterselementCSSカウンター集合とする。

  2. 最後のname名のカウンターcountersから探し、innermost counterとする。 もしinnermost counterの起源要素がelementまたはelementの直前兄弟なら、 countersからinnermost counterを削除する。

  3. countersに新しいカウンター(name:name, 起源要素:element, 初期値:value)を追加。

4.5. ボックスを生成しない要素のカウンター

ボックスを生成しない要素 (例:displaynoneの要素、またはcontentnoneの疑似要素)は、 カウンターの設定・リセット・インクリメントはできません。 カウンタープロパティ自体は有効ですが、効果はありません。

次のスタイルシートでは、 "secret"クラスのH2はcount2をインクリメントしません。
h2 { counter-increment: count2; }
h2.secret { display: none; }

注: visibilityhiddenに設定するなど、他の「非表示」手法では 要素はボックスを生成するため、ここには該当しません。

HTMLの option やSVG rect など、置換要素の子孫がカウンターを設定・リセット・インクリメントできるかは未定義です。

注: 置換要素の子孫に関する挙動は、実装間で互換性がないため現在未定義です。

4.6. 暗黙的なlist-itemカウンター

著者がスタイルで明示的に定義したカウンターに加えて、 リスト項目は 特別なlist-itemカウンターを自動的にインクリメントします。 これはリスト項目のデフォルトマーカー文字列生成時(list-style-type参照)に使われます。

具体的には、 counter-incrementプロパティが list-itemカウンターに明示的なインクリメント値を指定しない限り、 すべてのリスト項目カウンターと同じタイミングで 1ずつインクリメントされなければなりません (つまりリスト項目list-item 1counter-increment値の末尾に追加した場合と同じ挙動、必要なら新しいカウンターのインスタンス化も含む)。 これはcounter-increment指定値算出値には影響しません。

リスト項目は自動的にlist-itemカウンターを1ずつインクリメントするため、 数値型のlist-style-typeを持つ連続したリスト項目は、著者がcounter-incrementcounter-increment: itemnumbernoneのような他の値に設定していても、デフォルトで順番に番号付けされます。 これは、自動list-itemカウンターが他のカウンター用の宣言によって意図せず上書きされるのを防ぎます。

ただし、自動list-itemインクリメントは、 リスト項目counter-incrementlist-itemカウンターを明示的に指定した場合は発生しませんli { counter-increment: list-item 2; }は指定通りlist-itemを2ずつインクリメントし、 list-item 1が無条件で追加された場合の3にはなりません。

また、明示的に上書きすることで自動list-itemカウンターのインクリメントを無効化することもできます。例えば、counter-increment: list-item 0;のようにします。

その他の挙動については、list-itemカウンターは他のカウンター同様に 著者がスタイリング調整や他用途で利用・操作できます。

次の例では、リストを2ずつカウントアップするように変更しています:

ol.evens > li { counter-increment: list-item 2; }

3項目のリストは次のように描画されます:

2. First Item
4. Second Item
6. Third Item

UAやホスト言語は UAスタイルシートや表示ヒントスタイルマッピングで list-itemカウンター値が デフォルトでホスト言語のセマンティクスに従った数値となるようにすべきです。 詳細は付録A:HTML用サンプルスタイルシート参照。

次の例では、 content プロパティで階層番号を作り、 list-itemカウンターに連動しています。 これによりHTMLによる番号変更にも対応します:
ol > li::marker { content: counters(list-item,'.') '.'; }

このルールでネストしたリストは次のように描画されます:

1. First top-level item
5. Second top-level item, value=5
   5.3. First second-level item, list start=3
   5.4. Second second-level item, list start=3
        5.4.4. First third-level item in reversed list
        5.4.3. Second third-level item in reversed list
        5.4.2. Third third-level item in reversed list
        5.4.1. Fourth third-level item in reversed list
   5.5. Third second-level item, list start=3
6. Third top-level item

以下のようなマークアップを与えた場合:

<ol>
  <li>First top-level item
  <li value=5>Second top-level item, value=5
    <ol start=3>
      <li>First second-level item, list start=3
      <li>Second second-level item, list start=3
        <ol reversed>
          <li>First third-level item in reversed list
          <li>Second third-level item in reversed list
          <li>Third third-level item in reversed list
          <li>Fourth third-level item in reversed list
        </ol>
    </ol>
  <li>Third second-level item, list start=3
  <li>Third top-level item
</ol>

4.7. カウンターの出力:counter()およびcounters()関数

カウンターはそれ自体では表示効果を持ちませんが、 counter()およびcounters()関数と組み合わせて値を利用できます。 これらの使用値は、カウンター値を文字列または画像として表現します。 それぞれ以下のように定義されます:

<counter> = <counter()> | <counters()>
counter()  =  counter( <counter-name>, <counter-style>? )
counters() = counters( <counter-name>, <string>, <counter-style>? )

ここで<counter-style>は、 指定されたカウンターのカウンタースタイルを指定し、 カウンター表現生成に使われます。 詳細は[css-counter-styles-3]に定義されています。

counter()
要素のCSSカウンター集合内で指定された名前の最も内側カウンターの値を、 指定されたカウンタースタイルを用いて <counter-style>で表現します。
counters()
要素のCSSカウンター集合内で指定された名前のカウンター値すべてを、 指定されたカウンタースタイルを用いて <counter-style>で表現し、 外側から内側順に並べて指定した<string>で結合します。

どちらの場合も、 <counter-style> 引数が省略された場合はdecimalがデフォルトです。

要素上に指定名のカウンターが存在しない場合、 counter()counters()を使う際は、 まず初期値0インスタンス化されます。

H1::before        { content: counter(chno, upper-latin) ". " }
/* "A. A History of Discontent" のような見出しを生成 */

H2::before        { content: counter(section, upper-roman) " - " }
/* "II - The Discontent Part" のような見出しを生成 */

BLOCKQUOTE::after { content: " [" counter(bq, decimal) "]" }
/* "... [3]" のような引用部分を生成 */

DIV.note::before  { content: counter(notecntr, disc) " " }
/* div.note の前に単純に丸印を生成 */

P::before         { content: counter(p, none) }
/* 何も挿入されない */
次の例はcounters()関数の簡単な使い方を示します:
<ul>
  <li>one</li>
  <li>two
    <ul>
      <li>nested one</li>
      <li>nested two</li>
    </ul>
  </li>
  <li>three</li>
</ul>
<style>
li::marker { content: '(' counters(list-item,'.') ') '; }
</style>

この文書の表示例:

(1) one
(2) two
   (2.1) nested one
   (2.2) nested two
(3) three
カウンターは兄弟間でも継承されるため、 入れ子でない見出しや小見出しの番号付けにも使えます。 ただしこのため、兄弟カウンターは入れ子にならずcounters()は使えませんが、 複数カウンターを作成して手動で連結することで同様の効果が得られます:
<h1>First H1</h1>
...
<h2>First H2 in H1</h2>
...
<h2>Second H2 in H1</h2>
...
<h3>First H3 in H2</h3>
...
<h1>Second H1</h1>
...
<h2>First H2 in H1</h2>
...
<style>
body { counter-reset: h1 h2 h3; }
h1   { counter-increment: h1; counter-reset: h2 h3;}
h2   { counter-increment: h2; counter-reset:    h3; }
h3   { counter-increment: h3; }
h1::before { content: counter(h1,upper-alpha) ' '; }
h2::before { content: counter(h1,upper-alpha) '.'
                      counter(h2,decimal) ' '; }
h3::before { content: counter(h1,upper-alpha) '.'
                      counter(h2,decimal) '.'
                      counter(h3,lower-roman) ' '; }
</style>

この文書の表示例:

A First H1
...
A.1 First H2 in H1
...
A.2 Second H2 in H1
...
A.2.i First H3 in H2
...
B Second H1
...
B.1 First H2 in H1
...
カウンターはマーカー以外にも有用な場合があります。 一般的に、要素を連番で番号付けできるので、他のプロパティで参照する際にも役立ちます。 例えば、orderプロパティを使って、 特定の2つの要素の間に挿入するには、現状すべての要素にorderを個別に指定する必要があります。 もし全ての要素のorder値をカウンターで設定できれば、 任意の位置に要素をより簡単に挿入できます。

他のユースケースとしては、入れ子や兄弟要素に対して異なるtransform値を少しずつずらして使いたい場合などがあります。 現状はプリプロセッサを使うしかありませんが、カウンターがあれば「素の」CSSでもうまく動作します。

(入れ子の場合はカスタムプロパティとcalc()を重ねて順次値を作ることもできますが、 兄弟には使えませんし少し煩雑です。)

提案:counter-value(<counter-name>) 関数を追加し、これはカウンターの値を整数として返すようにします(文字列ではなく)。

Issue 1026を参照。

付録A:HTML用サンプルスタイルシート

このセクションは参考用であり、規範的ではありません。 [HTML]Rendering章が HTMLリストに適用される規範的なデフォルトプロパティを定義しています。 このサンプルスタイルシートはCSSの機能を なじみのあるマークアップ慣例で示すためのものです。

CSSでol[reversed]リスト番号付けをどうサポートするか議論中です。 Issue 4181参照。

/* リスト項目のセットアップ */
li {
  display: list-item; /* 'counter-increment: list-item' を暗黙的に含む */
}

/* ol, ulでlist-itemカウンターのスコープを設定 */
ol, ul {
  counter-reset: list-item;
}

/* リストのデフォルトスタイルタイプ */
ol { list-style-type: decimal; }
ul { list-style-type: toggle(disc, circle, square); }

/* ol, ul要素のtype属性 */
ul[type="disc"]   { list-style-type: disc;   }
ul[type="circle"] { list-style-type: circle; }
ul[type="square"] { list-style-type: square; }
ol[type="1"] { list-style-type: decimal;     }
ol[type="a"] { list-style-type: lower-alpha; }
ol[type="A"] { list-style-type: upper-alpha; }
ol[type="i"] { list-style-type: lower-roman; }
ol[type="I"] { list-style-type: upper-roman; }

/* ol要素のstart属性 */
ol[start] {
  counter-reset: list-item calc(attr(start integer, 1) - 1);
}

/* li要素のvalue属性 */
li[value] {
  counter-set: list-item attr(value integer, 1);
}


/* ボックスモデルルール */
ol, ul {
  display: block;
  margin-block: 1em;
  marker-side: match-parent;
  padding-inline-start: 40px;
}
ol ol, ol ul, ul ul, ul ol {
  margin-block: 0;
}

li {
  text-align: match-parent;
}

謝辞

この仕様は以下の方々の意見により実現しました: Aharon Lanin, Arron Eicholz, Brad Kemper, David Baron, Emilio Cobos Álvarez, Mats Palmgren, Oriol Brufau, Simon Sapin, Xidorn Quan

変更履歴

このセクションでは、以前の公開以降の変更点を記録しています。

2020年7月9日WD以降の変更

2019年8月17日WD以降の変更

2019年4月25日WD以降の変更

2014年3月20日WD以降の変更

CSS Level 2からの変更点

はじめにの章に記載の通り、このモジュールはCSS2.1と比べて重要な変更を含みます。

  1. ::marker疑似要素が導入され、リストマーカーを直接スタイリングできるようになりました。
  2. list-style-typeは、<string>および<counter-style>の拡張値を受け付けるようになりました。
  3. list-itemの事前定義カウンター識別子が導入されました。
  4. counter-setプロパティが追加されました。
  5. インラインレベルリスト項目も許可されるようになりました([CSS-DISPLAY-3]参照)。

適合性

文書の慣例

適合性要件は、記述的な主張とRFC 2119用語の組み合わせで表現されています。規範部分で使われている「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」のキーワードは、RFC 2119で定義された通りに解釈されます。 ただし、可読性のため、これらの語は本仕様中ですべて大文字にはしていません。

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

この仕様の例は、「例えば」という語で始めるか、class="example"で規範テキストから区別されています。例えば:

これは参考用の例です。

参考注記は「Note」で始まり、class="note"で規範テキストから区別されています。例えば:

注:これは参考用の注記です。

アドバイスは注意を促すためにスタイルされた規範セクションであり、<strong class="advisement">で他の規範文と区別されています。例えば: UAはアクセシブルな代替手段を提供しなければなりません。

適合クラス

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

スタイルシート
CSSスタイルシート
レンダラー
UA(スタイルシートのセマンティクスを解釈し、利用する文書をレンダリングするもの)。
オーサリングツール
UA(スタイルシートを書き出すもの)。

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

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

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

部分的な実装

著者が将来互換のパーシング規則を活用してフォールバック値を指定できるようにするため、CSSレンダラーは、利用可能なレベルのサポートがない at-rule、プロパティ、プロパティ値、キーワード、およびその他の構文要素を無効として扱い(適宜無視)、特にユーザーエージェントは単一の複数値プロパティ宣言内で未サポート値だけを選択的に無視し、サポートされている値だけを適用することをしてはなりません。いずれかの値が無効(未サポート値は必ず)と見なされる場合、CSSでは宣言全体が無視されなければなりません。

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

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

非実験的実装

仕様が候補勧告(CR)段階に到達すると、非実験的な実装が可能となり、実装者は仕様通りに正しく実装できたことを示せるCRレベルの機能について、プレフィックスなしの実装を公開すべきです。

CSSの実装間の互換性を確立・維持するため、CSS作業グループは、非実験的CSSレンダラーに対し、CSS機能のプレフィックスなし実装を公開する前に、実装報告(および必要に応じてその実装報告に用いたテストケース)をW3Cに提出することを要請します。W3Cに提出されたテストケースはCSS作業グループによる審査・修正の対象となります。

テストケースと実装報告の提出方法については、CSS作業グループのウェブサイト https://www.w3.org/Style/CSS/Test/ を参照してください。 質問は public-css-testsuite@w3.org メーリングリストまで。

索引

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

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

参考文献

規範参考文献

[CSS-CASCADE-4]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 4. 2020年8月18日. 作業草案(WD). URL: https://www.w3.org/TR/css-cascade-4/
[CSS-CONTENT-3]
Elika Etemad; Dave Cramer. CSS Generated Content Module Level 3. 2019年8月2日. 作業草案(WD). URL: https://www.w3.org/TR/css-content-3/
[CSS-COUNTER-STYLES-3]
Tab Atkins Jr.. CSS Counter Styles Level 3. 2017年12月14日. 勧告候補(CR). URL: https://www.w3.org/TR/css-counter-styles-3/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2020年5月19日. 勧告候補(CR). URL: https://www.w3.org/TR/css-display-3/
[CSS-FLEXBOX-1]
Tab Atkins Jr.; et al. CSS Flexible Box Layout Module Level 1. 2018年11月19日. 勧告候補(CR). URL: https://www.w3.org/TR/css-flexbox-1/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3. 2019年10月10日. 勧告候補(CR). URL: https://www.w3.org/TR/css-images-3/
[CSS-IMAGES-4]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Image Values and Replaced Content Module Level 4. 2017年4月13日. 作業草案(WD). URL: https://www.w3.org/TR/css-images-4/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2020年6月3日. 作業草案(WD). URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; 他. CSS Positioned Layout Module Level 3. 2020年5月19日. 作業草案(WD). URL: https://www.w3.org/TR/css-position-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2019年2月25日. 作業草案(WD). URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2019年7月16日. 勧告候補(CR). URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2020年4月29日. 作業草案(WD). URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-4]
Elika Etemad; 他. CSS Text Module Level 4. 2019年11月13日. 作業草案(WD). URL: https://www.w3.org/TR/css-text-4/
[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/
[CSS-VARIABLES-1]
Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2015年12月3日. 勧告候補(CR). URL: https://www.w3.org/TR/css-variables-1/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2019年12月10日. 勧告(REC). URL: https://www.w3.org/TR/css-writing-modes-3/
[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/
[CSS2]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. 勧告(REC). URL: https://www.w3.org/TR/CSS21/
[DOM]
Anne van Kesteren. DOM Standard. リビングスタンダード. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; 他. HTML Standard. リビングスタンダード. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. リビングスタンダード. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. 現行ベストプラクティス. URL: https://tools.ietf.org/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2018年11月21日. 作業草案(WD). URL: https://www.w3.org/TR/selectors-4/
[SVG2]
Amelia Bellamy-Royds; 他. Scalable Vector Graphics (SVG) 2. 2018年10月4日. 勧告候補(CR). URL: https://www.w3.org/TR/SVG2/

参考参考文献

[CSS-ANIMATIONS-1]
Dean Jackson; 他. CSS Animations Level 1. 2018年10月11日. 作業草案(WD). URL: https://www.w3.org/TR/css-animations-1/
[CSS-COLOR-3]
Tantek Çelik; Chris Lilley; David Baron. CSS Color Module Level 3. 2018年6月19日. 勧告(REC). URL: https://www.w3.org/TR/css-color-3/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley. CSS Color Module Level 4. 2019年11月5日. 作業草案(WD). URL: https://www.w3.org/TR/css-color-4/
[CSS-FONTS-3]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 3. 2018年9月20日. 勧告(REC). URL: https://www.w3.org/TR/css-fonts-3/
[CSS-TRANSITIONS-1]
David Baron; 他. CSS Transitions. 2018年10月11日. 作業草案(WD). URL: https://www.w3.org/TR/css-transitions-1/

プロパティ一覧

名前 初期値 適用対象 継承 %ages アニメーション型 規範順序 算出値
counter-increment [ <counter-name> <integer>? ]+ | none none すべての要素 no n/a 算出値型による 文法順 キーワードnoneまたは各項目が識別子と整数のペアとなるリスト
counter-reset [ <counter-name> <integer>? ]+ | none none すべての要素 no n/a 算出値型による 文法順 キーワードnoneまたは各項目が識別子と整数のペアとなるリスト
counter-set [ <counter-name> <integer>? ]+ | none none すべての要素 no n/a 算出値型による 文法順 キーワードnoneまたは各項目が識別子と整数のペアとなるリスト
list-style <'list-style-position'> || <'list-style-image'> || <'list-style-type'> 個々のプロパティ参照 リスト項目 個々のプロパティ参照 個々のプロパティ参照 個々のプロパティ参照 文法順 個々のプロパティ参照
list-style-image <image> | none none リスト項目 yes n/a 離散的 文法順 キーワードnoneまたは算出された<image>
list-style-position inside | outside outside リスト項目 yes n/a 離散的 文法順 キーワード(本文参照)
list-style-type <counter-style> | <string> | none disc リスト項目 yes n/a 離散的 文法順 指定値
marker-side match-self | match-parent match-self リスト項目 yes n/a 離散的 文法順 指定キーワード

課題一覧

white-space: preは完全に望ましい挙動ではありません。text-space-collapse: preserve-spaces + text-space-trim: discard-after の方がもっと必要な動作に近いかもしれません。 詳細はIssue 4448およびIssue 4891参照。
これはCSS2由来の曖昧な記述で、実際の定義が必要です。
もしくは、outsideを主インラインボックスの直前兄弟としてマーカーをレイアウトすることもできます。
この順序でマーカー内の句読点を正しく配置するには、 親のdirection値も考慮する必要があります。 <https://github.com/w3c/csswg-drafts/issues/4202>
キーワードの名称変更やリネームlist-style-positionとの統合に関する課題がオープンです。
カウンターはマーカー以外にも有用な場合があります。 一般的に、要素を連番で番号付けできるので、他のプロパティで参照する際にも役立ちます。 例えば、orderプロパティを使って 特定の2つの要素の間に挿入するには、現状すべての要素にorderを個別に指定する必要があります。 もし全ての要素のorder値をカウンターで設定できれば、 任意の位置に要素をより簡単に挿入できます。

他のユースケースとしては、入れ子や兄弟要素に対して異なるtransform値を少しずつずらして使いたい場合などがあります。 現状はプリプロセッサを使うしかありませんが、カウンターがあれば「素の」CSSでもうまく動作します。

(入れ子の場合はカスタムプロパティとcalc()を重ねて順次値を作ることもできますが、 兄弟には使えませんし少し煩雑です。)

提案:counter-value(<counter-name>)関数を追加し、これはカウンターの値を整数として返すようにします(文字列ではなく)。

Issue 1026参照。

ol[reversed]リスト番号付けをCSSでどうサポートするか議論中です。 Issue 4181参照。