オーバーフロー

コンテンツが親の範囲を超える場合、そのコンテンツを処理する方法はいくつかあります。スクロールすることで、スペースを追加したり、はみ出た端をクリップしたり、カットオフを省略記号で示したりできます。スマートフォン アプリや複数の画面サイズ向けの開発では、オーバーフローを考慮することが特に重要です。

CSS には 2 つの異なるクリッピング オプションがあります。text-overflow は個々のテキスト行に使用し、overflow プロパティはボックスモデルのオーバーフローを制御するために使用します。

text-overflow を使用した単一行のオーバーフロー

テキストノードを含む要素(段落 <p> など)に text-overflow プロパティを使用します。要素の使用可能なスペースに収まらない場合の、テキストの表示方法を指定します。ページ上で表示可能な HTML テキストはすべて、テキストノードにあります。text-overflow を使用するには、折り返しのない 1 行のテキストが必要です。そのため、overflowhidden に設定し、折り返しを防止する white-space 値も設定する必要があります。

p {
   
text-overflow: ellipsis;
   
overflow: hidden;
   
white-space: nowrap;
}

オーバーフロー プロパティの使用

オーバーフロー プロパティは、子に利用可能なスペースよりも多くのスペースが必要な場合の処理を制御するために、要素に設定します。これは、Google マップなどのインタラクティブ マップのように、ユーザーが特定のサイズに切り抜かれた大きな画像をパンするような場合に意図的に行うことができます。また、チャット アプリケーションでは、ふきだしに収まらない長いメッセージをユーザーが入力するなど、意図しない結果になることもあります。

オーバーフローは 2 つの部分に分けられます。親要素には、変更されない厳密に制約されたスペースがあります。これはウィンドウと考えることができます。子要素は、親からより多くのスペースを必要とするコンテンツです。これは、ウィンドウを通して見ているものと考えることができます。オーバーフローを管理すると、このコンテンツのウィンドウ フレームの仕組みがわかりやすくなります。

垂直軸と水平軸でのスクロール

overflow-y プロパティは、デバイスのビューポートの縦軸に沿った物理的なオーバーフローを制御します(上下にスクロール)。

overflow-x プロパティ コントロールは、デバイスのビューポートの横軸に沿ってオーバーフローするため、左右にスクロールします。

スクロール方向の論理プロパティ

対応ブラウザ

  • Chrome: サポートされていません。 <ph type="x-smartling-placeholder">
  • Edge: サポートされていません。
  • Firefox: 69。 <ph type="x-smartling-placeholder">
  • Safari: サポートされていません。

ソース

overflow-inline プロパティと overflow-block プロパティは、ドキュメントの方向と書き込みモードに基づいてオーバーフローを設定します。

overflow の省略形

overflow 省略表記では、overflow-x スタイルと overflow-y スタイルの両方を 1 行で設定します。

overflow: hidden scroll;

2 つのキーワードを指定すると、1 つ目のキーワードが overflow-x に適用され、2 つ目のキーワードが overflow-y に適用されます。それ以外の場合は、overflow-xoverflow-y の両方で同じ値が使用されます。

overflow プロパティで使用できる値とキーワードについて詳しく見てみましょう。

overflow: visible(デフォルト)
このプロパティを設定しない場合は、overflow: visible がウェブのデフォルト値になります。これにより、コンテンツが意図せず非表示になることがなくなり、「コンテンツを非表示にしない」または「正確なレイアウトの安全なレイアウト」という基本原則に沿ったレイアウトが実現します。
overflow: hidden
overflow: hidden では、コンテンツは指定された方向にクリップされ、それを表示するためのスクロールバーは表示されません。
overflow: scroll
overflow: scroll は、スクロールバーを有効にして、ユーザーがコンテンツをスクロールできるようにします。現在コンテンツがオーバーフローしていない場合でも、スクロールバーが表示されます。これは、サイズ変更などに基づいてコンテナがスクロール可能になる可能性がある場合に、将来のレイアウト シフトを減らし、スクロール可能な領域を視覚的にユーザーに準備するための優れた方法です。
overflow: clip
overflow: hidden と同様に、overflow: clip のコンテンツは要素のパディング ボックスにクリップされます。cliphidden の違いは、clip キーワードではプログラマティック スクロールを含むすべてのスクロールも禁止される点です。
overflow: auto
最後に、最もよく使用される値の overflow: auto です。これにより、ユーザーの設定に従って、必要に応じてスクロールバーが表示されますが、デフォルトでは非表示になり、スクロールはユーザーとブラウザに委ねられます。

スクロールとオーバーフロー

これらの overflow の動作の多くはスクロールバーを導入しますが、オーバーフロー コンテナでのスクロールを制御できる特定のスクロール動作とプロパティがいくつかあります。

スクロールとユーザー補助

スクロール可能な領域がフォーカスを受け取れるようにすることが重要です。これにより、キーボード ユーザーは Tab キーでボックスに移動し、矢印キーを使用してスクロールできます。

スクロール ボックスにフォーカスを設定できるようにするには、tabindex="0"aria-labelledby 属性を持つ名前、適切な role 属性を追加します。例:

<div tabindex="0" role="region" aria-labelledby="id-of-descriptive-text">
    content
</div>

CSS を使って、ボックスにフォーカスがあることを示すと、outline プロパティを使用して、スクロール可能になったことを視覚的に示せます。

Using CSS to Enforce Accessibility』で、Adrian Roselli は CSS がユーザー補助の低下を防ぐのにどのように役立つかを紹介しています。たとえば、正しい属性が使用されている場合にのみ、スクロールを有効にしてフォーカス インジケーターを追加できます。次のルールでは、ボックスに tabindexaria-labelledbyrole の属性が含まれている場合にのみ、ボックスをスクロール可能にします。

[role][aria-labelledby][tabindex] {
 
overflow: auto;
}

[role][aria-labelledby][tabindex]:focus {
 
outline: .1em solid blue;
}

ボックスモデル内でのスクロールバーの位置

スクロールバーはパディング ボックス内のスペースを占有し、overlaid ではなく inline の場合、スペースを奪う可能性があります。レイアウト シフトの潜在的な原因について詳しくは、ボックスモデル モジュールをご覧ください。

root-scroller と impl-scroller

特にモバイル アプリやハイブリッド アプリを開発している場合、一部のスクロールにはプルして更新する動作やその他の特別な動作があることに気づくことがあります。このスクロール動作は、ルート スクロールで発生します。ページに存在するルート スクロールバーは 1 つだけです。デフォルトでは、documentElement がページのルート スクロールですが、ルート スクロールにする要素を変更することで、documentElement 以外のスクロールに特別な動作を適用できます。この新しいスクロールを暗黙的なルート スクロールと呼びます。

ルート スクローラーを作成するには、スクローラー プロモーションと呼ばれる手法を使用します。コンテナを固定として配置することで、ビューポート全体を覆い、スクローラーを上に Z-Index で配置します。ルート スクローラーとネストされた暗黙的スクローラーについては、こちらをご覧ください。

この動画では、バウンス動作と新しいスタイル設定機能(
)を備えたルート スクロールと、拡張されたスクロール動作のない暗黙的なスクロールを比較しています。

scroll-behavior

対応ブラウザ

  • Chrome: 61。
  • Edge: 79. <ph type="x-smartling-placeholder">
  • Firefox: 36.
  • Safari: 15.4。

ソース

scroll-behavior を使用すると、ブラウザ制御による要素のスクロールを有効にできます。これにより、.scrollTo() やリンクなどのページ内ナビゲーションの処理方法を指定できます。

これは、prefers-reduced-motion と組み合わせて、ユーザー設定に基づいてスクロール動作を指定する場合に特に便利です。

@media (prefers-reduced-motion: no-preference) {
 
.scroll-view {
   
scroll-behavior: auto;
 
}
}

overscroll-behavior

対応ブラウザ

  • Chrome: 63.
  • Edge: 18. <ph type="x-smartling-placeholder">
  • Firefox: 59。
  • Safari: 16。

ソース

モーダル オーバーレイの終点に到達し、さらにスクロールを続けるとオーバーレイの背後にあるページが移動した場合、これはスクロール チェーン、つまり親のスクロール コンテナまでバブリングしている状態です。overscroll-behavior プロパティを使用すると、オーバーフロー スクロールが親コンテナに漏洩するのを防ぐことができます(スクロール チェーンと呼ばれます)。

理解度をチェックする

オバーフローの知識をテストする

テキスト オーバーフローと要素のオーバーフローは同じものですか?

false
true

overflow プロパティは 2 つのキーワードを受け入れます。最初のキーワードはどの軸用ですか。

カテゴリ
横向き

スクロールバーは、表示時とインライン表示時にボックスモデルのどのスペースを使用しますか?

マージン ボックス
コンテンツ ボックス
パディング ボックス
枠線ボックス

ネストされた暗黙的なスクローラーでスクロールによる追加の勢いを捕捉するには、どのプロパティを使用しますか。

scroll-behavior
scroll-hint
overscroll-behavior
overscroll-effect
scroll-padding

リソース

Smashing Magazine の CSS でのオーバーフローとデータ損失