ホームページ  >  記事  >  ウェブフロントエンド  >  css z-index プロパティ_html/css_WEB-ITnose

css z-index プロパティ_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 11:20:211058ブラウズ

CSS z-index 属性 は、ノードのスタック順序を設定するために使用されます。これは、z-index の一般的な使用法です。同時に、z-index 値を大きな値に設定すると、必ずしもノードが最前面に表示されるとは限りません。この記事では、z-index の使用法を説明するためにいくつかの例を示します。分析し、z-index 階層ツリー の概念を皆さんに紹介します

今週、私たちのチームは社内テクノロジーの共有を行い、Pumpkin Xiaomi Congee が CSS z-index の階層の概念についての理解と紹介を共有しました。この共有のライブ効果は非常に優れているため、z-index と階層ツリーのトピックもブログに移動して説明します

この記事では、ノードの表示レベルに影響を与える複数のルールについて説明します。すべての例は、「ページ ノード レベルにおける位置属性と z-index 属性の影響の例」にリストされています。ルール

階層ツリールール

  • 参加ルール2
  • 概要
  • 順序ルール
  • ノードにposition属性が設定されていない場合、ドキュメントフローの後ろに位置するノードが前のノードをカバーします。
  • <div id="a">A</div><div id="b">B</div>
  • 位置決めルール

    position が static に設定されている場合、ドキュメント フローの後ろにあるノードは前にあるフローティング ノードをカバーするため、position:static はノードのカバー関係に影響を与えません。

    <div id="a" style="position:static;">A</div><div id="b">B</div>

    Position が相対 (相対位置決め)、絶対位置 (絶対位置決め)、または固定 (固定位置決め) に設定されている場合、そのようなノードは位置属性が設定されていないノード、または位置属性が設定されているノードを上書きします。属性値は静的であり、順序規則と位置規則に従って、前者の方が後者よりも高いデフォルト レベルを持つことを示します。ここでは、A も B も設定しません。位置を設定します。ただし、A の子ノード A-1 を基準にして位置を設定します。順序ルールに従って、B は A をカバーし、配置ルールに従って、B が A をカバーします。 A' は B をカバーします。

    <div id="a" style="position:relative;">A</div><div id="b">B</div>

    このような実装は、どのような場合に相互にオーバーレイするために使用されますか? 奇妙に思えるかもしれませんが、実際には、カテゴリ表示リストなどで非常によく使用されます。 ECサイトのサイドカラムのような表示もこの手法で実現できます

    下の写真は某サイトより カテゴリ表示領域では、第2階層のカテゴリのフローティングレイヤーが第1階層のカテゴリの外枠を覆っています。 CSS を使用して表示効果を実現する場合、第 1 レベルのカテゴリの外枠は、図の A に相当します。上の例では、第1レベルカテゴリのノードはA-1に相当し、第2レベルカテゴリのフローティングレイヤーはBに相当します。

    参加ルール
    position属性は使用しないようにしていますですが、z-index 属性では、z-index はノードに影響を与えないことがわかります。 z-index 属性はノードの位置にのみ影響します。これは、プロパティが相対、絶対、または固定の場合に有効になります。

    z-index プロパティは、位置決めされた要素でのみ機能します。位置: 絶対;、位置: 相対; または位置: 固定;)。ただし、z-index が 1 以上のノードは、z-index が定義されていないノードをカバーします。z-index が定義されていないノードは、z のないノードでカバーされます。 -index が定義されました。

    <div id="a">	<div id="a-1" style="position:relative;">A-1</div></div><div id="b">B</div>

    Pass 確認したところ、position が相対、絶対、または固定に設定されているが、z-index が設定されていない場合、z- のデフォルト値が使用されることもわかりました。 IE8 以降と W3C ブラウザ (以下、まとめて W3C ブラウザと呼びます) のインデックスは auto ですが、IE6 と IE7 のインデックスは 0 です。

    親ルールから

    ノード A と B の両方がposition:relative を定義し、z が定義されている場合-ノード A のインデックスがノード B のインデックスより大きい場合、A の子ノードは B の子ノードの前をカバーする必要があります。

    <div id="a" style="z-index:2;">A</div><div id="b" style="z-index:1;">B</div><div id="c" style="z-index:0;">C</div>

    如果所有节点都定义了 position:relative, A 节点的 z-index 和 B 节点一样大, 但因为顺序规则, B 节点覆盖在 A 节点前面. 就算 A 的子节点 z-index 值比 B 的子节点大, B 的子节点还是会覆盖在 A 的子节点前面.

    <div id="a" style="position:relative;z-index:0;">	<div id="a-1" style="position:relative;z-index:2;">A-1</div></div> <div id="b" style="position:relative;z-index:0;">	<div id="b-1" style="position:relative;z-index:1;">B-1</div></div>

    很多人将 z-index 设得很大, 9999 什么的都出来了, 如果不考虑父节点的影响, 设得再大也没用, 那是无法逾越的层级.

    层级树规则

    可能你会觉得在 DOM 结构中的兄弟节点会拎出来进行比较并确定层级, 其实不然.

    <div id="a" style="position:relative;z-index:2;">	<div id="a-1" style="position:relative;z-index:0;">A-1</div></div> <div id="b">	<div id="b-1" style="position:relative;z-index:1;">B-1</div></div>

    我们认为同时将 position 设为 relative, absolute 或者 fixed, 并且 z-index 经过整数赋值的节点, 会被放置到一个与 DOM 不一样的层级树里面, 并且在层级树中通过对比 z-index 决定显示的层级. 上面的例子如果用层级树来表示的话, 应该如下图所示.

    图中虽然 A-1 (z-index:0) 的值比 B-1 (z-index:1) 小, 但因为在层级树里 A (z-index:2) 和 B-1 在一个层级, 而 A 的值比 B-1 大, 根据从父规则, A-1 显示在 B-1 前面.

    参与规则 2

    前面提到的参与规则认为只要节点的 position 属性为 relative, absolute 或者 fixed, 即可参与层级比较, 其实不准确. 如果所有节点都定义了 position:relative, 并且将 z-index 设为整数值, 根据从父规则, 父节点的层级决定了子节点所在层级.

    <div id="a" style="position:relative;z-index:0;">	<div id="a-1" style="position:relative;z-index:100;">A-1</div></div> <div id="b">	<div id="b-1" style="position:relative;z-index:0;">		<div id="b-1-1" style="position:relative;z-index:10;">B-1-1</div>	</div></div> <div id="c" style="position:relative;z-index:0;">	<div id="c-1">		<div id="c-1-1">			<div id="c-1-1-1" style="position:relative;z-index:1;">C-1-1-1</div>		</div>	</div></div>

    例子中 A, B-1, C-1-1 作为父节点, z-index 的值相同, 根据顺序规则, C-1-1 在 B-1 之前, B-1 在 A 之前; 又根据从父规则, 无论子节点的 z-index 值是什么, C-1-1-1 在 B-1-1 之前, B-1-1 在 A-1 之前.

    如果我们将所有父节点的 z-index 属性去除, 诡异的事情发生了. IE6 和 IE7 浏览器显示效果不变, 而 W3C 浏览器的子节点不再从父, 而是根据自身的 z-index 确定层级.

    <div id="a" style="position:relative;">	<div id="a-1" style="position:relative;z-index:100;">A-1</div></div> <div id="b">	<div id="b-1" style="position:relative;">		<div id="b-1-1" style="position:relative;z-index:10;">B-1-1</div>	</div></div> <div id="c" style="position:relative;">	<div id="c-1">		<div id="c-1-1">			<div id="c-1-1-1" style="position:relative;z-index:1;">C-1-1-1</div>		</div>	</div></div>

    根据默认值规则, IE6 / IE7 和 W3C 浏览器上的元素存在 z-index 默认值的区别. 我们相信, 仅当 position 设为 relative, absolute 或者 fixed, 并且 z-index 赋整数值时, 节点被放置到层级树; 而 z-index 为默认值时, 只在 document 兄弟节点间比较层级. 在 W3C 浏览器中, A, B-1 和 C-1-1 的 z-index 均为 auto, 不参与层级比较.

    而在 IE6 和 IE7 中, 因为 z-index 的默认值是 0, 所以也参与了层级比较.

    设置了 position 而没有 z-index 的节点虽然不参与层级树的比较, 但还会在 DOM 中与兄弟节点进行层级比较.

    <div id="a" style="position:relative;">	<div id="a-1" style="position:relative;z-index:100;">A-1</div></div> <div id="b">	<div id="b-1">		<div id="b-1-1" style="position:relative;z-index:10;">B-1-1</div>	</div></div> <div id="c" style="position:relative;">	<div id="c-1">		<div id="c-1-1">			<div id="c-1-1-1" style="position:relative;z-index:1;">C-1-1-1</div>		</div>	</div></div>

    我们对上个例子改造一下, 将 B-1 的 position 属性删除后, W3C 浏览器显示如下图. 根据定位规则, A 和 C-1-1 会显示在 B-1 的前面; 而根据顺序规则, C-1-1 又显示在 A 前面.

    在 IE6 和 IE7 中, 因为 A 和 C-1-1 设置了 position:relative, 而且 z-index 的默认值为 0, 所以也参与层级树比较, 所以有如下效果.

    总结

    浏览器节点显示层级是一个费力的活, 今天你觉得 A 区块会永远置顶, 但明天因为需求变动, 突然出现 B 元素需要置顶. 一层一层往上堆砌, 某天回头一看, 发现很多区块交错在一起, 而且他们的值一个比一个大, 根本搞不清头绪. 我觉得在操刀干活之前, 最好先将 position, z-index 和层级的关系搞搞清楚, 以免后患无穷.

    另外, 非情非得已, 切勿用 JavaScript 计算 z-index, 并将某个节点的 z-index 设置成所有节点中层级最高.

    因为篇幅太长, 本文仅从节点属性角度进行讨论, 没有涉及 select 和 iframe 等特殊页面节点考虑, 如果有机会下次再为大家分享.

     

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。