スクロールバーのスタイル設定

スクロールバーのスタイルを設定するには、scrollbar-width プロパティと scrollbar-color プロパティを使用します。

はじめに

Chrome バージョン 2 以降では、::-webkit-scrollbar-* 疑似要素を使用してスクロールバーのスタイルを設定できるようになりました。このアプローチは Chrome と Safari で問題なく機能しますが、CSS ワーキング グループによって標準化されていませんでした。

標準化されたのは、CSS スクロールバー スタイリング モジュール レベル 1 仕様の一部である scrollbar-width プロパティと scrollbar-color プロパティです。これらのプロパティは Chrome 121 以降でサポートされています。

対応ブラウザ

  • 121
  • 121
  • 64
  • x

ソース

スクロールバー入門

スクロールバーの構造

スクロールバーは少なくとも、トラックとつまみで構成されます。トラックとは、つまみを動かすことができる領域です。トラックはスクロール距離全体を表します。つまみは、スクロール可能な領域の現在位置を表します。スクロールするとトラック内を移動します。通常は、つまみをドラッグすることもできます。

ただし、スクロールバーには、つまみとトラック以外の要素も含めることができます。たとえば、スクロールバーには、スクロール オフセットをインクリメントまたはデクリメントする 1 つ以上のボタンを表示できます。スクロールバーを構成する部分は、基盤となるオペレーティング システムによって決まります。

スクロールバーを構成する部分のイラスト。
スクロールバーを構成する各部分のイラスト。左側のイラストは、トラックとつまみだけを表示する必要最小限のスクロールバーです。右側のボタンにはボタンもあります。

クラシック スクロールバーとオーバーレイ スクロールバー

スクロールバーのスタイル設定方法を見る前に、2 種類のスクロールバーの違いを理解しておくことが重要です。

オーバーレイ スクロールバー

オーバーレイ スクロールバーは、その下のコンテンツの上にレンダリングされるフローティング スクロールバーです。デフォルトでは表示されず、スクロール中にのみ表示されます。下のコンテンツを表示し続けるために半透明であることが多いですが、これはオペレーティング システムが決定します。操作中は、サイズも変化する可能性があります。

オーバーレイ スクロールバーが表示されているブラウザのイラスト。
オーバーレイ スクロールバーが表示されているブラウザのイラスト。スクロールバーがコンテンツに重なって表示されますが、つまみは半透明になります。

クラシック スクロールバー

クラシック スクロールバーは、専用のスクロールバー ガターに配置されるスクロールバーです。スクロールバーのガターは、内側の枠線と外側のパディング縁の間のスペースです。通常、これらのスクロールバーは不透明(透明ではなく)で、隣接するコンテンツと一定の間隔を空けます。

クラシックなスクロールバーを表示しているブラウザのイラスト。
従来のスクロールバーを表示しているブラウザのイラスト。スクロールバーは、専用の領域でコンテンツの横に表示されます。オーバーレイ スクロールバーを使用すると、コンテンツで利用可能な幅が使用可能な幅と比較して縮小されます。

scrollbar-color プロパティと scrollbar-width プロパティ

scrollbar-color でスクロールバーに色を付ける

scrollbar-color プロパティを使用すると、スクロールバーのカラーパターンを変更できます。このプロパティは 2 つの <color> 値を受け入れます。1 つ目の <color> 値でつまみの色を指定し、2 つ目の値でトラックに使用する色を指定します。

.scroller {
  scrollbar-color: hotpink blue;
}

オーバーレイのスクロールバーを使用する場合、デフォルトではトラックの色による効果はありません。ただし、スクロールバーにカーソルを合わせると、トラックが表示されます。

デモ: スクロールバーのスタイル設定: scrollbar-color

オペレーティング システムが提供するデフォルトのレンダリングを使用するには、値として auto を使用します。

scrollbar-width でスクロールバーのサイズを変更する

scrollbar-width プロパティを使用すると、スクロールバーの幅を狭めることができ、スクロールバーを完全に非表示にすることもできます。

指定できる値は autothinnone です。

  • auto: プラットフォームから提供されるデフォルトのスクロールバーの幅。
  • thin: プラットフォームが提供するスクロールバーの薄いバリアント、またはデフォルトのプラットフォームのスクロールバーよりも細いカスタム スクロールバー。
  • none: スクロールバーを効果的に非表示にします。ただし、要素は引き続きスクロール可能です。

scrollbar-width の値として 16px などの <length> を使用することはできません。

.scroller {
  scrollbar-width: thin;
}

オーバーレイのスクロールバーを使用する場合、スクロール可能な領域をアクティブにスクロールしている間だけ、つまみが描画されます。

デモ: スクロールバーのスタイル設定: scrollbar-width

古いバージョンのブラウザのサポート

scrollbar-colorscrollbar-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);
    }
}
デモ: ::-webkit-scrollbar-* にフォールバックした scrollbar-* を使用したスクロールバーのスタイル設定

なお、::-webkit-scrollbarwidth または 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. */
}
デモ: ::-webkit-scrollbar-* にフォールバックした scrollbar-* を使用したスクロールバーのスタイル設定(カーソルを合わせたときにのみ ::-webkit-scrollbar-* の色を適用する)