::scroll-marker
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Experimental: これは実験的な機能です。
本番で使用する前にブラウザー互換性一覧表をチェックしてください。
::scroll-marker
は CSS の擬似要素で、任意の要素内に生成でき、そのスクロールマーカーを表します。すべての要素が ::scroll-marker
擬似要素を持つことができ、これは最も近いスクロールコンテナーである祖先の ::scroll-marker-group
内に配置されます。スクロールマーカーは、スクロールターゲットがマーカーの元の要素であるアンカー(<a>
要素)のように動作し、アクティブになると、その要素までスクロールコンテナをスクロールします。
構文
::scroll-marker { /* ... */ }
解説
::scroll-marker
は、 ::scroll-marker
の content
プロパティが none
以外の値に設定され、その要素の祖先要素の scroll-marker-group
プロパティの値が none
以外のスクロールコンテナーがある場合(つまり、 ::scroll-marker-group
擬似要素が生成される場合)に、要素上に生成されます。
スクロールコンテナーの ::scroll-marker-group
擬似要素は、スクロールコンテナーまたはその子孫で生成された ::scroll-marker
擬似要素を自動的にすべて含みます。これにより、それらをグループとして位置指定およびレイアウトすることができ、通常、CSS カルーセルを作成してスクロール位置インジケータを作成する場合に使用されます。個々のスクロールマーカーを使用して、関連付けられたコンテンツアイテムに移動することができます。
アクセシビリティに関しては、スクロールマーカーグループおよびそれに含まれるスクロールマーカーは、 tablist
/tab
の意味づけでレンダリングされます。このグループに Tab キーを押すと、1 つのアイテムのように動作し (つまり、 Tab キーをもう一度押すと、グループを過ぎて次のアイテムに移動します)、左右 (または上下) のカーソルキーを使用して、異なるスクロールマーカー間を移動することができます。
例
CSS によるカルーセルの作成に、 ::scroll-marker
擬似要素のその他の使用例があります。
カルーセルスクロールマーカーの作成
この例では、 CSS カルーセルにスクロールマーカーを作成する方法を示します。
HTML
基本的な HTML の <ul>
リストに、いくつかの <li>
リストアイテムがあります。
<ul> <li>アイテム 1</li> <li>アイテム 2</li> <li>アイテム 3</li> <li>アイテム 4</li> <li>アイテム 5</li> <li>アイテム 6</li> <li>アイテム 7</li> <li>アイテム 8</li> </ul>
CSS
<ul>
をカルーセルに変換するには、 display
を flex
に設定し、単一の、折り返しのない <li>
要素の行を作成します。 overflow-x
プロパティは auto
に設定されています。これは、アイテムが X 軸でコンテナーからはみ出した場合、コンテンツが水平方向にスクロールすることを意味します。次に、 <ul>
をスクロールスナップコンテナーに変換し、コンテナーの scroll-snap-type
の値が mandatory
に設定されている場合に、アイテムが常に所定の位置にスナップするようにします。
scroll-marker-group
プロパティを使用してスクロールマーカーグループを作成し、そのグループをすべてのコンテンツの後に配置します。
ul { display: flex; gap: 4vw; padding-left: 0; overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x mandatory; scroll-marker-group: after; }
次に、 <li>
要素にスタイルを設定し、 flex
プロパティを使用して、コンテナーの幅の 33%
にします。 scroll-snap-align
の値を start
に設定することで、コンテンツがスクロールされると、左端に表示されているアイテムの左側がコンテナーの左端にスナップします。
li { list-style-type: none; background-color: #eee; flex: 0 0 33%; height: 100px; padding-top: 20px; scroll-snap-align: start; text-align: center; }
次に、 ::scroll-marker
擬似要素を使用して、赤い境界線のある正方形のマーカーを各リストアイテムに作成します。
li::scroll-marker { content: ""; border: 1px solid red; height: 1em; width: 1em; }
また、 ::scroll-marker-group
擬似要素にスタイルを適用して、スクロールマーカーを各マーカー間の間隔を 0.4em
にして行の中央にレイアウトします。
::scroll-marker-group { display: flex; gap: 0.4em; place-content: center; }
最後に、現在スクロールされている要素のマーカーのスタイルを、そのマーカーを :target-current
擬似クラスで対象とし、他の要素とは異なる形に設定します。
::scroll-marker:target-current { background: red; }
結果
カスタムスクロールマーカーの番号付けとスタイル
この例は、スクロールマーカーに別のスタイル設定を適用し、CSS カウンターを使用して各マーカーに表示される数値を増加させる点を除いて、前回の例と同じです。CSS の違いについては、次の節で説明します。
CSS
この例では、 counter-increment
を使用して、それぞれの <li>
(マーカー) で増加させたいカウンターの名前を設定します。
li { counter-increment: markers; }
次に、擬似要素 ::scroll-marker
の content
プロパティを counter()
関数に設定し、 markers
のカウンター名を引数として渡します。これにより、各マーカーに数値が挿入され、自動的に増加する効果があります。残りのスタイルはごく基本的なものですが、マーカーのスタイルを完全に設定する方法を示しています。
li::scroll-marker { content: counter(markers); font-family: sans-serif; width: fit-content; height: 1em; padding: 5px; color: black; text-decoration: none; border: 2px solid rgb(0 0 0 / 0.15); border-radius: 0.5em; background-color: #eee; }
もう 1 つの興味深いカスタマイズとして、セレクターチェーンにそれぞれ :first-child
および :last-child
を挿入して、最初のリストアイテムと最後のリストアイテムのマーカーを選択するための 2 つのルールを含めています。最初のマーカーのテキストコンテンツには「最初」、最後のマーカーのテキストコンテンツには「最後」を指定しました。
li:first-child::scroll-marker { content: "最初"; } li:last-child::scroll-marker { content: "最後"; }
より使いやすくするために、 :hover
のマーカーに別の色を設定し、 :target-current
擬似クラスを使用して、現在スクロールされている要素のマーカーに別の color
と background-color
を設定し、ユーザーが現在表示されているアイテムを把握できるようにします。
::scroll-marker:hover { background-color: #dcc; } ::scroll-marker:target-current { background-color: purple; color: white; }
結果
仕様書
Specification |
---|
CSS Overflow Module Level 5 # scroll-marker-pseudo |
ブラウザーの互換性
関連情報
scroll-marker-group
::scroll-button()
::scroll-marker-group
:target-current
- CSS によるカルーセルの作成
- CSS リストとカウンターモジュール
- CSS オーバーフローモジュール
- CSS Carousel Gallery (chrome.dev, 2025)