要素の高さを下から上へ、上から下へ制御する CSS メソッド

要素の高さを下から上へ、上から下へ制御する CSS メソッド

よくある質問から議論を始めましょう。CSS を使用して要素の高さを [ブラウザ コンテンツ ウィンドウの高さ] に設定する方法。

解決策1: 要素を画面の高さいっぱいにする

CSS では、vh は長さを表す特別な単位です。100vh の値は [ブラウザ コンテンツ ウィンドウの高さ] です。

したがって、 height:100vh;は、ターゲット要素の高さを [ブラウザ コンテンツ ウィンドウの高さ] にします。

解決策 2: カスケードの高さ:100% を使用します。

方法 1 では、[ブラウザ コンテンツ ウィンドウの高さ] を持つ要素を 1 つだけ設定できます。しかし、一連の要素をまとめて高さ全体を占めるようにしたい場合はどうすればよいでしょうか?

この要件は、Web アプリケーションのシナリオでは非常に一般的です。 Web アプリケーションをネイティブ アプリケーションのように見えるようにするには、アプリケーションの全体的な構造が常に画面全体を占め、それ以上でもそれ以下でもなく、スクロール バーも表示されないことが望まれます。スクロールする必要があるコンテンツが大量にある場合、アプリケーション内の div にスクロール バーが表示されますが、アプリケーションの本体はスクロールしません。

これは、全体の高さがコンテンツの高さに完全に依存する、高さが折りたたまれた例であり、見苦しいです。

これは高さが大きすぎる例です。アプリケーション全体にスクロール バーが表示され、上部のバーはスクロールして消すことができます。

ページ全体をスクロールできる場合、下にスクロールすると、上部のバーの内容も上にスクロールして消えます。これは通常の Web ページではよく行われますが、Web アプリケーションでは発生しません。

これは極めて普通の例です。適切に実装された Web アプリケーションでは、アプリケーション全体をスクロールすることはできませんが、中央のコンテンツ ウィンドウはスクロールできます。

解決策: 上から下まで高さを制御する

高さの崩壊と高さの過剰の理由は実際には同じです。親要素の高さは子要素の高さの影響を受けます。つまり、親要素は子要素によって「拡張」されます。高度な制御はボトムアップです。

親要素の高さが子要素によって引き伸ばされる理由は、 height のデフォルト値がautoであり、 auto の計算方法が子要素に基づいているためです。

したがって、これら 2 つの問題を解決するには、高度制御の方向を逆にして、高度を上から下に制御する必要があります。具体的には、要素の高さを明示的に定義するか、「祖父要素」の高さを基準とした相対的な高さ(パーセンテージ)を設定します。

  1. 明示的な高さを定義する: 要素の高さが子要素の影響を受けないように、要素の高さに明示的な値を指定します。たとえば、 height:480px;またはheight:100vh
  2. 「祖父要素」の高さを基準とした相対的な高さを設定します。要素の高さは親要素の高さによって決まるため、子要素の影響を受けません。これを行うには、高さのパーセンテージを使用します: height:100%;またはheight:90%;

上記 2 つのポイントを柔軟に活用することで、開発者はアプリケーション全体の各要素の高さを制御できます。

上記の Web アプリケーションの例では、解決策は次のとおりです。

まず、<html> 要素の高さを 100% に設定します。これにより、html 要素の高さがビューポート (コンテンツ ウィンドウ) の高さと正確に等しくなります。次に、body の高さを 100% に設定します。これにより、body 要素の高さが html 要素の高さ (ビューポートの高さと等しい) と正確に等しくなります。
画面を埋め尽くす要素に到達するまで、上から下までこのように続け、その要素の高さがビューポートの高さと同じになるように、その要素の高さを 100% に設定します。

これはトップダウンの特殊なケースです。実際、上から下までの高さを設定する場合、レイアウトのニーズに応じて、固定値 (100 ピクセル) またはその他のパーセンテージの高さ (80%) を設定できます。

この方法は、ターゲット要素にheight:100vh;を直接設定するよりもはるかに面倒です。しかし、この方法には利点があります。このプロセスでは、すべての祖先要素の高さを制御できます。子要素の高さを意図的に親要素よりも大きく設定しない限り、各親要素は子要素を収容することができ、ほとんどの場合、これが望ましい状態になります。 「子要素の高さは100pxなのに、親要素の高さが拡張されない」といった問題は発生しません。

対象要素のheight:100vh;に設定し、親要素の高さが上から下に決定される場合(子要素の影響を受けない場合)、親要素は元の高さを維持し、拡張されず、オーバーフローが発生します。このとき、「子要素の高さはxxxであるが、親要素の高さが拡張されない」という問題が発生します。

トップダウンの実用的なヒント:子要素が親要素の残りの領域を埋めるようにする

トップダウンアプローチには非常に実用的なトリックがあります:

<html>
  <本文>
    <ヘッダー></ヘッダー>
    <div class="content"></div>
  </本文>
</html>

<html> と <body> の高さがすでに決まっていて (100% ビューポート)、ヘッダーの高さも決まっている (64px) 場合、ヘッダーの下のdiv.content親要素の残りの領域を埋めるようにするにはどうすればよいでしょうか。答えも非常に簡単で、 div.content { height: 100%; }を設定するだけです。 100% は親要素の残りの使用可能な高さを基準に計算されるため、この CSS により div.content が親要素の残りの領域を埋めるようになります。
この図の効果は次のように実現されます。

トップダウン対ボトムアップ

これは必ずしもトップダウンがボトムアップよりも優れているということを意味するものではありません。

トップダウンアプローチの利点は、祖先要素の高さが定義されている限り、子孫要素の高さもそれに応じて決定されることです。

ボトムアップの利点は、親要素の高さが必要に応じて自動的に拡張され、すべての子要素をラップできることです。

Web アプリケーションでは、これら 2 つの方法を混在させる必要があることがよくあります。

コンテンツのオーバーフローに注意

親要素のコンテンツ ボックスが子要素を収容できない場合にオーバーフローが発生することに注意してください。

トップダウンとボトムアップのアプローチを混在させると、次のような問題が発生する可能性があります。

A 要素は B 要素の親要素です。要素 A の高さは上から下に決定され (例: height:80% )、要素 B の高さは下から上に決定されます ( height:auto )。 B の子要素が B の高さを拡張し、A のコンテンツ ボックスの高さを超えると、オーバーフローが発生します。

この時点で、次の 2 つのオプションを検討してください。

  1. B の高さを制限します。つまり、B 要素の高さに親要素の高さを超えない値を指定します。たとえば、 height:100pxまたはheight:100%
  2. B の内容を A 要素に表示したい場合は、A にoverflow:autoを設定します。この方法により、限られたスペース内でスクロール バーを使用してより大きなコンテンツを表示できるようになります。

チャットウィンドウはoverflow:autoの例です

参考文献

https://stackoverflow.com/questions/7357818/how-can-an-html-element-fill-out-100-of-the-remaining-screen-height-using-css
https://stackoverflow.com/questions/1575141/how-to-make-a-div-100-height-of-the-browser-window
https://stackoverflow.com/questions/31893330/html-and-body-elements-height/31895805#31895805
https://www.w3.org/TR/2011/REC-CSS2-20110607/visudet.html#ルート高さ

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

<<:  XHTMLコードの一般的なアプリケーション問題をまとめる

>>:  Vueは州、都市、地区のカスケード選択を実現します

推薦する

アニメーションの再生と一時停止を制御するための CSS のヒント (非常に実用的)

今日は、CSS を使用してアニメーションの再生と一時停止を制御する非常に簡単なトリックを紹介します。...

Docker-compose ワンクリックデプロイ gitlab 中国語版の方法手順

1. GitLabの紹介Gitlab 公式アドレス: https://about.gitlab.co...

mysql 5.7.18 winx64 パスワード変更

MySQL 5.7.18 が正常にインストールされた後、バージョン 5.7 では空のパスワードでのロ...

ffmpeg コマンドラインを使用してビデオを変換するためのサンプルコード

この記事の本文を始める前に、まず ffmpeg プログラムをインストールする必要があります (Lin...

Vue が配列の変更を監視できない問題の解決方法

目次1. Vueリスナー配列2. vueが配列の変更を監視できない状況1. Vueリスナー配列Vue...

Linux リダイレクトの使用方法の詳細な説明

誰でも時々データをコピーして貼り付ける必要があると思います。コピーして貼り付けるためにファイルを開く...

JavaScript のクロージャの詳細な説明

導入クロージャは JavaScript の非常に強力な機能です。いわゆるクロージャは関数内の関数です...

コンテンツウェブページの画像プレビューのデザイン

<br />以前、「コンテンツページ番号のプレビューナビゲーション」と「写真プレビューナ...

Node.jsサービスDockerコンテナアプリケーション実践のまとめ

この記事では、Docker コマンドの使用とインストールについては説明しません。Docker を基礎...

ローカル フォルダー内の画像を読み込んで表示するための HTML サンプル コード

一つの目的Html ページでローカル フォルダーを選択すると、フォルダーとそのサブフォルダー内のすべ...

Nginx を使用して rtmp ライブ サーバーを実行する方法

今回は、コンピューターや携帯電話用の rtmp ライブ ブロードキャスト サーバーを設定し、ライブ ...

レスポンシブ Web をデザインするにはどうすればいいですか?レスポンシブウェブデザインのメリットとデメリット

最近レスポンシブ デザインについて学んでいて、これについていくつか整理してみました。写真の一部はイン...

MySQLユーザー管理操作例の分析

この記事では、MySQL ユーザー管理操作について説明します。ご参考までに、詳細は以下の通りです。こ...

VirtualBox でのホストオンリー + NAT モードのネットワーク構成

VirtualBoxのHost Only+NATモードのネットワーク構成は参考用です。具体的な内容は...