首页 > 网站 > WEB开发 > 正文

z-index堆叠规则

2024-04-27 14:26:25
字体:
来源:转载
供稿:网友
z-index堆叠规则

一、z-index

z-index用来控制元素重叠时堆叠顺序。

适用于:已经定位的元素(即position:relative/absolute/fixed)。

一般理解就是数值越高越靠上,好像很简单,但是当z-index应用于复杂的HTML元素层次结构,其行为可能很难理解甚至不可预测。因为z-index的堆叠规则很复杂,下面一一道来。

首先解释一个名词:

stacking context:翻译就是“堆叠上下文”。每个元素仅属于一个堆叠上下文,元素的z-index描述元素在相同堆叠上下文中“z轴”的呈现顺序。

z-index取值:

默认值auto:

当页面新生成一个box时,它默认的z-index值为auto,意味着该box不会自己产生一个新的local stacking context,而是处于和父box相同的堆叠上下文中。

正/负整数

这个整数就是当前box的z-index值。z-index值为0也会生成一个local stacking context,这样该box父box的z-index就不会和其子box做比较,相当于隔离了父box的z-index和子box的z-index。

接下来从最简单的不使用z-index的情况开始将,循序渐进。

二、不使用 z-index时堆叠顺序

不使用z-index的情况,也是默认的情况,即所有元素都不用z-index时,堆叠顺序如下(从下到上)

  • 根元素(即HTML元素)的background和borders
  • 正常流中非定位后代元素(这些元素顺序按照HTML文档出现顺序)
  • 已定位后代元素(这些元素顺序按照HTML文档出现顺序)
解释一下后两条规则:
  • 正常流中非positoned element元素,总是先于positioned element元素渲染,所以表现就是在positioned element下方,跟它在HTML中出现的顺序无关。
  • 没有指定z-index值的positioned element,他们的堆叠顺序取决于在HTML文档中的顺序,越靠后出现的元素,位置越高,和position属性无关。

例子:

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>Stacking without z-index</title>    <style type="text/CSS">    div {        font: 12px Arial;        text-align: center;    }    .bold { font-weight: bold; }    .opacity{opacity: 0.7;}    #normdiv {        height: 70px;        border: 1px dashed #999966;        background-color: #ffffcc;        margin: 0px 50px 0px 50px;    }    #reldiv1 {        height: 100px;        position: relative;        top: 30px;        border: 1px dashed #669966;        background-color: #ccffcc;        margin: 0px 50px 0px 50px;    }    #reldiv2 {        height: 100px;        position: relative;        top: 15px;        left: 20px;        border: 1px dashed #669966;        background-color: #ccffcc;        margin: 0px 50px 0px 50px;    }    #absdiv1 {        position: absolute;        width: 150px;        height: 350px;        top: 10px;        left: 10px;        border: 1px dashed #990000;        background-color: #ffdddd;    }    #absdiv2 {        position: absolute;        width: 150px;        height: 350px;        top: 10px;        right: 10px;        border: 1px dashed #990000;        background-color: #ffdddd;    }</style></head><body>    <br /><br />    <div id="absdiv1" class="opacity">        <br /><span class="bold">DIV #1</span>        <br />position: absolute;    </div>    <div id="reldiv1" class="opacity">        <br /><span class="bold">DIV #2</span>        <br />position: relative;    </div>    <div id="reldiv2" class="opacity">        <br /><span class="bold">DIV #3</span>        <br />position: relative;    </div>    <div id="absdiv2" class="opacity">        <br /><span class="bold">DIV #4</span>        <br />position: absolute;    </div>    <div id="normdiv">        <br /><span class="bold">DIV #5</span>        <br />no positioning    </div></body></html>
View Code

有图有真相:

分析:

#5没有定位,处于正常流,所以根据以上规则,先于#1,#2,#3,#4这些已定位元素渲染,在最下方。

#1,#2,#3,#4都是已定位元素,且未设置z-index,所以根据其在文档中出现的顺序依次被渲染,可以去掉apacity查看清晰效果。

三、浮动堆叠顺序

浮动元素z-index位置介于非定位元素和定位元素之间。(从下到上)

  • 根元素(即HTML元素)的背景和border
  • 正常流中非定位后代元素(这些元素顺序按照HTML文档出现顺序)
  • 浮动元素(浮动元素之间是不会出现z-index重叠的)
  • 正常流中inline后代元素
  • 已定位后代元素(这些元素顺序按照HTML文档出现顺序)

non-positioned元素的背景和边界没有被浮动元素影响,但是元素中的内容受影响(浮动布局特性)

举例:

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>Stacking and float</title>    <style type="text/css">    div {        font: 12px Arial;        text-align: center;    }    .bold { font-weight: bold; }    .opacity{ opacity: 0.7;}    #absdiv1 {        position: absolute;        width: 150px;        height: 200px;        top: 10px;        right: 140px;        border: 1px dashed #990000;        background-color: #ffdddd;    }    #normdiv {/*         opacity: 0.7; */        height: 100px;        border: 1px dashed #999966;        background-color: #ffffcc;        margin: 0px 10px 0px 10px;        text-align: left;    }    #flodiv1 {        margin: 0px 10px 0px 20px;        float: left;        width: 150px;        height: 200px;        border: 1px dashed #009900;        background-color: #ccffcc;    }    #flodiv2 {        margin: 0px 20px 0px 10px;        float: right;        width: 150px;        height: 200px;        border: 1px dashed #009900;        background-color: #ccffcc;    }    #absdiv2 {        position: absolute;        width: 150px;        height: 100px;        top: 130px;        left: 100px;        border: 1px dashed #990000;        background-color: #ffdddd;    }</style></head><body>    <br /><br />    <div id="absdiv1" class="opacity">        <br /><span class="bold">DIV #1</span>        <br />position: absolute;    </div>    <div id="flodiv1" class="opacity">        <br /><span class="bold">DIV #2</span>        <br />float: left;    </div>    <div id="flodiv2" class="opacity">        <br /><span class="bold">DIV #3</span>        <br />float: right;    </div>    <br />    <div id="normdiv">        <br /><span class="bold">DIV #4</span>        <br />no positioning    </div>    <div id="absdiv2" class="opacity">        <br /><span class="bold">DIV #5</span>        <br />position: absolute;    </div></body></html>
View Code

分析:

#4是正常流中非定位的元素,所以先被渲染,在最底层。

#2 #3一个左浮动,一个右浮动,接着被渲染。彼此不会因为z-index值被覆盖。见下图。

#1 #5为已定位的元素,最后被渲染,当浏览器窗口变小时,#5在#1上面,因为HTML文档中#5在#1后面。见下图。

四、z-index

默认的堆叠顺序上面说了,要想改变 元素的堆叠顺序就得用到z-index。

Note:前两种情况中,虽然有元素之间的重叠覆盖,但是它们都是处在同一个z-layer的。因为没有设置z-index属性,默认的渲染层就是layer 0。所以要注意,不同层中元素之间覆盖是理所当然的,但是同一层中的元素也会发送覆盖。

z-index只适用于已经定位的元素(即position:relative/absolute/fixed)。

举例:

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>Stacking without z-index</title>    <style type="text/css">    div {        font: 12px Arial;        text-align: center;        opacity: 0.7;    }    .bold { font-weight: bold; }    #normdiv {        z-index: 8;        height: 70px;        border: 1px dashed #999966;        background-color: #ffffcc;

上一篇:html图片无法显示

下一篇:css知识

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表