css之层叠上下文

感谢chokcoco、小火柴的蓝色理想和张鑫旭三位大佬,推荐看:http://www.zhangxinxu.com/wordpress/2016/01/understand-css-stacking-context-order-z-index/

主要记录通过这个题目而恶补的css属性们。


题目:你真的懂z-index:auto和z-index:0吗?


其中2是因为“后来居上”所以才会在1的上面,当改变z-index:0/auto时是没有区别的。

z-index:0会创建层叠上下文,这又会影响什么呢?

    <div id="div1">
         <div id="div1_inside">222222222222222222222</div>
    </div>
    <div id="div2">
        <div id="div2_inside">111111111111111111111</div>
    </div>
    div {
            position: relative;
            top: 50px;
            left: 50px;
        }
    #div1 {
            z-index: 0;
        }
    #div1_inside {
            z-index: 2;
            width: 90px;
            height: 90px;
            background: darkgreen;
            white-space:normal;
            word-break:break-all;
            word-wrap:break-word; 
            position: absolute;
        }
    #div2 {
            z-index: 0;
        }
    #div2_inside {
            position: relative;
            z-index: 1;
            width: 80px;
            height: 80px;
            background: darkseagreen;
            white-space:normal;
            word-break:break-all;
            word-wrap:break-word; 
        }

效果是:


啊咧咧~明明z-index:2的东西为什么会跑到下面去呢?

其实层叠上下文元素有这样一条特性:每个层叠上下文自成体系,当元素当元素发生层叠的时候,整个元素被认为是在父层叠上下文的层叠顺序中。因为div1_inside和div2_inside的父元素都是z-index:0,所以他们会随爹走,div2比div1靠后(遵循“后来者居上”原则),自然div2_inside会在div1_inside上面。

另附四种不同情况的对比图:


插句题外话:使块级元素内文字换行的方式

white-space:normal(pre-wrap、pre-line同)

如果位于换行处的单词很长,则直接另起一段,不会让单词折断。

white-space:nowrap 不换行(pre同)

word-break:normal(默认)

word-break:break-all 如果位于换行处的单词很长会直接粗暴地将单词折断。

word-break:keep-all 只能在半角空格或连字符处换行,像这样:


word-wrap:normal(默认)

word-wrap:break-word

重头戏来了~ word-wrap:break-word和word-break:break-all的区别是什么呢?


嘛~记住他们也很容易:我爸爸(wbba)                        玩玩呗?玩!(wwbw)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~一条不知名的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


记得上一篇博客我曾说过:z-index只能配合着positioned元素一起使用。

在css2.1的时代它是没错的,但是随着css3的时代来临,这句话是错误的!


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

在此之前先来回顾下flex和inline-flex区别:

.parent {
            height: 100px;
            width: 200px;
            display: flex;
            background: deeppink;
        }
/*下面这种写法与上面是等效的*/
.parent {
            height: 100px;
            display: inline-flex;
            background: deeppink;
        }
.parent > div {
            height: 100px;
            width: 40px;
            margin: 5px;
            border: 3px solid black;
            background: deepskyblue;
        }

inline-flex比flex要智能一点,能自己计算总共的width(当然你要是自己设定width,它会根据你设定的width走)。我总共建了5个div在.parent内部。

另附一张图表明flex内部的元素的width是包括margin、border、padding和content的(区别flex-basis)。


接下来复习下flex中常用的属性

align-content表明项目竖直方向(交叉轴)如何排布,justify-content表明项目水平方向(主轴)如何排布,所以他俩写在弹性盒元素里;而align-self可以改变单个项目,所以它写在你要改变排布的单个项目中,同时它可以覆盖align-content。他们都有六种可选值:flex-start:取消项目之间的空白,把项目放在容器顶部;center:取消项目之间的空白,把项目放在容器中心;flex-end:取消项目之间的空白,把项目放在容器结尾;space-between:两端对齐。留相同间隔在每个项目之间;space-around:项目之间的空白为两倍的单个项目空白。默认是stretch会拉伸容器内每个项目占用的空间,填充方式为给每个项目下方增加空白。第一个项目默认从容器顶端开始排列。

想要换行时采用flex-wrap:wrap,不想换行用nowrap(默认)。

想要改变方向就用flex-direction,下面这个例子会告诉你这个属性的坑:

如何将改成

使用的html结构如下:

   <div class="box">
        <div class="column">
            <span class="item"></span>
            <span class="item"></span>
            <span class="item"></span>            
        </div>
        <div class="column">
            <span class="item"></span>  
            <span class="item"></span>
            <span class="item"></span>              
        </div>
    </div>

机智的小伙伴一定会用上面提到的flex-direction,但是这个属性是放到box里还是column里呢?是给爷爷还是给爹这是个问题。

答案是都给

给box的flex-direction会使

所以只给爷爷就会横着出去排成一排。

给column的flex-direction会使

所以只给爹就会竖着出去排成一列。

此外flex-basis这个属性定义了在分配多余空间之前,项目占据的主轴 空间,默认是auto(项目的本来大小)。

以上就是看阮一峰flex实例总结的坑,点击打开链接


下面该说说正题了!

①元素a的父元素A设置display:flex|inline-flex;②元素a设置z-index:一个数(不是auto不是默认);同时满足以上两点时,元素a即为层叠上下文。

    <div class="parent">
        <div class="child">
            <div></div>
        </div>
    </div>
.parent {
            display: flex;
        }
.child {
            z-index: 0;
            height: 300px;
            width: 300px;
            display: inline-flex;
            background: deeppink;
        }
.child > div {
            height: 200px;
            width: 40px;
            border: 3px solid black;
            background: deepskyblue;
            z-index: -1;
        }

当child元素设置z-index:0时,根据所以会显示出child下的div。

当child元素不设置时,不产生层叠上下文,根据既然child只是个普通的块状水平盒子,当然会盖住z-index:-1的div咯。

除了给父元素添加display:flex的情况,还有添加opacity(透明度)、transform(变换)、filter(过滤)等都可以使其变为层叠上下文。

最后放一张bihi实现的网页版css层叠顺序图(省了5毛钱)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值