CSS堆叠顺序

html-css016

CSS堆叠顺序,第1张

层叠上下文,英文称作”stacking context”. 是HTML中的一个三维的概念。如果一个元素含有层叠上下文,我们可以理解为这个元素在z轴上就“高人一等”。

z轴通常指用户眼睛到屏幕的一条直线。所有的元素都有层叠顺序。

首先,我们创建一个div框。

当我们试着去改变background: black,我们会发现由于背景颜色盖在边框之上,边框的颜色会有所改变。

我们试着给这个div中加个内联元素,会发现,内联元素比那个没有因为背景是黑色,而隐藏掉。

内联元素是在background之上的,所以不会被背景色覆盖掉。

接着,我们在div中再创建一个内联元素

我们会发现,子元素的背景色覆盖掉了父元素的背景色。然后,我们给子元素加个margin-top,子元素中的内联元素会将父元素中的文字覆盖掉。

我们继续添加一个浮动元素,同时稍微修改下子元素的样式,方便我们观察。

给float元素加一个margin,我们可以看到,蓝色的float元素,覆盖在div之上。

我们继续添加两个div元素

此时,我们可以看到,后出现的元素会覆盖在先出现的元素之上,但是,浮动元素仍然在顶端。

我们给两个元素都加上position。

这时,两个div都在float元素的上层。后出现的橙色元素暂时在最上面。

我们接着给.relative1加上一个z-index

此时.relative1就在最上层。但是我们给.child加上z-index并没有效果,因为要给定位元素加上z-index(不为auto)才能触发堆叠上下文。

总结下来就是下图所示(原谅我盗图):

堆叠顺序(stacking order):HTML 内元素发生层叠的时候的特定垂直顺序,即元素在用户视线方向上的顺序。

一般而言,div 以内在层叠顺序上对于视觉有影响的一般有以下几个:

接下来,我们一个一个来测试一下他们的堆叠顺序。

在日常写页面中,很大可能是这样的:

一个 div 元素内有一个 background 和一个 border,它们两者是分开的吗?

现在,将该 div 的 border 颜色改为半透明

从上图可以看出来,内联元素和块级元素的堆叠顺序都是大于 background 的,那么他们与 border 相比较呢?

想办法把这两个元素移动到与 border 相覆盖,就可以知道他们的堆叠顺序。

往两个元素上分别加一个 margin-left:-10px

可以知道,内联元素和块级元素的堆叠顺序都大于 border 的堆叠顺序。那么这两者之间的堆叠顺序呢?

再往块级元素上加一个 margin-top:-10px

先加一个浮动元素,背景色为蓝色。

现在,先测试一次,蓝色的浮动元素与目前已知的最高级的内联元素哪个堆叠顺序比较大。给浮动元素加一个margin-top:-60px

依然是加一个定位元素

依然是加margin-top:-50px

可以看到,position:relative的元素直接盖住了目前已知最高等级的内联元素,说明 position:relative的元素的堆叠顺序比内联元素的要大。

接下来看一下 position:absolute将上面 position:relative改为 position:absolute

从图片可以看出结果是一摸一样的,说明 position:relative和 position:absolute有一样的堆叠顺序。

所以: 定位元素 >内联元素 >浮动元素 >块级元素 >border >background

首先要知道,z-index 生效的前提是该元素是 position 属性值是非static的元素,此时的 z-index为 auto。再添加一个元素,使它的 z-index生效

接下来,继续给一个margin-top:-40px

可以看到,橙色元素完全被盖住了。

修改一下margin,试着让它显示出来。

可以看到,即使不加margin负值,依然看不到。

设置margin-top:70px

可以看到,橙色有一部分被背景盖住了,说明:

综合上面所有内容,元素的堆叠顺序就出来了。

就是下面这个:

上面的顺序,越大的离用户越近。

堆叠上下文:stacking context,类似与作用域,由不同的CSS属性造成的一类具有相同特征的东西,并没有特定的概念。堆叠上下文影响的是元素 CSS 属性中的 z-index,父元素是否是堆叠上下文,对具有z-index属性的子元素的堆叠顺序有影响。

文档中的层叠上下文由满足以下任意一个条件的元素形成:

接下来看一下堆叠上下文对 z-index 的影响:

首先创建一个父元素的 div 作为容器,然后添加两个子 div ,两个子 div 里分别添加一个子 div

接下来,使用 CSS 添加样式,此时页面内有一个堆叠上下文=》html 元素

接下来给 bbb 添加一个 z-index:1并使它移动到 aaa 的位置。

页面并没有变化,那么这时候修改一下 aaa 和 bbb 的z-index 大小呢?将 aaa 的 z-index 改为2

接下来让 parent 元素形成堆叠上下文,并给 a 和 b 一个负z-index

部分参考自: