深入理解CSS中的层叠上下文和层叠顺序

2016/01/10 · CSS ·
层叠上下文

原文出处:
张鑫旭   

零、世间的道理都是想通的

在这个世界上,凡事都有个先后顺序,凡物都有个论资排辈。比方说食堂排队打饭,对吧,讲求先到先得,总不可能一拥而上。再比如说话语权,老婆的话永远是对的,领导的话永远是对的。

在CSS届,也是如此。只是,一般情况下,大家歌舞升平,看不出什么差异,即所谓的众生平等。但是,当发生冲突发生纠葛的时候,显然,是不可能做到完全等同的,先后顺序,身份差异就显现出来了。例如,杰克和罗斯,只能一人浮在木板上,此时,出现了冲突,结果大家都知道的。那对于CSS世界中的元素而言,所谓的“冲突”指什么呢,其中,很重要的一个层面就是“层叠显示冲突”。

默认情况下,网页内容是没有偏移角的垂直视觉呈现,当内容发生层叠的时候,一定会有一个前后的层叠顺序产生,有点类似于真实世界中论资排辈的感觉。

而要理解网页中元素是如何“论资排辈”的,就需要深入理解CSS中的层叠上下文和层叠顺序。

我们大家可能都熟悉CSS中的z-index属性,需要跟大家讲的是,z-index实际上只是CSS层叠上下文和层叠顺序中的一叶小舟。

http://www.zhangxinxu.com/wordpress/2016/01/understand-css-stacking-context-order-z-index/

CSS深入理解之relative定位

2018/05/25 · CSS ·
relative

原文出处: micstone   

一、什么是层叠上下文

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

这里出现了一个名词-z轴,指的是什么呢?

表示的是用户与屏幕的这条看不见的垂直线(参见下图示意-红线):
图片 1

层叠上下文是一个概念,跟「块状格式化上下文(BFC)」类似。然而,概念这个东西是比较虚比较抽象的,要想轻松理解,我们需要将其具象化。

怎么个具象化法呢?

你可以把「层叠上下文」理解为当官:网页中有很多很多的元素,我们可以看成是真实世界的芸芸众生。真实世界里,我们大多数人是普通老百姓们,还有一部分人是做官的官员。OK,这里的“官员”就可以理解为网页中的层叠上下文元素。

换句话说,页面中的元素有了层叠上下文,就好比我们普通老百姓当了官,一旦当了官,相比普通老百姓而言,离皇帝更近了,对不对,就等同于网页中元素级别更高,离我们用户更近了。

图片 2

概念

层叠上下文,英文称作”stacking context”.
是HTML中的一个三维的概念。层叠水平和CSS的z-index属性不能混为一谈,某些情况下z-index确实可以影响层叠水平。但是,只限于定位元素以及flex盒子的孩子元素;而层叠水平所有的元素都存在。

1.前言

在前面的两篇文章:CSS深入理解之float浮动和CSS深入理解之absolute定位中,介绍了floatabsolute的特性和使用方法,如果大家仔细阅读完了这两篇文章,相信你的CSS打怪技能又提高的一大截,那么趁着自己最近状态不错,就多给大家分享点自己平时所学的技能。一方面对自己的技能能够有一个总结,看自己到底理解透了没有,另一方面,以文章的形式分享出来,悦己同时悦他人。好了,开始进入今天的主题,今天轮到另一个定位属性登场了——relative,大家鼓掌欢迎👏👏👏。

二、什么是层叠水平

再来说说层叠水平。“层叠水平”英文称作”stacking
level”,决定了同一个层叠上下文中元素在z轴上的显示顺序。level这个词很容易让我们联想到我们真正世界中的三六九等、论资排辈。真实世界中,每个人都是独立的个体,包括同卵双胞胎,有差异就有区分。例如,双胞胎虽然长得像Ctrl+C/Ctrl+V得到的,但实际上,出生时间还是有先后顺序的,先出生的那个就大,大哥或大姐。网页中的元素也是如此,页面中的每个元素都是独立的个体,他们一定是会有一个类似的排名排序的情况存在。而这个排名排序、论资排辈就是我们这里所说的“层叠水平”。层叠上下文元素的层叠水平可以理解为官员的职级,1品2品,县长省长之类;对于普通元素,这个嘛……你自己随意理解。

于是,显而易见,所有的元素都有层叠水平,包括层叠上下文元素,层叠上下文元素的层叠水平可以理解为官员的职级,1品2品,县长省长之类。然后,对于普通元素的层叠水平,我们的探讨仅仅局限在当前层叠上下文元素中。为什么呢?因为否则没有意义。

这么理解吧~
上面提过元素具有层叠上下文好比当官,大家都知道的,这当官的家里都有丫鬟啊保镖啊管家啊什么的。所谓打狗看主人,A官员家里的管家和B官员家里的管家做PK实际上是没有意义的,因为他们牛不牛逼完全由他们的主子决定的。一人得道鸡犬升天,你说这和珅家里的管家和七侠镇娄知县县令家里的管家有可比性吗?李总理的秘书是不是分分钟灭了你村支部书记的秘书(如果有)。

翻译成术语就是:普通元素的层叠水平优先由层叠上下文决定,因此,层叠水平的比较只有在当前层叠上下文元素中才有意义。

图片 3

需要注意的是,诸位千万不要把层叠水平和CSS的z-index属性混为一谈。没错,某些情况下z-index确实可以影响层叠水平,但是,只限于定位元素以及flex盒子的孩子元素;而层叠水平所有的元素都存在。

在默认情况下(是在css3之前)

inline-block盒子>float盒子>block盒子=(z-index:auto)>负z-index
以上可以理解为,装饰属性在最下,布局属性在上,内容属性在最上面。

2.relative的特性

relative,顾名思义,相对。在CSS中,我们都这样使用:position: relative,翻译成中文就是相对定位。不知道大家在使用的过程中,有没有想过这样的一个问题:它到底是相对谁定位呢?在揭开答案之前,我们还是以例子来说明问题。

<!–HTML代码–> <div class=”box”> <div class=”td”>
<div class=”element1″></div> <h3>使用margin</h3>
</div> <div class=”td”> <div
class=”element2″></div> <h3>使用relative</h3>
</div> </div>

1
2
3
4
5
6
7
8
9
10
11
<!–HTML代码–>
<div class="box">
    <div class="td">
        <div class="element1"></div>
        <h3>使用margin</h3>
    </div>
    <div class="td">
        <div class="element2"></div>
        <h3>使用relative</h3>
    </div>
</div>

可以直接看核心CSS代码:

/*CSS代码*/ .element1{ margin-top: -30px; } .element2{ position:
relative; top: -30px }

1
2
3
4
5
6
7
8
/*CSS代码*/
.element1{
    margin-top: -30px;
}
.element2{
    position: relative;
    top: -30px
}

在浏览器中的效果如下:

图片 4

在本例中,使用.element1.element2两个CSS类达到的效果不一样,使用margin负值改变元素的位置后,后面元素的位置跟着变化,而使用position: relativetop负值改变元素的位置,后面元素的位置并没有发生改变。其实,这个例子说明了relative定位的两大特性:

1)相对自身。使用relative定位的元素,其相对的是自身进行偏移。

2)无侵入性。使用relative定位的元素,可以理解为产生了”幻影”,其真身依然在原来的位置上,所以并不会影响页面中其他的元素的布局。本例中,使用relative这几个字依然在原来的位置上,而使用margin这几个字则偏移了原来的位置。

三、什么是层叠顺序

再来说说层叠顺序。“层叠顺序”英文称作”stacking order”.
表示元素发生层叠时候有着特定的垂直显示顺序,注意,这里跟上面两个不一样,上面的层叠上下文和层叠水平是概念,而这里的层叠顺序是规则

在CSS2.1的年代,在CSS3还没有出现的时候(注意这里的前提),层叠顺序规则遵循下面这张图:
图片 5

有人可能有见过类似图,那个图是很多很多年前老外绘制的,英文内容。而是更关键的是国内估计没有同行进行过验证与实践,实际上很多关键信息缺失。上面是我自己手动重绘的中文版同时补充很多其他地方绝对没有的重要知识信息。如果想要无水印高清大图,点击这里购买(0.5元)。

缺失的关键信息包括:

  1. 位于最低水平的border/background指的是层叠上下文元素的边框和背景色。每一个层叠顺序规则适用于一个完整的层叠上下文元素。
  2. 原图没有呈现inline-block的层叠顺序,实际上,inline-block和inline水平元素是同等level级别。
  3. z-index:0实际上和z-index:auto单纯从层叠水平上看,是可以看成是一样的。注意这里的措辞——“单纯从层叠水平上看”,实际上,两者在层叠上下文领域有着根本性的差异。

下面我要向大家发问了,大家有没有想过,为什么内联元素的层叠顺序要比浮动元素和块状元素都高?
图片 6

为什么呢?我明明感觉浮动元素和块状元素要更屌一点啊。

嘿嘿嘿,我就不卖关子了,直接看下图的标注说明:
图片 7

诸如border/background一般为装饰属性,而浮动和块状元素一般用作布局,而内联元素都是内容。网页中最重要的是什么?当然是内容了哈,对不对!

因此,一定要让内容的层叠顺序相当高,当发生层叠是很好,重要的文字啊图片内容可以优先暴露在屏幕上。例如,文字和浮动图片重叠的时候:

图片 8

上面说的这些层叠顺序规则还是老时代的,如果把CSS3也牵扯进来,科科,事情就不一样了。

display:flex|inline-flex与层叠上下文

<pre><div class=”box”>
<div>
<img src=”mm1.jpg”>
</div>
</div></pre>

<pre>
.box { }
.box > div {
background-color: blue; z-index: 1;
} /* 此时该div是普通元素,z-index无效 /
.box > div > img {
position: relative; z-index: -1; right: -150px;
} /
注意这里是负值z-index */
</pre>
这里只看Img的负z-index,所以在默认盒子下面

<pre><div class=”box”>
<div>
<img src=”mm1.jpg”>
</div>
</div></pre>

<pre>
.box { display:flex }
.box > div {
background-color: blue; z-index: 1;
} /* 此时该div是层叠上下文,z-index为1 /
.box > div > img {
position: relative; z-index: -1; right: -150px;
} /
注意这里是负值z-index */
</pre>
这里都是层叠了,父级div成了层叠背景。

3.relative的限制作用

发表评论

电子邮件地址不会被公开。 必填项已用*标注