CSSオーバーフローメカニズムについての簡単な説明

CSSオーバーフローメカニズムについての簡単な説明

CSS オーバーフローのメカニズムを詳細に学ぶ必要があるのはなぜですか?

実際の開発プロセスでは、コンテンツのオーバーフローがよく見られます。このメカニズムを深く理解していないと、「なぜこの要素は祖先要素の overflow:hidden の影響を受けないのか」といった疑問に遭遇することがよくあります。ここでスクロールバーが表示される要素はどれですか?このスクロールバーを削除するにはどうすればいいですか?特定の要素にスクロール機能を追加するにはどうすればよいですか?

この記事では、CSS 標準に基づいた CSS オーバーフロー メカニズムの詳細について説明します。

オーバーフロー

オーバーフローは、ボックス (ブロック コンテナー ボックス) の内容 (子要素、孫要素、およびその他の子孫) がボックス自体のサイズを超えた場合に発生します。このとき、CSS プロパティ overflow によってオーバーフローの処理方法が決まります。この CSS プロパティは誰もがよく知っているので、ここでは説明しません。注意が必要な点をいくつか示します。

オーバーフローは、要素のすべてのコンテンツのクリッピングとスクロールに影響しますが、例外が 1 つあります。「オーバーフローは、要素のビューポートまたは祖先を包含ブロックとする子孫要素 (およびそれぞれのコンテンツと子孫) を除く、要素のすべてのコンテンツのクリッピングに影響します。」つまり、オーバーフローが配置されている要素は、コンテンツ要素の直接または間接の包含ブロックである必要があり、オーバーフロー プロパティはこのコンテンツ要素に影響します。たとえば、<A><B><C><C/><B/><A/> です。一般的に、B のオーバーフローは C に影響します。ただし、C がビューポートまたは A に対して相対的に配置されている場合 (たとえば、position:absolute を使用)、C の表示は B の切り取りやスクロールの影響を受けません。

スクロール バーが必要な場合は、境界線とパディングの間に配置されます。親要素がスクロール バーを生成すると、スクロール バー用のスペースを確保するために、生成される包含ブロックのサイズが縮小されます。

<html> と <body> のオーバーフロー プロパティが浮上します。「UA は、ルート要素に設定された 'overflow' プロパティをビューポートに適用する必要があります。ルート要素が HTML の "HTML" 要素または XHTML の "html" 要素であり、その要素に HTML の "BODY" 要素または XHTML の "body" 要素が子として存在する場合、ルート要素の値が 'visible' であれば、ユーザー エージェントは代わりに最初の子要素からビューポートに 'overflow' プロパティを適用する必要があります。ビューポートに使用される 'visible' 値は 'auto' として解釈される必要があります。値が伝播される要素は、'overflow' に 'visible' という値を使用する必要があります。」

次のように推測できます。

一般的に言えば、スクロール バーを持つことができるのは要素のみです (より正確には、ブロック コンテナー ボックスを生成する要素のみがスクロール バーを持つことができます)。ビジュアルビューポートは例外です。要素ではありませんが、スクロールバーを持つこともできます。 <html> と <body> に overflow 属性が設定されておらず、デフォルト値の visible が使用されている場合 (ほとんどのシナリオではこれが当てはまります)、ビジュアル ビューポートのオーバーフローは自動になります。つまり、Web ページのコンテンツがビジュアル ビューポートを超えると、ビジュアル ビューポートにスクロール バーが表示されます。

<html> の最終的なオーバーフローは常に表示されます。つまり、<html> 要素にはスクロール バーを含めることはできません。

<body> に非表示のオーバーフローを設定する場合は、<body> のオーバーフローがバブルされないように、まず <html> にバブルする非表示の値を設定する必要があります。ちょっとした練習

ちょっとした練習:

上記の原則を使用すると、ビジュアル ビューポートと <body> の両方に水平スクロール バーと垂直スクロール バーが含まれ、合計 4 つのスクロール バーになります。 overflow: scroll は使用できません (簡単すぎるため)。

ステップ:

  • スクロール バーが表示されるように、ビジュアル ビューポートと <body> の両方の最終オーバーフロー値を auto に設定します。
  • 視覚的なビューポートと <body> のオーバーフローをトリガーします。コンテンツのサイズを大きく設定することでこれを実行します。

コード + コメント:

<!DOCTYPE html>
<html lang="ja">

<ヘッド>
  <メタ文字セット="UTF-8">
  <meta name="viewport" content="width=デバイス幅、初期スケール=1、ユーザースケーラブル=いいえ">
  <title>テスト</title>
  <スタイル>
    * {
      パディング: 0;
      マージン: 0;
      ボックスのサイズ: 境界線ボックス;
    }

    html{
      /* HTML を常にビジュアル ビューポートと同じサイズにします (ブラウザー ウィンドウをズームまたはサイズ変更した場合でも)。これにより、本体をビジュアル ビューポートよりも大きいサイズ (110%) に設定できるようになります。
      デフォルトでブロックとなる要素の場合、width: 100% は省略できます。*/
      幅: 100%;
      高さ: 100%;
      /* 非表示の値はビジュアルビューポートにバブルされ、ビジュアルビューポートにスクロールバーを表示できるようになります*/
      オーバーフロー:自動;
      境界線: 15px 赤
    }

    体 {
      /* 本文をスクロール可能にする*/
      オーバーフロー:自動;
      /* 本文が HTML をオーバーフローし、その結果、最初の包含ブロックがオーバーフローし、ビジュアル ビューポートがオーバーフローして、ビジュアル ビューポートにスクロール バーが表示されます。
      もちろん、HTML 要素のサイズを大きくしたり、本文に position: absolute div を作成したりするなど、他のさまざまな方法でビジュアル ビューポートのオーバーフローをトリガーすることもできます */
      幅: 110%;
      高さ: 110%;
      境界線: 15px 緑
    }

    主要 {
      /* main が body をオーバーフローし、スクロール バーが body に表示される */
      幅: 110%;
      高さ: 110%;
      境界線: 15px 青一色;
    }
  </スタイル>
</head>

<本文>
  <メイン>
  </メイン>
</本文>

</html>

結果:

上記のコードを Chrome で自分で開くと、どのように実行されるかがより明確にわかります。

絶対的な方法で最初の包含ブロックをオーバーフローすることも可能です。

<!DOCTYPE html>
<html lang="ja">

<ヘッド>
  <メタ文字セット="UTF-8">
  <meta name="viewport" content="width=デバイス幅、初期スケール=1、ユーザースケーラブル=いいえ">
  <title>テスト</title>
  <スタイル>
    * {
      パディング: 0;
      マージン: 0;
      ボックスのサイズ: 境界線ボックス;
    }

    html{
      /* HTML を常にビジュアル ビューポートと同じサイズにします (ブラウザー ウィンドウをズームまたはサイズ変更した場合でも)。これにより、本体をビジュアル ビューポートよりも大きいサイズ (110%) に設定できるようになります。
      デフォルトでブロックとなる要素の場合、width: 100% は省略できます。*/
      幅: 100%;
      高さ: 100%;
      /* 非表示の値はビジュアルビューポートにバブルされ、ビジュアルビューポートにスクロールバーを表示できるようになります*/
      オーバーフロー:自動;
      境界線: 15px 赤
    }

    体 {
      /* 本文をスクロール可能にする*/
      オーバーフロー:自動;
      /* main を body よりも大きいサイズ (110%) に設定できるように body のサイズを設定します。
      デフォルトでブロックとなる要素の場合、width: 100% は省略できます。*/
      高さ: 100%;
      境界線: 15px 緑
    }

    主要 {
      /* main が body をオーバーフローし、スクロール バーが body に表示される */
      幅: 110%;
      高さ: 110%;
      境界線: 15px 青
    }

    .abs {
      /* 絶対的な方法で最初の包含ブロックをオーバーフローし、ビューポートをオーバーフローします */
      位置: 絶対;
      幅: 100ピクセル;
      高さ: 100px;
      右: -100px;
      下: -100px;
      境界線: 15px 実線青紫;
    }
  </スタイル>
</head>

<本文>
  <メイン>
  </メイン>

  <div class="abs"></div>
</本文>

</html>

結果:

上記のコードを Chrome で自分で開くと、どのように実行されるかがより明確にわかります。

スクロール バーがどの要素に属しているかを確認するにはどうすればよいでしょうか?

スクロールバーが属する要素は、Chrome DevTools を通じて確認できます。

前述したように、スクロール バーは要素の境界線とパディングの間に配置されます。 Chrome DevTools を使用して要素を選択し、スクロール バーがハイライト表示された領域 (境界線) のすぐ内側にあることがわかった場合、スクロール バーは現在の要素に属しています。

スクロール バーがビジュアル ビューポートに属しているかどうかを判断するには、まず右と下のスクロール バーをそれぞれ下と右にスクロールします (この手順は非常に重要で、スクロール バーの下に隠れたコンテンツがないことを確認します)。次に、 Ctrl+Shift+Cを押して、右側または下部のスクロール バーを選択します。強調表示された領域にスクロール バーが含まれていない場合、スクロール バーはどの要素にも属していない、つまりビジュアル ビューポートに属していることを意味します。

参考文献

CSS2.1 標準

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

<<:  ウェブページ HTML 順序付きリスト ol と順序なしリスト ul

>>:  シャトルボックス機能を実装するためのVueの詳細なコード

推薦する

Windows 10 での MySQL 8.0.22 のインストールと設定方法のグラフィック チュートリアル

MySQL 8.0.22のインストールと設定方法のグラフィックチュートリアル、参考までに、具体的な内...

JavaScript でローカル変数をグローバル変数に変換する方法

まず関数の自己呼び出しを知る必要がある関数の自己呼び出し - 自己呼び出し関数1 回限りの関数 - ...

Innodb システムテーブルスペースのメンテナンス方法

環境説明:実行中の MySQL 環境があります。以前の構成ファイルの設定が単純すぎたため (inno...

CSS でフローティングにより親要素の高さが崩れる問題を解決するいくつかの方法

以前は、フロートはレイアウトによく使用されていましたが、フローティングレイアウトを使用すると親要素の...

Windows 8 での ssh コマンドの使用記録

1. 仮想マシンとgit bashウィンドウを開き、接続の準備をします2. 仮想マシンでifconf...

JavaScript でピンボール ゲームの Web バージョンを実装する

参考までに、JavaScriptのオブジェクトとメソッドを使用して実装されたWebピンボールゲームを...

Linux trコマンドの使い方

01. コマンドの概要tr コマンドは、標準入力からの文字を置換、圧縮、削除できます。ある文字セット...

MySQL 5.7.17無料インストール版のインストールと設定

MYSQLバージョン:MySQL Community Server 5.7.17、インストール不要版...

MySQL 変数宣言とストアド プロシージャの分析

変数の宣言グローバル変数の設定@a='新しい変数' を設定します。関数やストアドプロ...

Ubuntu での Subversion (SVN) の詳細なインストールと設定

ソフトウェア開発者であれば、Subversion に精通している必要があります。 Subversio...

JavaScript で 24 以上の配列メソッドを手動で実装する

目次1. トラバーサルクラス1. 各2. 地図3. すべての4. いくつか5. フィルター6. 減ら...

MySQL テーブルスペースとは何ですか?

今日皆さんにお伝えしたいトピックは、「皆さんがよく話題にするテーブル スペースとは一体何でしょうか。...

Vue グローバル フィルターの概念、注意事項、基本的な使用方法

目次1. フィルターの概念1. グローバルフィルターのフォーマットをカスタマイズする2. フィルター...

MySQL の高度な機能 - データ テーブル パーティショニングの概念とメカニズムの詳細な説明

目次パーティション分割メカニズムSELECTクエリINSERT操作DELETE操作更新操作パーティシ...