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 表示型、 およびマーカーの配置とスタイルを制御するいくつかのプロパティを定義します。

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

たとえば、次の例は、 マーカーを使用して番号付きリスト項目のそれぞれを括弧で囲む方法を示しています:
<style>
li::marker { content: "(" counter(list-item, lower-roman) ")"; }
li { display: list-item; }
</style>
<ol>
  <li>これは最初の項目です。
  <li>これは2番目の項目です。
  <li>これは3番目の項目です。
</ol>

次のような結果になるはずです:

  (i) これは最初の項目です。
 (ii) これは2番目の項目です。
(iii) これは3番目の項目です。

注: この例は通常 HTML で必要とされるよりもはるかに冗長であることに注意してください。 必要なスタイルの大部分は UA のデフォルトスタイルシートが処理するためです。

子孫セレクターと子セレクターを使用すると、 ネストされたリストの深さに応じて異なるマーカー型を指定できます。

1.1. 値の定義

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

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

2. リスト項目の宣言

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

3. マーカー

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

3.1. ::marker 疑似要素

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

この例では、マーカーを使用して「注」と指定された段落に 番号を付けます:
<style>
p { margin-left: 12 em; }
p.note {
  display: list-item;
  counter-increment: note-counter;
}
p.note::marker {
  content: "注 " counter(note-counter) ":";
}
</style>
<p>これはこの文書の最初の段落です。
<p class="note">これは非常に短い文書です。
<p>これで終わりです。

次のようにレンダリングされるはずです:

        これはこの文書の最初の段落
        です。

注 1: これは非常に短い
        文書です。

        これで終わりです。
::marker 疑似要素を使用することで、 リストのマーカーを リスト項目自体のテキストとは独立してスタイル設定できます:
<style>
p { margin-left: 8em } /* カウンター用の空間を確保 */
li { list-style-type: lower-roman; }
li::marker { color: blue; font-weight:bold; }
</style>
<p>これは前にある長い段落です ...
<ol>
  <li>これは最初の項目です。
  <li>これは2番目の項目です。
  <li>これは3番目の項目です。
</ol>
<p>これは後にある長い段落です ...

上記の文書は、次のようにレンダリングされるはずです:

       これは前にある長い
       段落です ...

  i.   これは最初の項目です。
 ii.   これは2番目の項目です。
iii.   これは3番目の項目です。

       これは後にある長い
       段落です ...

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

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

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

すべてのプロパティは ::marker 疑似要素に設定でき、 算出値を持ちます。 ただし、 実際に マーカーボックスに適用される CSS プロパティは次のものだけです:

将来の仕様では、このプロパティ一覧が拡張されることが想定されています。 ただし現時点では outside マーカーボックスのレイアウトが完全には定義されていないため、 これらのプロパティのみが許可されています。

その他のプロパティは、カスケード作成者オリジンで設定された場合、 マーカーボックスに影響を与えてはなりません。 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起点要素上で マーカー画像を定義している
'マーカーボックスには、 指定された マーカー画像を表す 匿名インライン 置換要素が含まれ、 その後に単一の空白(U+0020 SPACE)からなる テキストランが続きます。
list-style-type起点要素上で マーカー文字列を定義している
マーカーボックスには、 指定された マーカー文字列からなる テキストランが含まれます。
それ以外
マーカーボックスには内容がなく、 ::marker はボックスを生成しません。

さらに、UA は保持された 強制改行を 空白に変換するか破棄してもかまいません。

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

名前: list-style-image
値: <image> | none
初期値: none
適用対象: リスト項目
継承: する
パーセンテージ: 該当なし
算出値: キーワード none または算出された <image>
正規順序: 文法に従う
アニメーション型: 離散

マーカー 画像を指定します。 これは、リスト項目contentnormal のとき、その マーカーを満たすために使用されます。 値は次のとおりです:

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

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

名前: list-style-type
値: <counter-style> | <string> | none
初期値: disc
適用対象: リスト項目
継承: する
パーセンテージ: 該当なし
算出値: 指定値
正規順序: 文法に従う
アニメーション型: 離散

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

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

具体的には、 マーカー文字列は、 指定された <counter-style>を使用して list-item カウンター値の カウンター表現を生成した結果であり、 その前に <counter-style>接頭辞が付き、 その後に <counter-style>接尾辞が続きます。 指定された <counter-style> が存在しない場合、decimal が 使用されるものとします。

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

p.note {
  display: list-item;
  list-style-type: "注: ";
  list-style-position: inside;
}
/* 注の段落に文字列「注: 」からなるマーカーを与える */

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 プロパティ

名前: list-style-position
値: inside | outside
初期値: outside
適用対象: リスト項目
継承: する
パーセンテージ: 該当なし
算出値: キーワード。ただし本文を参照
正規順序: 文法に従う
アニメーション型: 離散

このプロパティは、::marker をインラインでレンダリングするか、 リスト 項目のすぐ外側に配置するかを指定します。 値は次のとおりです:

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

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

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

代わりに、outside は、マーカーを主要インラインボックスの 直前の兄弟としてレイアウトすることも考えられます。

たとえば:
<style>
  ul.compact { list-style: inside; }
  ul         { list-style: outside; }
</style>
<ul class=compact>
  <li>最初の "inside" リスト項目が最初に来る</li>
  <li>2番目の "inside" リスト項目が最初に来る</li>
</ul>
<hr>
<ul>
  <li>最初の "outside" リスト項目が最初に来る</li>
  <li>2番目の "outside" リスト項目が最初に来る</li>
</ul>

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

  * 最初の "inside" リスト
  項目が最初に来る
  * 2番目の "inside" リスト
  項目が2番目に来る

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

* 最初の "outside" リスト
  項目が最初に来る
* 2番目の "outside" リスト
  項目が2番目に来る

3.6. マーカーのスタイル設定: list-style 一括指定 プロパティ

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

list-style プロパティは、 list-style-typelist-style-image、および list-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 値は、その一括指定によって他の方法で設定されていない 2つのプロパティのいずれかに適用されなければなりません。

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);
/* 構文エラー */

注: list-style-type<counter-style> 値も文法上の曖昧さを生じさせる可能性があります。 このような値は最終的に <custom-ident> 値であるため、 [CSS-VALUES-3] の構文解析規則が適用されます。

作成者は list-style 情報をリスト項目要素 (たとえば HTML の li) に直接指定できますが、 注意して行うべきです。 次の規則を考えてみます:
ol.alpha li { list-style: lower-alpha; }
ul li       { list-style: disc; }

上記は期待どおりには動作しません。 ol class=alpha の中に ul をネストすると、 最初の規則の詳細度によって、その 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 プロパティ

名前: marker-side
値: match-self | match-parent
初期値: match-self
適用対象: リスト項目
継承: する
パーセンテージ: 該当なし
算出値: 指定されたキーワード
正規順序: 文法に従う
アニメーション型: 離散

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

match-self
マーカーボックスは、 ::marker起点要素の方向性を使用して配置されます。
match-parent
マーカーボックスは、 ::marker起点要素の親要素の方向性を使用して配置されます。
デフォルトでは、要素または ::marker 疑似要素は、 そのリスト項目の方向性に従って自身を配置します。 ただし、リスト項目が異なる方向性を持つ可能性のある複数の他のリスト項目とグループ化されている場合 (たとえば、HTML の <ol> 内に異なる "dir" 属性を持つ複数の <li> がある場合)、 すべてのマーカーを片側に揃える方が便利なことがあります。 そうすれば作成者はその側に単一の "gutter" を指定し、 すべてのマーカーがその gutter 内に配置され、見えることを保証できます。

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

<ul>
  <li>英語 1
  <li dir=rtl>OWT WERBEH
  <li>英語 3
  <li dir=rtl>RUOF WERBEH
</ul>
match-self match-parent
* 英語 1
     OWT WERBEH *
* 英語 3
    RUOF WERBEH *
* 英語 1
*    OWT WERBEH
* 英語 3
*   RUOF WERBEH

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

キーワードの名前変更および list-style-position との統合について未解決の課題があります。

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

カウンターは、 CSS でリスト項目を自動的に番号付けすることなどに使用される特殊な数値トラッカーです。 すべての要素は0個以上のカウンターの集合を持ち、 それらは継承されるプロパティ値と同様の方法で文書ツリーを通じて継承されます。カウンターには 名前作成者があり、 これらによってカウンターが識別され、 さらに整数の を持ちます。 それらは、 カウンタープロパティ counter-incrementcounter-set、および counter-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
適用対象: すべての要素
継承: しない
パーセンテージ: 該当なし
算出値: キーワード 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-set および counter-increment プロパティにも適用されます。 [css-cascade-4] を参照してください。

プロパティ値内に同じ <counter-name> の複数のインスタンスがある場合、 最後のものだけが有効になります。

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

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

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

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

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

counter-increment および counter-set プロパティは、 既存の カウンターの値を操作します。 指定された名前のカウンターが要素上にまだ存在しない場合に限り、 新しいカウンターを インスタンス化します。 値は次のように定義されます:

none
この要素は、いずれのカウンターの値も変更しません。
<counter-name> <integer>?
要素上の指定された名前のカウンターの値を、 指定された <integer> に設定(counter-set の場合)するか、 指定された値だけインクリメント(counter-increment の場合)します。 <integer> が省略された場合、 デフォルトは 1counter-increment の場合) または 0counter-set の場合)です。

現在、要素上に指定された名前のカウンターが存在しない場合、 要素は、その値を設定またはインクリメントする前に、 開始値 0 でその名前の新しいカウンターを インスタンス化します。

この例は、「第1章」、「1.1」、「1.2」などの形式で章と節に番号を付ける方法を示します。

h1::before {
    content: "第" 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 のすべての子はそのカウンターを参照します。

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

<ol> item0 が作成され、0 に設定される
<li> item0 が 1 にインクリメントされる
<li> item0 が 2 にインクリメントされる
<ol> item1 が作成され、0 に設定され、item0 内にネストされる
<li> item1 が 1 にインクリメントされる
<li> item1 が 2 にインクリメントされる
<li> item1 が 3 にインクリメントされる
<ol> item2 が作成され、0 に設定され、 item1 内にネストされる
<li> item2 が 1 にインクリメントされる
</ol>
<li> item1 が 4 にインクリメントされる
<ol> item3 が作成され、0 に設定され、 item1 内にネストされる
<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 自身の CSS カウンター集合を表す element counters を、 element の親要素の CSS カウンター集合のコピーとします。

  3. sibling counters を、element の直前の兄弟(存在する場合)の CSS カウンター集合とし、 それ以外の場合は空の CSS カウンター集合とします。

    sibling counters の各 counter について、 element counters に同じ 名前のカウンターがまだ含まれていない場合、 counter のコピーを element counters に追加します。

  4. value source を、 ツリー 順序element の直前にある要素の CSS カウンター集合とします。

    value source の各 source 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 要素でも同じことが起こります。 この要素は #foo から example カウンターを継承し、 値 1 も同様に継承して、 それを 2 にインクリメントします。

ただし、#baz 要素は少し異なります。 この要素は、直前の兄弟である #foo 要素から example カウンターを継承します。 ただし、カウンターとともに #foo から値 1 を継承するのではなく、 ツリー順序における直前の要素である #bar から 値 2 を継承します。

この動作により、単一のカウンターを文書全体で使用し、 継続的にインクリメントできるため、 文書のネスト構造を作者が気にする必要がなくなります。

注: カウンターの継承は、通常の CSS の継承と同様に、 [DOM] のコンテキストにおける「平坦化された要素ツリー」 に対して作用します。

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

カウンターは、counter-reset で名前が指定されたときにインスタンス化され、 また、他に存在しない場合には、counter-incrementcounter-set、または counter() もしくは counters() 記法で名前が指定されたときにもインスタンス化されます。 (新たにインスタンス化されたカウンターは、以前の兄弟に由来する同名のカウンターを置き換えますが、 祖先要素に由来する同名のカウンターに対しては追加されます。 § 4.3 ネストされたカウンターとスコープを参照してください。) 指定された name と開始 value を持つカウンターを element 上に インスタンス化するには:
  1. counterselementCSS カウンター集合とします。

  2. innermost counter を、counters 内で名前が name である最後のカウンターとします。 innermost counter の生成元要素が element または element の以前の兄弟である場合、counters から innermost counter削除します。

  3. 名前が name、 生成元要素が element、 初期値が value である新しいカウンターcounters追加します

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 ずつインクリメントされなければならず、 通常カウンターが インクリメントされるのと同じ時点で行われます (ちょうど、そのリスト項目counter-increment 値に list-item 1 が追加されたかのように、 新しいカウンターインスタンス化する可能性などの副作用も含めて処理されます)。 これは、counter-increment指定値または算出 値には影響しません。

リスト項目list-item カウンターを自動的に 1 ずつインクリメントするため、 数値の list-style-type を持つ連続したリスト項目には、デフォルトで連続した番号が付けられます—作者が counter-increment を、 counter-increment: itemnumber のような別の値や、 さらには none に設定した場合でも同様です。 これにより、自動的な 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. 最初の項目
4. 2 番目の項目
6. 3 番目の項目

UA およびホスト言語は、 UA スタイルシートおよび表示ヒントのスタイルマッピングで リスト項目のスタイルを設定するとき、 list-item カウンター値が デフォルトで ホスト言語のセマンティクスによって決定される基礎となる数値を反映するようにすべきです。 たとえば、付録 A: HTML 用サンプルスタイルシートを参照してください。

次の例では、 content プロパティを使用して、 list-item カウンターに連動する階層的な番号付けを作成し、 これにより HTML を介して行われる番号付けの変更を反映します:
ol > li::marker { content: counters(list-item,'.') '.'; }

この規則を使用するネストされたリストは、次のようにレンダリングされます

1. 最初の最上位項目
5. 2 番目の最上位項目、value=5
   5.3. 最初の第 2 レベル項目、リストの start=3
   5.4. 2 番目の第 2 レベル項目、リストの start=3
        5.4.4. 逆順リストの最初の第 3 レベル項目
        5.4.3. 逆順リストの 2 番目の第 3 レベル項目
        5.4.2. 逆順リストの 3 番目の第 3 レベル項目
        5.4.1. 逆順リストの 4 番目の第 3 レベル項目
   5.5. 3 番目の第 2 レベル項目、リストの start=3
6. 3 番目の最上位項目

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

<ol>
  <li>最初の最上位項目
  <li value=5>2 番目の最上位項目、value=5
    <ol start=3>
      <li>最初の第 2 レベル項目、リストの start=3
      <li>2 番目の第 2 レベル項目、リストの start=3
        <ol reversed>
          <li>逆順リストの最初の第 3 レベル項目
          <li>逆順リストの 2 番目の第 3 レベル項目
          <li>逆順リストの 3 番目の第 3 レベル項目
          <li>逆順リストの 4 番目の第 3 レベル項目
        </ol>
    </ol>
  <li>3 番目の第 2 レベル項目、リストの start=3
  <li>3 番目の最上位項目
</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-name> という名前を持つ最内カウンターの値を、 <counter-style> という名前のカウンター スタイルを使用して表します。
counters()
要素の CSS カウンター集合内で <counter-name> という名前を持つすべてのカウンターの値を、 <counter-style> という名前のカウンター スタイルを使用して表し、 最外から最内の順に並べ、 指定された <string> で結合します。

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

counter() または counters() が使用される要素上に、 <counter-name> という名前のカウンターが存在しない場合、 まず開始値 0インスタンス化されます。

H1::before        { content: counter(chno, upper-latin) ". " }
/* "A. 不満の歴史" のような見出しを生成する */

H2::before        { content: counter(section, upper-roman) " - " }
/* "II - 不満の部" のような見出しを生成する */

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>1</li>
  <li>2
    <ul>
      <li>ネストされた 1</li>
      <li>ネストされた 2</li>
    </ul>
  </li>
  <li>3</li>
</ul>
<style>
li::marker { content: '(' counters(list-item,'.') ') '; }
</style>

上の文書は、次のようにレンダリングされるはずです:

(1) 1
(2) 2
   (2.1) ネストされた 1
   (2.2) ネストされた 2
(3) 3
カウンターは兄弟にも継承されるため、 互いにネストされていない 見出しや小見出しの番号付けにも使用できます。 残念ながら、 兄弟からのカウンターはネストされないため、counters() を使用できませんが、 代わりに複数のカウンターを作成し、手動で連結できます:
<h1>最初の H1</h1>
...
<h2>H1 内の最初の H2</h2>
...
<h2>H1 内の 2 番目の H2</h2>
...
<h3>H2 内の最初の H3</h3>
...
<h1>2 番目の H1</h1>
...
<h2>H1 内の最初の H2</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 最初の H1
...
A.1 H1 内の最初の H2
...
A.2 H1 内の 2 番目の H2
...
A.2.i H2 内の最初の H3
...
B 2 番目の H1
...
B.1 H1 内の最初の H2
...
カウンターは、マーカーを 表示する以外の用途にも役立つことがあります。 一般に、カウンターは要素に順番に番号を付ける機能を提供し、 これは他のプロパティから参照する場合に役立ちます。 たとえば、order を使用して 2 つの特定の要素の間に要素を配置するには、 現在のところ、目的の挿入位置より前および/または後にある すべての要素に order を明示的に指定する必要があります。 しかし、すべての要素の order 値を カウンターに設定できるなら、 2 つの要素の間の任意の位置に要素をより簡単に挿入できます。

他のユースケースには、互いにわずかに異なることを意図した transform を持つ ネストされた要素や兄弟要素があります。 現在、これを適切な方法で行うにはプリプロセッサーを使用する必要がありますが、 カウンターがあれば「素の」CSS でもうまく機能します。

(ネストされた場合については現在でも、 カスタムプロパティを使用し、ネストされた calc() を積み重ねることで、 連続する値を構築できますが、 これは *少し* 扱いにくく、 兄弟には機能しません。)

提案は、counter-value(<counter-name>) 関数を追加し、 文字列を返す代わりに、名前付きカウンターの値を整数として返すようにすることです。

Issue 1026 を参照してください。

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

この節は参考情報であり、規範的ではありません。 [HTML]レンダリング章では、 HTML リストに適用される規範的なデフォルトプロパティを定義しています。 このサンプルスタイルシートは、馴染みのあるマークアップ規約を使用して CSS の機能を示すために提供されています。

CSS で ol[reversed] のリスト番号付けをサポートする方法については議論が続いています。 たとえば、Issue 4181 を参照してください。

/* リスト項目を設定する */
li {
  display: list-item; /* 'counter-increment: list-item' を意味する */
}

/* list-item カウンターのスコープを定めるよう ol と ul を設定する */
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 レベル 2 からの変更点

はじめにの節で説明したように、 CSS2.1 と比較すると、このモジュールには重要な変更があります。

  1. リストマーカーを直接スタイル設定できるようにするため、::marker 疑似要素が導入されました。
  2. list-style-type は現在、<string> に加えて、<counter-style> の拡張値を [css-counter-styles-3] から受け入れます。.
  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" を使用して規範的なテキストから区別され、 次のように示されます:

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

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

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

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

適合性クラス

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

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

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

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

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

部分的な実装

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

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

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

非実験的な実装

仕様が勧告候補の段階に達すると、 非実験的な実装が可能になり、実装者は、 仕様に従って正しく実装されていることを実証できる CR レベルの機能について、接頭辞なしの実装を公開すべきです。

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

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

索引

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

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

参考文献

規範的参考文献

[CSS-CASCADE-4]
Elika Etemad; Tab Atkins Jr.. CSS カスケーディングおよび継承 レベル 4. 2020年8月18日. WD. URL: https://www.w3.org/TR/css-cascade-4/
[CSS-CONTENT-3]
Elika Etemad; Dave Cramer. CSS 生成コンテンツモジュール レベル 3. 2019年8月2日. WD. URL: https://www.w3.org/TR/css-content-3/
[CSS-COUNTER-STYLES-3]
Tab Atkins Jr.. CSS カウンタースタイル レベル 3. 2017年12月14日. CR. URL: https://www.w3.org/TR/css-counter-styles-3/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS 表示モジュール レベル 3. 2020年5月19日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-FLEXBOX-1]
Tab Atkins Jr.; et al. CSS フレキシブルボックスレイアウトモジュール レベル 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 画像モジュール レベル 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 画像値および 置換コンテンツモジュール レベル 4. 2017年4月13日. WD. URL: https://www.w3.org/TR/css-images-4/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS オーバーフロー モジュール レベル 3. 2020年6月3日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; et al. CSS 配置レイアウトモジュール レベル 3. 2020年5月19日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS 疑似要素モジュール レベル 4. 2019年2月25日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS 構文モジュール レベル 3. 2019年7月16日. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS テキストモジュール レベル 3. 2020年4月29日. WD. URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-4]
Elika Etemad; et al. CSS テキストモジュール レベル 4. 2019年11月13日. WD. URL: https://www.w3.org/TR/css-text-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 値および単位モジュール レベル 3. 2019年6月6日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 値および単位モジュール レベル 4. 2019年1月31日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VARIABLES-1]
Tab Atkins Jr.. カスケーディング変数のための CSS カスタムプロパティ モジュール レベル 1. 2015年12月3日. CR. URL: https://www.w3.org/TR/css-variables-1/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS 書字モード レベル 3. 2019年12月10日. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS 書字モード レベル 4. 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. カスケーディングスタイルシート レベル 2 改訂 1(CSS 2.1) 仕様. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[DOM]
Anne van Kesteren. DOM 標準. 現行標準. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML 標準. 現行 標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. 現行 標準. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. 要件レベルを示すために RFC で使用するキーワード . 1997年3月. 現行のベストプラクティス. URL: https://tools.ietf.org/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. セレクター レベル 4. 2018年11月21日. WD. URL: https://www.w3.org/TR/selectors-4/
[SVG2]
Amelia Bellamy-Royds; et al. Scalable Vector Graphics(SVG)2. 2018年10月4日. CR. URL: https://www.w3.org/TR/SVG2/

参考参考文献

[CSS-ANIMATIONS-1]
Dean Jackson; et al. CSS アニメーション レベル 1. 2018年10月11日. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS-COLOR-3]
Tantek Çelik; Chris Lilley; David Baron. CSS カラーモジュール レベル 3. 2018年6月19日. REC. URL: https://www.w3.org/TR/css-color-3/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley. CSS カラーモジュール レベル 4. 2019年11月5日. WD. URL: https://www.w3.org/TR/css-color-4/
[CSS-FONTS-3]
John Daggett; Myles Maxfield; Chris Lilley. CSS フォントモジュール レベル 3. 2018年9月20日. REC. URL: https://www.w3.org/TR/css-fonts-3/
[CSS-TRANSITIONS-1]
David Baron; et al. CSS トランジション. 2018年10月11日. WD. URL: https://www.w3.org/TR/css-transitions-1/

プロパティ索引

名前 初期値 適用対象 継承 百分率 アニメーション型 正規順序 算出値
counter-increment [ <counter-name> <integer>? ]+ | none none すべての要素 いいえ 該当なし 算出値の型による 文法に従う キーワード none、または各項目が識別子と整数の組であるリスト
counter-reset [ <counter-name> <integer>? ]+ | none none すべての要素 いいえ 該当なし 算出値の型による 文法に従う キーワード none、または各項目が識別子と整数の組であるリスト
counter-set [ <counter-name> <integer>? ]+ | none none すべての要素 いいえ 該当なし 算出値の型による 文法に従う キーワード none、または各項目が識別子と整数の組であるリスト
list-style <'list-style-position'> || <'list-style-image'> || <'list-style-type'> 個々のプロパティを参照 リスト項目 個々のプロパティを参照 個々のプロパティを参照 個々のプロパティを参照 文法に従う 個々のプロパティを参照
list-style-image <image> | none none リスト項目 はい 該当なし 離散 文法に従う キーワード none または算出された <image>
list-style-position inside | outside outside リスト項目 はい 該当なし 離散 文法に従う キーワード。ただし本文を参照
list-style-type <counter-style> | <string> | none disc リスト項目 はい 該当なし 離散 文法に従う 指定値
marker-side match-self | match-parent match-self リスト項目 はい 該当なし 離散 文法に従う 指定されたキーワード

課題索引

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 値をカウンターに設定できるなら、 2 つの要素の間の任意の位置に要素をより簡単に挿入できます。

他のユースケースには、互いにわずかに異なることを意図した transform を持つ ネストされた要素や兄弟要素があります。 現在、これを適切な方法で行うにはプリプロセッサーを使用する必要がありますが、 カウンターがあれば「素の」CSS でもうまく機能します。

(ネストされた場合については現在でも、 カスタム プロパティを使用し、ネストされた calc() を積み重ねることで、 連続する値を構築できますが、 これは *少し* 扱いにくく、 兄弟には機能しません。)

提案は、counter-value(<counter-name>) 関数を追加し、 文字列を返す代わりに、 名前付きカウンターの値を整数として返すようにすることです。

Issue 1026 を参照してください。

CSS で ol[reversed] のリスト番号付けをサポートする方法については議論が続いています。 たとえば、Issue 4181 を参照してください。