UIXHERO

Scroll Area(スクロールエリア)

コンテンツのオーバーフローをスクロールで制御するUIコンポーネント。ネイティブスクロールバーとカスタムスクロールバーの使い分け・スクロール位置の保持・overflow設計・アクセシビリティを解説する。

2026年3月3日
更新: 2026年9月3日
20
by Dengen Yosho(DGYS)

コンテンツがコンテナの高さ・幅を超えた時に、スクロールで閲覧できるようにするコンポーネント。ブラウザネイティブの overflow: auto/scroll と、デザインに統合されたカスタムスクロールバーの2種類がある。サイドバー・チャット・コードブロック・テーブルなど、コンテンツ量が不定な領域で広く使われる。

この記事を読むと、カスタムスクロールバー vs ネイティブスクロールバーの使い分け・overflow: auto vs overflow: scroll の違い・スクロール位置の保持・キーボードスクロールのアクセシビリティ対応が自分でできるようになります。


1. UI例(Preview / Live)

実装で見る(GunjoUI)

この部品を、デザインシステム GUNJO の実装で確かめられます。

2. 定義(Definition)

コンテンツがコンテナの境界を超えた時に、スクロールで閲覧できる領域を作るUIコンポーネント。CSSの overflow プロパティで実装するシンプルなものから、shadcn/ui の ScrollArea のようにカスタムスクロールバーを持つものまで幅広い。

overflow の使い分け

スクロールバー表示使い所
autoコンテンツが溢れた時だけ推奨。多くのケースで使う
scroll常時表示スクロールバーの有無でレイアウトが変わると困る場合
hidden非表示(スクロール不可)意図的にはみ出しを隠したい場合
clip非表示(スクロール不可・JS制御なし)パフォーマンス

3. 使い分け(When to use / When NOT to use)

3.1 When to use

  • サイドバー項目が多くなった時の縦スクロール
  • チャット・メッセージ履歴:新メッセージで最下部にスクロール
  • コードブロック:横方向に長いコードの横スクロール
  • カードの横並びリスト:モバイルでの横スクロールカルーセル
  • ドロップダウンの選択肢リスト:選択肢が多い時の縦スクロール

3.2 When NOT to use

  • ページ全体のスクロール:ブラウザネイティブのスクロールに任せる(overflow: hidden をbodyに設定しない)
  • コンテンツが常に収まる場合:不要な overflow: scroll で常時スクロールバーを表示しない

4. 設計判断の核(Decision Principles)

Scroll Areaの核は「スクロールの存在をユーザーに知らせること」——コンテンツが隠れていることに気づかないと、ユーザーは情報を見逃す。

判断の優先順位:① overflow: auto vs scroll の選択 → ② スクロール可能であることの視覚的ヒント → ③ キーボードアクセシビリティ → ④ スクロール位置の保持

  • overflow: auto を基本とするoverflow: scroll は常にスクロールバーを表示してレイアウトに影響する。overflow: auto はコンテンツが溢れた時だけスクロールバーを表示するため、ほとんどのケースで auto が正しい選択
  • 横スクロール領域には「続きがある」ことを示す:横スクロールは縦スクロールと異なりユーザーが気づきにくい。右端にグラデーションフェード、またはシャドウを付けることで「右にコンテンツが続く」ことを視覚的に示す
  • tabIndex={0} でキーボードスクロールを有効にする:スクロール可能な要素がフォーカス可能でないと、キーボードユーザーが矢印キー・PageUp/PageDown でスクロールできない。tabIndex={0} を付与して必ずキーボードでもスクロールできるようにする
  • チャットは最新メッセージを常に最下部に表示するuseEffect で新メッセージが追加された時に scrollIntoView({ behavior: 'smooth' }) を呼び出すか、scrollTop = scrollHeight を設定して最下部を維持する

5. 状態設計(States)

状態表示
コンテンツが収まるスクロールバーなし(overflow: auto の場合)
コンテンツが溢れるスクロールバー表示
スクロール中ホバー時スクロールバー強調(カスタムの場合)
最上部 / 最下部フェードで端を示す

6. バリエーション設計(Variants)

バリアント方向使用例
縦スクロールoverflow-y: autoサイドバー・リスト・チャット
横スクロールoverflow-x: autoテーブル・カード列・コードブロック
縦横両方overflow: autoコードエディター・地図・キャンバス
カスタムスクロールバー@radix-ui/react-scroll-areaデザイン統一が必要なサイドバー・パネル

ネイティブ vs カスタムの判断

  • モバイル → ネイティブ一択(iOS/AndroidのモメンタムスクロールはCSSで再現が難しい)
  • デスクトップ、デザイン統一が重要な場面 → カスタム(shadcn/ui の ScrollArea
  • シンプルなオーバーフロー制御 → overflow: auto + CSS のみ

7. パターン集(Good / Bad / How to fix)

7.0 よく崩れる設計パターン(3つ)

  • overflow: hidden を親要素に設定してスクロールを完全に封じる:コンテンツが見えなくなり、ユーザーが情報を取得できない(特にモーダル外の body に設定する場合は注意)
  • 横スクロール領域に視覚的ヒントがない:ユーザーが横にコンテンツが続くことに気づかず、情報を見逃す
  • tabIndex なしのスクロール領域:キーボードユーザーがその領域にフォーカスできず、矢印キーでスクロールできない

7.1 Bad(典型3つ)

  • overflow: scroll を使い、コンテンツが収まっていても常にスクロールバーが表示されてレイアウトが崩れる
  • 横スクロール可能なテーブルに何も視覚的ヒントがなく、右側のカラムがあることに気づかれない
  • <div style="overflow: auto; height: 200px">tabIndex がなく、Tabキーでフォーカスできない

7.2 Good(対になる3つ)

  • overflow-y: auto でコンテンツが溢れた時だけスクロールバーを表示する
  • 横スクロール領域の右端に background: linear-gradient(to right, transparent, white) のフェードを重ねて「続きがある」ことを示す
  • <div role="region" aria-label="..." tabIndex={0}> でキーボードフォーカスとスクリーンリーダーへの伝達を両立する

7.3 How to fix(手順)

  1. overflow: scrolloverflow: auto に変更する
  2. スクロール可能な要素に tabIndex={0} を追加する
  3. role="region" + aria-label="[コンテンツの説明]" を付与する
  4. 横スクロール領域に右端フェードのグラデーションを追加する(CSS ::after 疑似要素または絶対配置の div

8. ルール(Must / Better)

Must(守らないと壊れる)

Better(品質が跳ねる)


9. アクセシビリティ要件(必須)

Keyboard

  • Tab でスクロール領域にフォーカス
  • / / / でスクロール
  • PageUp / PageDown でページ単位スクロール
  • Home / End で先頭 / 末尾にジャンプ

Screen Reader

<!-- 縦スクロール領域 -->
<div
  role="region"
  aria-label="通知一覧"
  tabIndex="0"
  style="overflow-y: auto; height: 300px;"
>
  <!-- コンテンツ -->
</div>

<!-- チャット履歴 -->
<div
  role="log"
  aria-label="チャット履歴"
  aria-live="polite"
  tabIndex="0"
  style="overflow-y: auto;"
>
  <!-- メッセージ -->
</div>

チャット・メッセージ履歴には role="log" + aria-live="polite" を使う。通常のスクロール領域には role="region" を使う。


10. 実装メモ(Implementation Notes)

  • shadcn/ui の ScrollArea@radix-ui/react-scroll-area ベース。OSのスクロールバーを非表示にして、カスタムスクロールバーをCSSで描画するため、WindowsとmacOSで見た目が統一される
  • ネイティブスクロールバーのスタイルをCSSだけで変更したい場合は ::-webkit-scrollbar(Chromium系)を使えるが、Firefox は scrollbar-colorscrollbar-width を使う。クロスブラウザ対応には両方の記述が必要
  • スクロール位置の保持(ページ遷移後に元の位置に戻る)は sessionStorage にスクロール位置を保存し、ページ復帰時に scrollTop を復元する実装が一般的

11. 関連リンク


12. まとめ

Scroll Areaの設計で最重要なのは「スクロールの存在をユーザーに知らせること」と「キーボードアクセシビリティ」です。迷ったら 4. 設計判断の核 に戻り、「overflow: auto を使っているか」「tabIndex={0} があるか」「横スクロール領域に視覚的ヒントがあるか」の3点を確認してください。ネイティブスクロールかカスタムスクロールかの選択は、モバイルファーストならネイティブ、デスクトップでデザインの統一が重要ならカスタムという基準で判断します。

更新のお知らせ

サイトに載せていない実例や、新しい記事のお知らせはこちらで出しています。

読んだ内容を、自分の画面に当てるとき

UIXHEROは、記事を書くほかに、画面の検品・判定、デザインシステムの構築、実装と改善の伴走を受けています。何を頼めばいいか決まっていない段階の相談も、同じ窓口で受けます。

UIXHEROに頼めることを見る

※ 記事の内容についての質問や、書いてほしいテーマの要望も同じ窓口で受けています

記事をシェア

メールでお知らせを受け取る

最終更新: 2026年9月3日

この記事を書いた人

Dengen Yosho(DGYS)

Dengen Yosho(DGYS)

UI/UXデザイナー兼デザインエンジニア デザイン歴25年以上 情報設計〜UIデザイン〜React/TypeScriptによる実装までを一気通貫で担当 大手企業のDXプロジェクトや決済アプリ領域で、デザインリードとして改善と構築を経験 現在はフリーランスとして、プロダクトのUI/UX改善とデザインシステム構築を支援 長年の実務の中で感じてきたのは、 「良いUI」はセンスではなく、再現可能な判断の積み重ねであるということ UIXHEROは、 心理学や行動科学の知見を、現場で使える設計言語に翻訳するための場所 関心領域は「ユーザーの行動が変わるUI」 人の認知・注意・意思決定の構造を理解し、 “なぜそのUIが機能するのか”を言語化することを目指している

あわせて読みたい

この記事に関連する記事をご紹介します

Bar Chart(棒グラフ)

カテゴリごとの量を棒の長さで比べるチャート。ゼロ基線の扱い、並び順、縦横の選び方、しきい値の見せ方という設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
18

Donut Chart(ドーナツチャート)

中央をくり抜いた円で構成比を示すチャート。中央に置く値の選び方、円グラフとの使い分け、リングの太さ、凡例の作りという設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
17

Gauge Chart(ゲージチャート)

1つの値を範囲の中に置いて示す半円のチャート。範囲の両端に意味があるかという条件、しきい値の帯の設計、色だけで良否を伝えない書き方という設計判断とアクセシビリティ要件を解説する。

2026年8月27日
16

もっと深く知りたいですか?

ここに掲載されていないトピックについても、リクエストがあれば解説記事を追加します。 わかりにくい点や、具体的な事例について知りたいことがあれば教えてください。

リクエストを送る