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の詳細なコード

推薦する

Linux と最もよく使用されるコマンドの紹介 (習得は簡単ですが、問題の 95% 以上を解決できます)

Linux は現在最も広く使用されているサーバー オペレーティング システムです。Unix をベー...

HTMLの水平線注釈とコードコメントの使い方をマスターするだけです

水平線<hr /> タグを使用して、現在の位置に水平の分割線を描画します。例: XML/...

mysqldump でデータベースをバックアップするときに特定のライブラリを除外する例

例: mysqldump –all-databases を使用すると、すべてのライブラリがエクスポー...

Docker を使用して Go Web アプリケーションをデプロイする方法

目次なぜ Docker が必要なのでしょうか? Docker デプロイメントの例コードの準備Dock...

JSはスネークゲームを実装する

目次1. 初期化構造2. 蛇の色のレンダリング3. ヘビの動き4. ヘビの死を判定する方法 ヘビの死...

CentOS 7.4 に MySQL 5.7 を手動でインストールする方法

MySQL データベースは、特に JAVA プログラマーの間で広く使用されています。クラウド データ...

Vueコンポーネント間のデータ共有の詳細な説明

目次1. プロジェクト開発において、コンポーネント間の最も一般的な関係は次の 2 つのタイプに分けら...

MySql の 4 つのトランザクション分離レベルについて簡単に説明します。

分離レベル:隔離はあなたが考えるよりも複雑です。 SQL 標準では 4 つの分離レベルが定義されてお...

Vueはフィルターを使用して日付をフォーマットします

この記事では、フィルターを使用して日付をフォーマットするVueの具体的なコードを参考までに紹介します...

ウェブページにコンテンツが多すぎる場合に、下から上へ素早く戻る方法

Web フロントエンド開発では、ページに多くの記事を表示することが避けられません。記事の最後にあるク...

mysql 複数テーブル接続削除関数の削除

単一のテーブルを削除する: tableName から columnName = value を削除し...

ドッカー専用倉庫港湾建設プロセス

1. 準備1.1 港ダウンロードハーバーダウンロードアドレス:リンクリンクの説明を追加し、必要なバー...

Youdaの新しいプチビューの実装

目次序文導入ライブ使いやすいルートスコープマウント要素の指定ライフサイクルコンポーネントグローバル状...

CentOS7 64でのMySQL5.6.40の詳細なインストール手順

CentOS7 64でのMySQL5.6.40のインストール手順1) 以前にインストールしたMySQ...

JavaScriptは入力ボックスコンポーネントを実装します

この記事では、入力ボックスコンポーネントを手動で実装するための具体的なコードを参考までに紹介します。...