你真的了解层级吗?带你简单剖析css层级到底是如何设计的

前言

前端的小伙伴们应该都有接触过css中关于层级的概念,即在一个页面中,两个或多个元素重叠时,哪个元素应当处于更高层。但是其中的原理其实并没有那么简单,如果不了解其中的原理,可能会像我一样出现设计上的错误。

如下图:

这个听起来不是很简单的概念吗,为什么我要聊这个,这是因为我在开发我的绘图系统中,发现了这么一个现象。我期望实现如下图(来自processOn),选中组件以后,选中组件的层级能够高于2组件,1组件本体居于原来的位置不变。

但是我无论怎么去调整我选中框的层级,都无法实现让它单独层级置顶的功能。

打开开发者工具,剖析了我们html结构的不同之处。我发现,processOn中,选中框和图形并不是父子关系,而是并列关系。

选择框:

元素:

而我的选中框和内部组件采用的是父子关系。这就是我因为不了解css的层级设计,从而导致了我的设计从根本上出现了错误。

接下来,我讲讲解为什么会出现这样的现象。

控制层级的两个例子

用层级控制并列元素的显示

在css中,我们可以通过z-index这个属性控制层级。当然了,我们要使之产生作用的前提就是,position不是static

z-index的值一般为数字,数字越大,层级越高。下面这个例子当中,我们为几个并列的元素设置不同的层级值,进行比较。

代码:

xml 复制代码
<body>
    <style>
        .box{
            display: inline-block;
            width: 100px;
            height: 100px;
            position: absolute
        }
        .zIndex1{
            left: 30px;
            top: 30px;
            background: red;
        }
        .zIndex2{
            z-index: 0;
            left: 50px;
            top: 50px;
            background: blue;
        }
        .zIndex3{
            z-index: 99;
            left: 70px;
            top: 70px;
            background: green;
        }
        .zIndex4{
            z-index: -1;
            left: 10px;
            top: 10px;
            background: yellow;
        }
    </style>
    <div class="box zIndex1">
        box1-无
    </div>
    <div class="box zIndex2">
        box2-0
    </div>
    <div class="box zIndex4">
        box4-(-1)
    </div>
    <div class="box zIndex3">
        box3-99
    </div>
</body>

效果:

从上面的例子我们可以知道,z-index的数值排序中负数<无<0<正数

父子关系下,层级的效果

我们将box2的层级设置为99,放在父容器box(层级为-1)中。另外还有一个和box1并列的元素box3(层级为0)。

代码如下:

xml 复制代码
<body>
    <style>
        .box{
            display: inline-block;
            width: 100px;
            height: 100px;
            position: absolute
        }
        .zIndex1{
            width: 200px;
            height: 200px;
            z-index: -1;
            background: blue;
        }
        .zIndex2{
            left: 50px;
            top: 50px;
            z-index: 99;
            background: green;
        }
        .zIndex3{
            left: 100px;
            top: 100px;
            z-index: 10;
            background: yellow;
        }
    </style>
    <div class="box zIndex3">
        box3-0
    </div>
    <div class="box zIndex1">
        box1-(-1)
        <div class="box zIndex2">
            box2-99
        </div>
    </div>
</body>

效果:

一般情况下,我们认为按照层级数值排序,从上到下应当是box2(99) box3(0) box1(-1)。

然而,实际情况是box3 box2 box1。这也是前面我产生设计失误的关键所在。

css中z-index的设计剖析

css中在z轴上的设计,我们可以将元素简化为一个个盒子,层级的比较只在并列的两个盒子之间进行。如果父级盒子的层级较低,那么其子元素层级就算设置成999也不会比高于其父级的盒子的层级高。

如下图:

总结

从理解了层级原理再到反思之前写过的项目,突然也理解到了,一般弹窗组件的元素被放在根节点下的原因,processOn将各个元素都放在同一层的原因....

经过这次我又一次意识到,程序员不能光写代码,也需要时间去沉淀自己,去理解其中的运作原理,才能够做出更好的设计,从而达到事半功倍的效果。

希望我的文章能对各位读者有所帮助。

相关推荐
apcipot_rain3 小时前
【应用密码学】实验五 公钥密码2——ECC
前端·数据库·python
ShallowLin3 小时前
vue3学习——组合式 API:生命周期钩子
前端·javascript·vue.js
Nejosi_念旧3 小时前
Vue API 、element-plus自动导入插件
前端·javascript·vue.js
互联网搬砖老肖3 小时前
Web 架构之攻击应急方案
前端·架构
pixle04 小时前
Vue3 Echarts 3D饼图(3D环形图)实现讲解附带源码
前端·3d·echarts
麻芝汤圆4 小时前
MapReduce 入门实战:WordCount 程序
大数据·前端·javascript·ajax·spark·mapreduce
juruiyuan1116 小时前
FFmpeg3.4 libavcodec协议框架增加新的decode协议
前端
读心悦6 小时前
CSS结构性伪类、UI伪类与动态伪类全解析:从文档结构到交互状态的精准选择
css·ui·交互
Peter 谭7 小时前
React Hooks 实现原理深度解析:从基础到源码级理解
前端·javascript·react.js·前端框架·ecmascript
LuckyLay8 小时前
React百日学习计划——Deepseek版
前端·学习·react.js