scrollbar-width プロパティと scrollbar-color プロパティを使用して、スクロールバーのスタイルを設定します。
はじめに
Chrome バージョン 2 以降では、::-webkit-scrollbar-* 疑似要素を使用してスクロールバーのスタイルを設定できるようになりました。このアプローチは Chrome と Safari では問題なく動作しますが、CSS ワーキング グループによって標準化されたことはありません。
標準化されたのは、CSS Scrollbars Styling Module Level 1 Specification の一部である scrollbar-width プロパティと scrollbar-color プロパティです。これらのプロパティは Chrome 121 以降でサポートされています。
スクロールバー 101
スクロールバーの構造
スクロールバーは、少なくともトラックとサムで構成されます。トラックは、つまみを移動できる領域です。トラックはスクロール距離全体を表します。サムは、スクロール可能な領域内の現在の位置を表します。スクロールすると、トラック内で移動します。サムはドラッグ可能な場合も多くあります。
ただし、スクロールバーには、つまみとトラック以外の部分が含まれる場合があります。たとえば、スクロールバーにはスクロール オフセットを増減させるためのボタンが 1 つ以上ある場合があります。スクロールバーを構成する部分は、基盤となるオペレーティング システムによって決まります。
クラシック スクロールバーとオーバーレイ スクロールバー
スクロールバーのスタイルを設定する方法を見る前に、2 種類のスクロールバーの違いを理解しておくことが重要です。
オーバーレイ スクロールバー
オーバーレイ スクロールバーは、下にあるコンテンツの上にレンダリングされるフローティング スクロールバーです。デフォルトでは表示されず、アクティブにスクロールしている間のみ表示されます。多くの場合、下にあるコンテンツが見えるように半透明になっていますが、これはオペレーティング システムによって異なります。また、操作中にサイズが変化することもあります。
クラシック スクロールバー
従来のスクロールバーは、専用のスクロールバー ガターに配置されるスクロールバーです。スクロールバー ガターは、内側の境界線の端と外側のパディングの端の間のスペースです。通常、これらのスクロールバーは不透明(透明ではない)で、隣接するコンテンツのスペースを占有します。
scrollbar-color プロパティと scrollbar-width プロパティ
scrollbar-color を使用してスクロールバーに色を付ける
scrollbar-color プロパティを使用すると、スクロールバーのカラーパターンを変更できます。このプロパティは 2 つの <color> 値を受け入れます。最初の <color> 値はサムの色を決定し、2 つ目の値はトラックに使用する色を決定します。
.scroller {
scrollbar-color: hotpink blue;
}
オーバーレイ スクロールバーを使用する場合、デフォルトではトラックの色は効果がありません。ただし、スクロールバーにカーソルを合わせると、トラックが表示されます。
scrollbar-colorオペレーティング システムが提供するデフォルトのレンダリングを使用するには、値として auto を使用します。
scrollbar-width を使用してスクロールバーのサイズを変更する
scrollbar-width プロパティを使用すると、スクロールバーを細くしたり、スクロール機能を損なうことなくスクロールバーを完全に非表示にしたりできます。
指定できる値は auto、thin、none です。
auto: プラットフォームによって提供されるデフォルトのスクロールバーの幅。thin: プラットフォームが提供するスクロールバーの細いバリエーション、またはデフォルトのプラットフォーム スクロールバーよりも細いカスタム スクロールバー。none: スクロールバーを効果的に非表示にします。ただし、要素はスクロール可能です。
scrollbar-width の値として 16px などの <length> を使用することはできません。
.scroller {
scrollbar-width: thin;
}
オーバーレイ スクロールバーを使用している場合、スクロール可能な領域をアクティブにスクロールしている間のみ、サムが描画されます。
scrollbar-width古いブラウザ バージョンのサポート
scrollbar-color と scrollbar-width をサポートしていないブラウザのバージョンに対応するため、新しい scrollbar-* プロパティと ::-webkit-scrollbar-* プロパティの両方を使用できます。
.scroller {
--scrollbar-color-thumb: hotpink;
--scrollbar-color-track: blue;
--scrollbar-width: thin;
--scrollbar-width-legacy: 10px;
}
/* Modern browsers with `scrollbar-*` support */
@supports (scrollbar-width: auto) {
.scroller {
scrollbar-color: var(--scrollbar-color-thumb) var(--scrollbar-color-track);
scrollbar-width: var(--scrollbar-width);
}
}
/* Legacy browsers with `::-webkit-scrollbar-*` support */
@supports selector(::-webkit-scrollbar) {
.scroller::-webkit-scrollbar-thumb {
background: var(--scrollbar-color-thumb);
}
.scroller::-webkit-scrollbar-track {
background: var(--scrollbar-color-track);
}
.scroller::-webkit-scrollbar {
max-width: var(--scrollbar-width-legacy);
max-height: var(--scrollbar-width-legacy);
}
}
scrollbar-* を使用してスクロールバーのスタイルを設定し、::-webkit-scrollbar-* にフォールバックする::-webkit-scrollbar の width または height を設定すると、オーバーレイ スクロールバーが常に表示され、事実上クラシック スクロールバーに変わります。
錯覚を維持するために、スクロールバーにカーソルを合わせたときにのみ色を変更することもできます。
.scroller::-webkit-scrollbar-thumb {
background: transparent;
}
.scroller::-webkit-scrollbar-track {
background: transparent;
}
.scroller:hover::-webkit-scrollbar-thumb {
background: var(--scrollbar-color-thumb);
}
.scroller:hover::-webkit-scrollbar-track {
background: var(--scrollbar-color-track);
}
.scroller:hover {
--fix: ; /* This custom property invalidates styles on hover, thereby enforcing a style recomputation. This is needed to work around a bug in Safari. */
}
scrollbar-* を使用してスクロールバーのスタイルを設定し、::-webkit-scrollbar-* にフォールバックして、ホバー時にのみ ::-webkit-scrollbar-* の色を適用する