CSSスクロールバージェネレーター
かつてカスタムスクロールバーは、ベンダープレフィックス付きの擬似要素に悩まされる代物でした。今ではscrollbar-colorとscrollbar-widthが、すべてのモダンブラウザで一般的なケースに対応します。狭い幅か通常の幅か、そして2色(つまみとトラック)のテーマ設定です。ピクセル単位の制御(トラックのパディング、つまみの角丸、ホバー状態)には、従来の::-webkit-scrollbar擬似要素が今もChromeとSafariで使えます。このジェネレーターは両方を出力し、正しくカスケードさせます。
スクロールバーのスタイル設定方法
-
1
幅を選ぶ
auto(プラットフォーム標準の幅)、thin(より細く)、またはwebkitルールで指定する特定のピクセル値から選べます。
-
2
つまみとトラックの色を設定する
最新の`scrollbar-color`は2色を受け取ります。webkitルールでは色・角丸・ホバー状態を個別に指定できます。
-
3
ホバー効果を追加する(任意)
ホバー時につまみが明るくなります。`::-webkit-scrollbar-thumb:hover`で動作します。
-
4
適用範囲を決める
`html`/`body`(ページ全体)に適用するか、特定のスクロールコンテナだけに適用します。
-
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-widthとscrollbar-colorプロパティで設定できます。Firefoxはwebkit擬似要素をサポートしていないため、ブラウザ間で見た目を統一するには、まず最新のプロパティを使い、webkitルールを拡張として追加してください。
既定のスクロールバーはコンテンツに重なり、必要になるまでスペースを確保しないためです。スクロールする要素にscrollbar-gutter: stableを設定して常に余白を確保すれば、スクロールバーの出現や消失による再配置を防げます。
通常は隠すのがよいでしょう。スクロールバーが場違いに見え、コンテンツと競合するからです。コンテンツがスクロールすることをユーザーに伝えるため、目に見えるページネーションのドットや矢印コントロールを追加してください。スクロールスナップを使う場合はprefers-reduced-motionを尊重しましょう。
影響することがあります。非常に細い、またはコントラストの低いスクロールバーは、運動機能に制約のあるユーザーや弱視のユーザーには使いづらくなります。快適につかめるよう、スクロールバーの幅を少なくとも8〜10pxに保ち、つまみとトラックの間で3:1のコントラストを維持してください。
関連ツール
ASCII表リファレンス
0から127までの完全なASCII表です。NUL、LF、DELなどの制御コードを含め、各文字の10進数、16進数、8進数、2進数、HTML数値文字参照を表示します。
HTML文字参照
HTMLエンティティの検索可能なリスト、その名称コードおよび数値コード、および特殊文字や記号のワンクリックコピー機能を提供します。
キーボードショートカット一覧
macOS、Windows、Linux向けに、VS Code、Chrome、GNU Readlineを使うBashの公式資料に基づく既定ショートカットを検索できます。
HTML フォーマッター
ブラウザ内で HTML を 2 または 4 スペースで整形します。HTML はアップロードも検証もされません。
カラーパレットジェネレーター
基準のHEXカラーから、モノクロマティック、類似色、補色、トライアド、テトラードのパレットを生成し、コピーしやすいCSS変数として書き出します。
バイナリからASCIIへの変換ツール
バイナリ(スペース区切りのバイト、または長いビット列)を貼り付けると、それが表すASCIIテキストを8ビットずつ復号して取得できます。