高コントラスト設定にスクロールバーを適応させる

オペレーティング システムやブラウザで高コントラスト モードを有効にしているユーザーは、UI 要素(スクロールバーなど)が非常に読みやすいことを期待しています。多くの場合、微妙なグレーやテーマカラーではなく、前景と背景がはっきりと区別されることを期待しています。

このガイドでは、@media (prefers-contrast: more) CSS メディア機能を使用して高コントラストのスクロールバー スタイルを適用する方法について説明します。

読みやすさを向上させる

scrollbar-color またはカスタム変数を使用してスクロールバーをカスタマイズする場合は、高コントラスト モードの明示的なオーバーライドを指定できます。これは、メインのアプリテーマで、デザイン上の理由からコントラストの低いスクロールバーを使用している場合に特に役立ちます。

省略可: @media (prefers-contrast: more) ブロックを使用して、つまみとトラックに暗い、はっきりした色を定義します。

/* Define default standard colors as variables */
.scroller {
  --scrollbar-thumb: #bbb;
  --scrollbar-track: #f1f1f1;

  scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
  scrollbar-width: thin;
  scrollbar-gutter: stable;
}

/* OPTIONAL: Provide clear, high-contrast overrides */
@media (prefers-contrast: more) {
  .scroller {
    /* Use extremely distinct colors like solid black against white */
    --scrollbar-thumb: #000000;
    --scrollbar-track: #ffffff;
  }
}

scrollbar-color を使用する際の注意点

  • scrollbar-color をアニメーション化したり、遷移させたりしないでください。WebKit のバグにより、scrollbar-color が変更されるたびにスクロールバーがちらつきます。
  • macOS では、ネイティブの「オーバーレイ」スクロールバーが使用されるため、scrollbar-color(標準)プロパティと ::-webkit-scrollbar(レガシー)プロパティはデフォルトで無視されます。macOS でカスタムカラーを強制的にレンダリングするには、カスタムカラーを scrollbar-width(thin や auto など)とペア設定する必要があります。
  • scrollbar-width が適用されていても、macOS のオーバーレイ スクロールバーでは、デフォルトでトラック(ガター)が透明にレンダリングされます。デザイン上、MacOS でトラックの背景色を表示する必要がある場合は、スクロール可能なコンテナに scrollbar-gutter: stable; を適用する必要があります。ただし、これはユーザーがスクロールバーにカーソルを合わせた後にのみ表示されます。
  • scrollbar-gutter: stable を使用しても、macOS ではトラックが透明になることがあります。つまみは、トラックの色に依存せずに表示される必要があります。

フォールバックとブラウザのサポート

scrollbar-color のフォールバックとブラウザ サポート

この機能はプログレッシブ エンハンスメントであり、必ずしもフォールバックが必要なわけではありません。

スタイル設定が重要で、ユーザーの Baseline ターゲットが「Baseline Widely Available」以前の場合は、フォールバックとして非標準の ::-webkit-scrollbar 疑似要素を含めるべきです。

以前のフォールバックを @supports not (scrollbar-color: auto) ブロックでラップして、標準プロパティと以前の WebKit セレクタの両方をネイティブにサポートするブラウザで、それらの競合を防ぎます。

カスタム プロパティを使用して色を定義している場合、それらの色は以前の WebKit セレクタに自動的にカスケードされます。重複して作成する必要はありません。

/* Legacy fallback for WebKit/Blink browsers */
@supports not (scrollbar-color: auto) {
  .scroller::-webkit-scrollbar {
    /* Must define base size in WebKit for custom colors to be visual */
    width: 12px;
    height: 12px;
  }

  .scroller::-webkit-scrollbar-thumb {
    background: var(--scrollbar-thumb);
  }

  .scroller::-webkit-scrollbar-track {
    background: var(--scrollbar-track);
  }
}