当前位置: 首页 > Web前端 > CSS

下面我举例说明一下什么是cssstackingcontext,什么是cssstacking的stackingorder,让大家少一些对css的疑惑?

时间:2023-03-30 23:32:04 CSS

什么是CSS层叠上下文?我们有一个基本样式的div,样式如下:div{width:200px;高度:200px;边框:10px纯红色;填充:15px;margin:12px;}效果如下:这里有个问题:border和background是什么关系?这里有两个选项:平行边框更贴近用户,背景更贴近用户,你会选择哪个?其实理解起来很简单,我们只需要将边框设置为半透明就知道答案了。绿色,所以边界更接近用户。这时候你就知道div不是平面的,竖屏上是有层级关系的,那么这个层级关系就叫做层叠上下文。然后我们在div中写上“Hello,world”,效果如下:这里还有一个问题,这个“Hello,world”是在哪一层,在border上还是在border和background之间?这里我们只要把'hello'移到边框就知道原因了,那么怎么把文字移到那里呢?这里我们使用text-indent,样式如下:div{width:200px;高度:200px;边框:10px实心rgb(255,0,0);填充:15px;边距:12px;背景色:绿色;text-indent:-20px;}效果如下:从运行效果可以看出,文字是在边框上的,所以文字区域(行内元素)离用户更近了。如果div里面有一个div怎么办?代码结构如下://html你好,CSSWorld

//css.parent{width:200px;高度:200px;border:10pxsolidrgb(255,0,0);填充:15px;边距:12px;背景色:绿色;文本缩进:-20px;}.child{高度:20px;背景:紫色;}效果如下:另外一个问题出现了,紫色区域是高于文字区域还是相反?那么如何验证这个问题呢?我们只需要将内部的div向上移动。注意这里不能使用position,因为为了改变层级结构,我们只需要使用margin-top,如:margin-top:-20px;效果如下:你会发现文本区域在上面。这里得出一个结论:如果div中有块级元素,则块级元素不能覆盖行内元素。换句话说,内联元素更接近用户。如果div中有文本怎么办?这时候我们需要写几个字,效果如下:你会发现子元素的文本区域会覆盖父元素的文本区域,所以这里再做个小总结:出现在文本区域之后的内容将覆盖之前出现的内容。浮动元素有一个基本结构://htmlHello
//css.parent{width:200px;高度:200px;border:10pxsolidrgb(255,0,0);填充:15px;边距:12px;背景色:绿色;颜色:aliceblue;}.float{高度:40px;宽度:40px;;}效果如下:上面的代码就不解释了,你一定知道吧?按照上面的套路,这里又出现了同样的问题:你好,请问是上面的还是这个float元素?为了验证这个问题,我们还使用text-indent将文本向左移动。这里我直接应用了效果:从渲染图可以看出,文本区域在云元素的上方。浮动元素是在文本区域和内部块级元素之间,还是在内部块级和边框元素之间?换句话说,浮动元素和块级元素哪个更贴近用户?我们直接在父元素中写一个子元素://hmtlHello//CSS.child{高度:20px;background:black;}效果如下:从上面可以看出浮云元素覆盖了子元素,说明浮云元素的层级高于块级元素。也就是说,浮动元素位于文本区域和块级元素之间。浮动元素里面的文字和外面的文字呢?这里我直接在float里面添加了float文字,效果如下:你会发现float里面的文字覆盖不了float外面的文字。绝对定位元素在上面的基础上,我们添加一个相对元素,如下://htmkHellofloatt//css.relative{width:100px;高度:100px;背景:粉色;margin-top:-15px;}效果如下:this当我们给class添加一个relative:position:relative;效果如下:你会发现相对元素覆盖了浮动元素,也就是说给元素添加相对位置会增加相应的层级。检查相对元素,你会看到添加position:relative定位会添加一个z-index:auto东西。其实你的定位是根据z-index来计算的。这里我们给未定位的子元素添加一个z-index:Hellofloatt效果如下:你会发现子元素没有覆盖相对元素!这里直接给出结论:z-index只对position:relative|absolute有效。如果两者都是相对的,z-index相同,那么后面会覆盖前面,z-index值大的会覆盖小的。我们再在原来的基础上加一个relative2,样式如下:.relative2{width:100px;高度:150px;背景:金色;边距顶部:-15px;position:relative;}效果如下:此时给relative2加一个z-index:-1,看了另一个结论:当z-index为负数时,位于背景下方,这时候我们加上.parent元素的以下两种样式:position:relative;z-索引:0;此时的效果如下:这时候出现了一个奇怪的东西,z-index:-1跑到了最上面。关于什么是堆叠,MDN给出了一些内容,如下:其实就是我们给.parent元素设置了z-index:0。根据MDN,我们实际上已经创建了一个堆栈上下文。那么什么是堆叠上下文呢?以下是张新旭的原文:其实这很像美国一位大法官说过的一句话:我不知道什么是色情,但看到它就知道什么是色情。CSS堆叠上下文类似。你很难说什么是CSSstackingcontext,但只要满足MDN列出的条件,就是CSSstackingcontext。CSSstack堆叠顺序CSSstackingcontext在竖屏上是靠上的,他们的关系如下:所以这就解释了为什么当z-index为负数的时候,会在背景上,因为我们的z-index:0创建CSS堆叠上下文。CSS堆叠上下文函数下面是一个基本内容://htmlaa1bb1//css.parent{width:200px;高度:200px;border:10pxsolidrgb(255,0,0);填充:15px;边距:12px;背景颜色:绿色;}.relative{宽度:100px;高度:100px;背景:橙色;位置:相对;border:1pxsolidred;}.a1{position:relative;背景:绿色;}.b1{位置:相对;background:red;}效果如下:然后我们给b1添加如下样式:margin-top:-90px;b1会覆盖a1,这个我们应该知道为什么吗?因为a1和b1都是块级元素,后面会盖住前面,没问题!那么a1和b1的CSS堆叠上下文是谁呢?我们可以用MDN给出的第一句话:根元素,所以a1和b1的CSS堆叠上下文是Html,然后给a1如下样式:z-index:2;然后给b1以下样式:z-index:0;效果如下:a1跑到b1,这个很好理解,因为a1的z-index:2高于b1的z-index:0,所以a1在上面。现在有一个问题,a1总是覆盖b1吗?这里可能会说a1的z-index:2总是比b1的z-index:0大,当然会覆盖b1!是这样吗?让我们尝试更改CSS堆叠上下文。我们分别为a和b做一个CSSstackingcontext:如下:z-index:1;}.b{位置:相对;z-index:1;}效果如下:首先分析a和b他们覆盖了谁,因为两个定位和z-index相同所以b会覆盖a。你有没有注意到另一个现象,b1覆盖了a1?很明显a1的z-index大于b1,为什么呢?为什么小的盖住大的?为什么?因为b比a高一点,所以b中的含量会比a高一点。这是CSS堆叠上下文的一个特性。比如阿里巴巴有一个奇怪的部门叫政委,就是由马云等一些创始人组成的。在这个部门,你比其他部门更先进吗?所以b1虽然在b里是level0,但是在b里是高层部门,也就是能压过你部门a里level2的人。今天就这些了,如果你还看不懂,可以看看下面的内容:张新旭深入理解CSSMDN文档中的级联上下文和级联顺序你的点赞是我继续分享的动力好东西,欢迎点赞!笨码农,Minecraft终生只能学习!更多内容请关注公众号《大迁世界》!