::scroll-marker

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Experimental: これは実験的な機能です。
本番で使用する前にブラウザー互換性一覧表をチェックしてください。

::scroll-markerCSS擬似要素で、任意の要素内に生成でき、そのスクロールマーカーを表します。すべての要素が ::scroll-marker 擬似要素を持つことができ、これは最も近いスクロールコンテナーである祖先の ::scroll-marker-group 内に配置されます。スクロールマーカーは、スクロールターゲットがマーカーの元の要素であるアンカー(<a> 要素)のように動作し、アクティブになると、その要素までスクロールコンテナをスクロールします。

構文

css
::scroll-marker {
  /* ... */
}

解説

::scroll-marker は、 ::scroll-markercontent プロパティが 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> リストアイテムがあります。

html
<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> をカルーセルに変換するには、 displayflex に設定し、単一の、折り返しのない <li> 要素の行を作成します。 overflow-x プロパティは auto に設定されています。これは、アイテムが X 軸でコンテナーからはみ出した場合、コンテンツが水平方向にスクロールすることを意味します。次に、 <ul>スクロールスナップコンテナーに変換し、コンテナーの scroll-snap-type の値が mandatory に設定されている場合に、アイテムが常に所定の位置にスナップするようにします。

scroll-marker-group プロパティを使用してスクロールマーカーグループを作成し、そのグループをすべてのコンテンツの後に配置します。

css
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 に設定することで、コンテンツがスクロールされると、左端に表示されているアイテムの左側がコンテナーの左端にスナップします。

css
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 擬似要素を使用して、赤い境界線のある正方形のマーカーを各リストアイテムに作成します。

css
li::scroll-marker {
  content: "";
  border: 1px solid red;
  height: 1em;
  width: 1em;
}

また、 ::scroll-marker-group 擬似要素にスタイルを適用して、スクロールマーカーを各マーカー間の間隔を 0.4em にして行の中央にレイアウトします。

css
::scroll-marker-group {
  display: flex;
  gap: 0.4em;
  place-content: center;
}

最後に、現在スクロールされている要素のマーカーのスタイルを、そのマーカーを :target-current 擬似クラスで対象とし、他の要素とは異なる形に設定します。

css
::scroll-marker:target-current {
  background: red;
}

結果

カスタムスクロールマーカーの番号付けとスタイル

この例は、スクロールマーカーに別のスタイル設定を適用し、CSS カウンターを使用して各マーカーに表示される数値を増加させる点を除いて、前回の例と同じです。CSS の違いについては、次の節で説明します。

CSS

この例では、 counter-increment を使用して、それぞれの <li> (マーカー) で増加させたいカウンターの名前を設定します。

css
li {
  counter-increment: markers;
}

次に、擬似要素 ::scroll-markercontent プロパティを counter() 関数に設定し、 markers のカウンター名を引数として渡します。これにより、各マーカーに数値が挿入され、自動的に増加する効果があります。残りのスタイルはごく基本的なものですが、マーカーのスタイルを完全に設定する方法を示しています。

css
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 つのルールを含めています。最初のマーカーのテキストコンテンツには「最初」、最後のマーカーのテキストコンテンツには「最後」を指定しました。

css
li:first-child::scroll-marker {
  content: "最初";
}

li:last-child::scroll-marker {
  content: "最後";
}

より使いやすくするために、 :hover のマーカーに別の色を設定し、 :target-current 擬似クラスを使用して、現在スクロールされている要素のマーカーに別の colorbackground-color を設定し、ユーザーが現在表示されているアイテムを把握できるようにします。

css
::scroll-marker:hover {
  background-color: #dcc;
}

::scroll-marker:target-current {
  background-color: purple;
  color: white;
}

結果

仕様書

Specification
CSS Overflow Module Level 5
# scroll-marker-pseudo

ブラウザーの互換性

関連情報