CSSスクロールバージェネレーター

次へ

かつてカスタムスクロールバーは、ベンダープレフィックス付きの擬似要素に悩まされる代物でした。今ではscrollbar-colorscrollbar-widthが、すべてのモダンブラウザで一般的なケースに対応します。狭い幅か通常の幅か、そして2色(つまみとトラック)のテーマ設定です。ピクセル単位の制御(トラックのパディング、つまみの角丸、ホバー状態)には、従来の::-webkit-scrollbar擬似要素が今もChromeとSafariで使えます。このジェネレーターは両方を出力し、正しくカスケードさせます。

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

  1. 1

    幅を選ぶ

    auto(プラットフォーム標準の幅)、thin(より細く)、またはwebkitルールで指定する特定のピクセル値から選べます。

  2. 2

    つまみとトラックの色を設定する

    最新の`scrollbar-color`は2色を受け取ります。webkitルールでは色・角丸・ホバー状態を個別に指定できます。

  3. 3

    ホバー効果を追加する(任意)

    ホバー時につまみが明るくなります。`::-webkit-scrollbar-thumb:hover`で動作します。

  4. 4

    適用範囲を決める

    `html`/`body`(ページ全体)に適用するか、特定のスクロールコンテナだけに適用します。

  5. 5

    CSSをコピーする

    最新ルールとwebkitルールを組み合わせ、あらゆるモダンブラウザで適切なフォールバックとともに動作します。

最新の標準プロパティ(2023年以降)

/* Applies to the element that scrolls */
html {
  scrollbar-width: thin;           /* auto | thin | none */
  scrollbar-color: #4f46e5 #e5e7eb; /* thumb track */
}

ブラウザ対応状況(2024年):

  • scrollbar-width: Chrome 121+、Safari 18.2+、Firefox 64+。
  • scrollbar-color: Chrome 121+、Safari 18.2+、Firefox 64+。
  • scrollbar-gutter: stable: Chrome 94+、Safari 14+、Firefox 97+。不要なときでもスクロールバーのスペースを確保し、レイアウトのずれを防ぎます。

webkit擬似要素(Chrome、Safari、旧Edge)

::-webkit-scrollbar {
  width: 10px;
  height: 10px;
}
::-webkit-scrollbar-track {
  background: #e5e7eb;
  border-radius: 10px;
}
::-webkit-scrollbar-thumb {
  background: #4f46e5;
  border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover {
  background: #3730a3;
}

より細かな制御ができます。widthは縦スクロールバーの幅を、heightは横スクロールバーの高さを設定します。どちらの方向にもスクロールできるコンテナには両方を追加してください。

2つの手法をカスケードする

まず最新ルールを指定し、その後、両方をレンダリングするブラウザ向けの拡張としてwebkitを追加します:

.scroll-area {
  scrollbar-width: thin;
  scrollbar-color: #4f46e5 #e5e7eb;
}
.scroll-area::-webkit-scrollbar       { width: 8px; }
.scroll-area::-webkit-scrollbar-track { background: #e5e7eb; }
.scroll-area::-webkit-scrollbar-thumb {
  background: #4f46e5;
  border-radius: 4px;
  border: 2px solid #e5e7eb;
}

Firefoxは最新のscrollbar-*ルールのみに従います。ChromeとSafariはwebkitルールに従い(これが最新ルールを上書きするため)、動作は一貫します。

scrollbar-gutterはコンテンツのずれを防ぐ

余白を確保していないと、スクロールバーが現れたときにコンテンツが再配置されます(動的なリストでよく起こります)。対処法:

html { scrollbar-gutter: stable; }
/* or */
html { scrollbar-gutter: stable both-edges; }

コンテンツがスクロールするかどうかにかかわらず、スクロールバーの領域が確保されます。both-edgesは反対側にも同じ余白を追加し、コンテンツを視覚的に中央に保ちます。

スクロールバーを完全に隠す

.no-scrollbar {
  scrollbar-width: none;           /* Firefox */
}
.no-scrollbar::-webkit-scrollbar { display: none; }  /* Chrome, Safari */

注意: スクロールバーを隠すと、コンテンツがスクロールできることをユーザーが認識できなくなります。明確な手がかり(矢印、ページドット)を併用する場合か、文脈からスクロール動作が明らかな場合(横型カルーセル、チャット履歴など)だけに使ってください。

モバイルでの考慮点

iOSとAndroidでは、スクロールバーはスクロール中に一瞬だけ表示されます。カスタムスクロールバーのCSSは適用されますが、ユーザーが1秒以上目にすることはないかもしれません。それを踏まえて設計しましょう。めったに現れない見た目の装飾に過度な労力をかけないことです。

アクセシビリティ

  • コントラスト: つまみとトラックのコントラスト比は、非テキストのコントラストとして3:1を満たすべきです(WCAG 1.4.11)。
  • : 細いスクロールバーはマウスでつかみにくく、特に運動機能に制約のあるユーザーには不便です。通常の幅のほうが安全な既定値です。
  • スクロール領域のスクロールバーを絶対に取り除かないでください。別のスクロール手段を用意せずに取り除くと、スクロールバーに頼るユーザーが操作できなくなります。

よくある質問

はい、最新のscrollbar-widthscrollbar-colorプロパティで設定できます。Firefoxはwebkit擬似要素をサポートしていないため、ブラウザ間で見た目を統一するには、まず最新のプロパティを使い、webkitルールを拡張として追加してください。

既定のスクロールバーはコンテンツに重なり、必要になるまでスペースを確保しないためです。スクロールする要素にscrollbar-gutter: stableを設定して常に余白を確保すれば、スクロールバーの出現や消失による再配置を防げます。

通常は隠すのがよいでしょう。スクロールバーが場違いに見え、コンテンツと競合するからです。コンテンツがスクロールすることをユーザーに伝えるため、目に見えるページネーションのドットや矢印コントロールを追加してください。スクロールスナップを使う場合はprefers-reduced-motionを尊重しましょう。

影響することがあります。非常に細い、またはコントラストの低いスクロールバーは、運動機能に制約のあるユーザーや弱視のユーザーには使いづらくなります。快適につかめるよう、スクロールバーの幅を少なくとも8〜10pxに保ち、つまみとトラックの間で3:1のコントラストを維持してください。

関連ツール