CSS における重要なカスケード概念の詳細な説明

CSS における重要なカスケード概念の詳細な説明

最近、プロジェクトの過程で問題に遭遇しました。メニューバーを常に上部に表示し、後続の要素をその下に表示されるようにしたいのですが、その時はz-indexの設定がうまくいきませんでした。原因がわからなかったので、CSSスタッキングに関する情報を見つけてこの問題を解決しました。ここに記録があります〜

画面は 2 次元の平面ですが、HTML 要素は 3 次元の座標系に配置されます。x は水平位置、y は垂直位置、z は画面の内側から外側への位置です。画面を見るときは、z 軸に沿って外側から内側に見ます。そのため、ユーザーの観点からは、要素は積み重ね関係を形成します。要素は他の要素を覆ったり、他の要素に覆われたりすることがあります。

重要な概念をいくつか挙げます。スタッキングコンテキスト(スタッキングコンテキスト)、スタッキングレベル(スタッキングレベル)、スタッキング順序(スタッキング順序)、 Zインデックス

声明:

  • 次の位置決め要素はposition:absolute|fixed|relative|sticky
  • 次の非位置指定要素はposition:initial|staticを参照します。
  • スタック コンテキストに関する同様の概念として、ブロック フォーマットコンテキスト (BFC) があります。CSS の重要な BFC を参照できます。BFC では、ドキュメント フローのコンテンツもいくつか導入されています。
  • この記事はかなり長いですが、読む勇気があれば、スタッキングに関する基本的な概念を理解できるはずです(~o ̄▽ ̄)~

1. スタックコンテキスト

スタッキング コンテキストは、HTML における 3 次元の概念です。 CSS2.1 仕様では、各要素の位置は 3 次元です。要素が積み重ねられると、他の要素を覆ったり、他の要素に覆われたりすることがあります。Z 軸上の位置が高いほど、画面の観察者に近くなります。

記事「Z-index についてあなたが知らなかったこと」には良い例え話が載っているので、ここで引用します。

たくさんのアイテムが置かれたテーブルを想像してください。このテーブルは積み重ねコンテキストを表します。最初のテーブルの隣に 2 番目のテーブルがある場合、その 2 番目のテーブルは別のスタッキング コンテキストを表します。

ここで、最初のテーブルの上に 4 つの小さな立方体があり、それらはすべてテーブルの上に直接置かれていると想像してください。これら 4 つの小さな四角形の上にはガラスが置かれており、そのガラスの上にはフルーツの皿が置かれています。これらのブロック、ガラス片、フルーツ皿はそれぞれ、積み重ねコンテキスト (テーブル) 内の異なる積み重ねレベルを表します。

すべての Web ページにはデフォルトのスタック コンテキストがあります。このスタッキング コンテキスト (テーブル) のルートは<html></html>です。このデフォルトのスタッキング コンテキストでは、HTML タグ内のすべてのものが 1 つのスタッキング レベルに配置されます (項目はテーブル上に配置されます)。

配置された要素にauto以外の z-index 値を割り当てると、ページ上の他のスタッキング コンテキストやスタッキング レイヤーから独立した独自のスタッキング レイヤーを持つ新しいスタッキング コンテキストが作成されます。部屋に別のテーブルを持ち込むようなものです。

スタッキング コンテキスト 1 は、ドキュメント ルート要素によって形成されます。スタッキング コンテキスト 2 と 3 は、スタッキング コンテキスト 1 上のスタッキング レベルです。また、それぞれが新しいスタッキング レベルを含む新しいスタッキング コンテキストを形成します。

スタッキング コンテキスト内では、その子要素は上記で説明したルールに従ってスタックされます。スタッキング コンテキストを形成する方法は次のとおりです。

  • ルート要素<html></html>
  • position値はabsolute|relativeであり、 z-index値はautoはない
  • position値はfixed|stickyです
  • z-index値がautoではないflex要素、つまり親要素display:flex|inline-flex
  • opacity度が1未満の要素
  • transform属性値がnoneではない要素
  • mix-blend-mode属性値がnormalでない要素
  • filterperspectiveclip-pathmaskmask-imagemask-bordermotion-pathの値がnoneではない要素
  • perspective値がnone以外の要素
  • isolation属性がisolateに設定されている要素
  • will-change 、それらのプロパティの値を直接指定しない場合でも、CSSプロパティを指定します。
  • -webkit-overflow-scrollingプロパティがtouch要素に設定されている

要約:

スタッキング コンテキストは他のスタッキング コンテキスト内に含めることができ、一緒にスタッキング コンテキストの階層を形成します。

各スタッキング コンテキストは、その兄弟要素から完全に独立しています。スタッキングを処理するときは、子要素のみが考慮されます。これは BFC に似ています。

各スタッキング コンテキストは自己完結型です。要素のコンテンツがスタックされると、要素全体が親スタッキング コンテキスト内で順番にスタックされます。

2. スタッキングレベル

スタッキング レベルは、同じスタッキング コンテキスト内の Z 軸上の要素の表示順序の概念を決定します。

  • 通常の要素のスタック レベルは、スタック コンテキストによって決まります。
  • スタッキング レベルの比較は、同じスタッキング コンテキスト内でのみ意味を持ちます。
  • 同じスタッキング コンテキストでは、スタッキング レベルの記述によって、Z 軸上のスタッキング コンテキスト内の要素の上下の順序が定義されます。

スタック レベルは必ずしも z-index によって決定されるわけではないことに注意してください。z-index によって決定されるのは、配置された要素のスタック レベルのみです。他の種類の要素のスタック レベルは、スタック順序、HTML に表示される順序、および親の上にある要素のスタック レベルによって決定されます。詳細なルールについては、以下のスタック順序の概要を参照してください。

3. Zインデックス

CSS 2.1 では、すべてのボックス モデル要素は 3 次元座標系に配置されます。一般的に使用される水平軸と垂直軸に加えて、ボックス モデルの要素は「Z 軸」に沿って積み重ねることもできます。要素が重なり合う場合、Z 軸の順序が非常に重要になります。

-- CSS 2.1 セクション 9.9.1 - 階層化されたプレゼンテーション

z-index は位置指定要素にのみ適用され、位置指定されていない要素には無効です。正の整数、負の整数、0、または auto に設定できます。位置指定要素に z-index が設定されていない場合、デフォルトは auto です。

要素の z-index 値は、同じスタック コンテキスト内でのみ意味を持ちます。親スタッキング コンテキストのスタッキング レベルが別のスタッキング コンテキストのスタッキング レベルよりも低い場合、その z-index を高く設定しても効果はありません。したがって、大きな z-index 値が機能しない状況に遭遇した場合は、その親スタッキング コンテキストが他のスタッキング コンテキストによってカバーされているかどうかを確認してください。

4. 積み重ね順序

スタック順序 (スタック順序、スタック順序、スタック順序) は、同じスタック コンテキスト内の要素の順序を表します。スタックの一番下から、次の 7 つのスタック順序があります。

  • 背景と境界線: スタッキング コンテキストを形成する要素の背景と境界線。
  • 負の z-index 値: スタッキング コンテキスト内で負の z-index 値を持つ子要素を配置します。負の値が大きいほど、スタッキング レベルは低くなります。
  • ブロックレベル ボックス: ドキュメント フロー内のブロックレベルの非位置指定子要素。
  • フローティング ボックス: 位置が指定されていないフローティング要素。
  • インライン ボックス: ドキュメント フロー内のインラインの位置指定されていない子要素。
  • z-index: 0: z-index が 0 または auto に設定された要素。これらの要素は新しいスタック コンテキストを形成します。
  • 正の z-index 値: 正の z-index を持つ配置された要素。正の値が大きいほど、スタック レベルが高くなります。

同じ積み重ね順序の要素は、HTML に表示される順序で積み重ねられます。レベル 7 の要素は、それより前の要素の上に表示され、下位レベルの要素を覆うように見えます。

5. 実際の戦闘

5.1 一般的な状況

relative配置された 3 つのdivブロックにはそれぞれ異なるabsolute色のspan.redspan.greenspan.blueがあり、すべてにposition:absoluteされています。

Codepen - 通常ケースを参照

したがって、どの要素にも z-index プロパティがない場合、この例の要素は次の順序 (下から上へ) で積み重ねられます。

  • ルート要素の背景と境界線
  • ブロックレベルの非位置指定要素は、HTML に表示される順序で積み重ねられます。
  • インラインの非位置指定要素は、HTML に表示される順序で積み重ねられます。
  • 配置された要素は、HTML に表示される順序で積み重ねられます。

赤、緑、青はすべてz-index autoで配置された要素であるため、7層の重ね順ルールによれば、これらはすべて重ね順の6番目のレベルに属し、HTMLでの出現順に重ねられます:紅->綠->藍

5.2 同じスタックコンテキストの親要素

赤と緑はdiv.first-boxの下にあり、青はdiv.second-boxの下にあります。赤、緑、青にはposition:absoluteが設定され、 first-boxsecond-boxにはposition:relativeが設定されています。

Codepen を参照してください - 親要素は異なりますが、両方ともルート要素の下にあります

この例では、赤、青、緑の要素の親要素であるfirst-boxsecond-box 、新しいスタッキング コンテキストを生成しません。これらは両方ともルート スタッキング コンテキストの要素であり、スタッキング順序では両方ともレベル 6 にあります。したがって、HTML での出現順序に従ってスタックされます:紅->綠->藍

5.3 子要素にZインデックスを追加する

赤と緑はdiv.first-boxの下にあり、青と黄色はdiv.second-boxの下にあり、赤、緑、青にposition:absoluteが設定されています。緑にz-index:1が追加されると、 .greenが上部になります。

.second-boxの下の.greenの後に絶対位置のspan.goldを追加し、 z-index:-1を設定すると、赤、緑、青の下になります。

Codepen - z-index の設定を参照してください

この例では、赤、青、緑、黄色の要素の親要素に新しいスタッキング コンテキストは生成されません。これらはすべて、ルート スタッキング コンテキスト内の要素に属します。

赤と青には z-index が設定されておらず、どちらもスタック順序のレベル 6 に属し、HTML に表示される順序でスタックされます。

  1. 緑は Z インデックスが正で、レベル 7 です。
  2. 黄色は負の Z インデックスを持ち、レベル 2 に属します。

この例では、下から上の順序は、黃->紅->藍->綠です。

5.4 異なるスタッキングコンテキストを持つ親要素の場合

赤と緑はdiv.first-boxの下にあり、青はdiv.second-boxの下にあります。赤、緑、青にはposition:absoluteが設定されています。first first-boxの z-index がsecond-boxの z-index よりも大きく設定されている場合、青の z-index がどれだけ大きくてもz-index:999 )、青は常に赤と緑の下になります。赤と緑の z-index のみを変更すると、両方の要素が親要素first-boxによって生成されたスタック コンテキスト内にあるため、z-index が大きい方が上になります。

Codepen - 異なるスタックコンテキストの親を参照してください

この例では、赤、緑、青はすべて z-index が設定された配置要素ですが、その親要素は新しいスタック コンテキストを作成します。

  1. 赤と緑の親要素first-boxは、正の z-index を持つ配置要素であるため、スタック順序でレベル 7 のスタック コンテキストが作成されます。
  2. 青い親要素second-boxもスタッキング コンテキストを作成し、スタッキング順序ではレベル 6 に属します。
  3. 積み重ね順序に従って、 first-box内のすべての要素がsecond-boxに配置されます。
  4. 赤と緑は両方ともスタッキング コンテキストfirst-boxに属し、異なる正の z インデックスが設定されており、両方ともスタッキング順序のレベル 7 に属します。
  5. 青い要素はスタッキング コンテキストsecond-boxに属し、大きな正の z-index を持ち、スタッキング コンテキストではレベル 7 になります。
  6. 青の Z インデックスは大きいですが、 second-boxのスタッキング レベルがfirst-boxスタッキング レベルよりも小さいため、赤と緑の下に配置されます。

この例では、低から高への順序は藍->紅->綠です。

(私が遭遇した状況はこの例に似ています)

5.5 子要素の不透明度を設定する

赤と緑はdiv.first-boxの下にあり、青はdiv.second-boxの下にあり、赤、緑、青に対してposition:absoluteが設定され、緑に対してz-index:1設定されているため、緑は赤と青の上にあります。

first-boxopacity:.99を設定すると、赤と緑の z-index がどれだけ高くてもz-index:999 )、青は常に赤と緑の上に表示されます。

.second-boxの下の.greenの後にspan.goldを追加し、 z-index:-1を設定すると、赤、緑、青の下になります。

Codepen - 不透明度の影響を参照

前述したように、 opacityを設定するとスタッキング コンテキストも形成されます。

  1. first-box opacityが設定され、 first-box新しいスタッキング コンテキストになります。
  2. second-box新しいスタッキング コンテキストを形成しないので、その中の要素はすべてルート スタッキング コンテキストに属します。
  3. 黄色は積み重ね順序でレベル 2 に属し、赤と緑はレベル 7 に属し、 first-boxレベル 6 に属し、青は積み重ね順序でレベル 6 に属し、HTML の表示順序ではfirst-boxの上にあります。

この例では、低いものから高いものの順序は、黃->紅->綠->藍です。

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

<<:  Tomcat のメモリ構成の正しい姿勢についての簡単な説明

>>:  editplus の Zen コーディング例コードの説明

推薦する

MySQLクエリの文字セットの不一致の問題を解決する方法

問題を見つける最近、仕事で問題が発生しました。MySQL データベースにテーブルを作成するときに、ラ...

プロジェクトのフロントエンドとバックエンドでの Echart チャートの使用に関する詳細な説明

目次序文1. プロジェクトアーキテクチャ2. Echart公式サイトにアクセスして自己分析を学ぶ2....

CSSトランジションは高さを変更することで要素を拡大したり縮小したりします。

一般的な開発ニーズとして、要素の一部を必要になるまで折りたたんでおきたいことが挙げられます。 Boo...

mysql replace into の使用法の詳細な説明

replace ステートメントは、一般的に insert ステートメントに似ています。ただし、テーブ...

Linux lsof コマンドの使用方法の詳細な説明

lsof (開いているファイルのリスト) は、プロセスによって開かれたファイルを表示するツールです。...

HTTP 戻りコード一覧(中国語と英語の説明)

httpリターンコードリスト(以下は概要です)詳細な中国語の説明についてはここをクリックしてくださ...

antd pro に基づく SMS 認証コード ログイン機能 (プロセス分析)

目次まとめ全体的なプロセスフロントエンドページコード検証コードとログイン サービスをリクエストする ...

JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明

JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明MySQL データベースを使用して、...

MySQL水平および垂直テーブル変換操作の実装方法

この記事では、例を使用して、MySQL の水平テーブルと垂直テーブル間の変換操作を実装する方法を説明...

Vue プロジェクトにインターフェース リスニング マスクを追加する方法

1. 事業背景マスク レイヤーを使用してユーザーの異常な操作を遮断する方法は、フロントエンドでよく使...

MySQL マスターとスレーブの不整合とその解決策の詳細な説明

1. MySQL マスタースレーブ非同期1.1 ネットワーク遅延MySQLのマスタースレーブレプリケ...

別の種類の「キャンセル」ボタン

「キャンセル」ボタンは必要な操作プロセスの一部ではなく、デザイン上の主要な要素として表示されません...

MySQLトリガーの使用と注意すべき点

目次トリガーについてトリガーの使用トリガーを作成するトリガーを表示トリガーの削除使用上の注意新旧の違...

MySQL可視化ツールNavicatへの接続方法

Navicatをインストールした後次のエラーが発生する場合があります: Client does no...

Centos7でglibcをアップグレードするとシステム異常(起動できない)になる場合の解決方法

目次問題の原因:解決:解決:私は Centos7 を使用しています (理論的にはこの方法は Cent...