- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
今天,经过数小时的调试,我很难学到了以下规则:
如果父级的z-index值为任何值,则无论您如何更改子级的CSS,父级元素都永远无法覆盖(堆叠在其子级元素之上)
如何通过逻辑理解这种行为?规范在哪里覆盖?
.container {
width: 600px;
height: 600px;
background-color: salmon;
position: relative;
z-index: 99;
padding-top: 10px;
}
h1 {
background-color: pink;
position: relative;
z-index: -1;
font-family: monospace;
}
<div class="container">
<h1>1. I can never be covered by parent if my z-index is positive.</h1>
<h1>2. Even when my z-index is nagative, I still can never be covered if my parent has any z-index at all.</h1>
</div>
最佳答案
您需要了解两件重要的事情:绘画顺序和堆叠上下文。如果引用the specification,则可以找到绘制元素的方式和时间。
堆叠由具有负z索引(不包括0)的后代按z索引顺序(最负数先)然后按树顺序形成的上下文。
按树顺序排列的所有已定位,不透明或转换后代均属于以下类别:
所有以“ z-index:auto”或“ z-index:0”排列的后代,按树顺序排列。
堆叠上下文,这些上下文由定位的后代(z索引大于或等于1)按z索引顺序(最小的顺序为小)然后按树顺序形成。
显然,我们首先在步骤(3)绘制具有负z-index
的元素,然后在步骤(8)绘制具有z-index
等于0的元素,最后在步骤(9)绘制具有正z-index
的元素。 ,这是合乎逻辑的。我们还可以阅读:
每个盒子都属于一个堆叠上下文。给定堆叠上下文中的每个盒子都有一个整数堆叠级别,这是它在z轴上相对于同一堆叠上下文中其他盒子的位置。具有较高堆栈级别的框始终在具有较低堆栈级别的框之前格式化。盒子的堆叠高度可能为负。在堆叠上下文中具有相同堆叠级别的框将根据文档树顺序从下到上堆叠。
也
建立本地堆栈上下文的元素会生成一个具有两个堆栈级别的框:一个用于它创建的堆栈上下文(始终为0),另一个用于它所属的堆栈上下文(由z-index属性赋予)。
要了解何时绘制每个元素,您需要了解其堆叠上下文以及该堆叠上下文中的堆叠级别(由z-index
定义)。您还需要知道该元素是否建立了堆栈上下文。这是棘手的部分,因为设置z-index
可以做到这一点:
对于定位框,z-index属性指定:
当前堆栈上下文中框的堆栈级别。
盒子是否建立堆叠环境
值具有以下含义:
<integer>
该整数是当前堆栈上下文中生成的框的堆栈级别。该框还建立了一个新的堆栈上下文。
auto
当前堆栈上下文中生成的框的堆栈级别为0。除非框是根元素,否则框不会建立新的堆栈上下文。
现在,我们拥有所有信息,可以更好地理解每种情况。如果父元素的z-index
值不是auto
,则它将创建一个堆栈上下文,因此子元素将被绘制在其z-index
为正或负的任何内部。子元素的z-index
会简单地告诉我们父元素内部的绘画顺序(这涵盖了您的第二点)。
现在,如果只有子元素具有正的z-index
,而我们在父元素上未设置任何内容,则考虑绘制顺序,子元素将在稍后(步骤(9))绘制,父元素将在步骤(8)中绘制。在上面绘制父级的唯一逻辑方法是增加z-index
,但是这样做会使我们陷入前面的情况,父级将建立一个堆栈上下文,而子元素将属于该上下文。
为子级设置肯定的z-index
时,无法将父级置于子级元素上方。如果将z-index
设置为不同于auto
的父元素(正数或负数),也无法使父项高于子项。1
我们唯一可以在其父项之下有一个子项的情况是在子元素上设置一个负的z-index
并将父项保持在z-index: auto
,因此这将不会创建堆叠上下文,并且按照该子项的绘画顺序首先被画。
除了z-index
,还有other properties that create a stacking context。如果遇到预期的堆叠顺序,则还需要考虑那些属性,以查看是否创建了堆叠上下文。
我们可以从以上总结得出一些重要事实:
堆栈上下文可以包含在其他堆栈上下文中,并一起创建堆栈上下文的层次结构。
每个堆栈上下文完全独立于其同级:处理堆栈时仅考虑后代元素。
每个堆叠上下文都是自包含的:将元素的内容堆叠之后,将按照父堆叠上下文的堆叠顺序考虑整个元素。 ref
1:如果我们考虑使用3D变换,则有一些骇人听闻的方法。
元素位于其父元素下的示例,即使该元素指定了z-index
。
.box {
position:relative;
z-index:0;
height:80px;
background:blue;
transform-style: preserve-3d; /* This is important */
}
.box > div {
margin:0 50px;
height:100px;
background:red;
z-index:-1; /* this will do nothing */
transform:translateZ(-1px); /* this will do the magic */
}
<div class="box">
<div></div>
</div>
.box {
position: relative;
z-index: 0;
height: 80px;
background: blue;
}
.box>div {
margin: 0 50px;
height: 100px;
background: red;
z-index: 5;
transform: translateZ(2px);
}
.outside {
height: 50px;
background: green;
margin: -10px 40px;
transform: translateZ(1px);
}
body {
transform-style: preserve-3d;
}
<div class="box">
<div></div>
</div>
<div class="outside"></div>
.box {
width: 100px;
height: 100px;
position: absolute;
}
body {
transform-style: preserve-3d;
}
<div class="box" style="top:100px;left:50px;background:red;"></div>
<div class="box" style="top: 50px;left: 115px;background:blue;"></div>
<div class="box" style="top: 101px;left: 170px;background:green;"></div>
<div class="box" style="top: 175px;left: 115px;background:purple;transform: rotateY(-1deg);"></div>
关于css - 为什么具有z-index值的元素不能覆盖其子级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58721793/
我有这个 html 代码: HELLO WORLD! X V HELLO WORLD! X V 我想按 X(类关闭)将父 div 的高度更改为 20px 并显示 V(类打开),但在每个 d
在会计应用程序的许多不同实现中,有两种主要的数据库设计方法来保存日志和分类帐数据。 只保留 Journal 信息,然后 Ledger 只是 Journal 的一个 View (因为 journal 总
我想在另一个子里面有一个子, sub a { sub b { } } 我想为每次调用 sub b 创建一个新的 sub a 实例。有没有办法在 Perl 中做到这一点? 当我运行上面的
我有一些代码正在查找重复项并突出显示单元格: Private Sub cmdDups_Click() Dim Rng As Range Dim cel As Range Set Rng = ThisW
可能有一个简单的解决方案,但我很难过。 我有一个包含一个 ID 字段的主表。在两个可能的字段中有一个具有该 ID 的子表。想象一个由选手 A 和选手 B 组成的 double 队。Master 表将有
假设我有一个包含对象的数组: [ { "id": "5a97e047f826a0111b754beb", "name": "Hogwarts", "parentId": "
我正在尝试对 MySQL 数据库表执行一对父/子模型的批量插入,但似乎无法使用标准的 ActiveRecord 功能来完成。所以,我尝试了 activerecord-import gem,但它也不支持
我有一个带有多个子类的父抽象类。最终,我希望通过 GUI 中的进度条显示子类中完成的进度。 我目前所做的,我意识到这是行不通的,是在父类中声明为每个子类将覆盖的虚拟方法的事件方法定义。所以像: pub
是否可以通过键数组在对象中设置变量?例如我有这个对象: var obj = {'outer': {'inner': 'value'} }; 并希望设置由键数组选择的值: var keys = ['ou
我有一个名为 companies 的 MySQL 表,如下所示: +---------+-----------+-----------+ | id_comp | comp_name | id_pare
我正在尝试使用 sublime text 在 sublime text 上的 ionic 上打开我的第一个应用程序。它给了我一个“找不到命令”的错误。如何修复? 我试过这些命令: sudo rm -r
不好意思问,但我正在使用 webapp2,我正在设计一个解决方案,以便更容易定义路由 based on this google webapp2 route function .但这完全取决于能够在子级
我有代表树的数字字符串(我不知道是否有官方名称): 012323301212 上面的例子代表了 2 棵树。根用 0 表示。根的直接子代为“1”,“1”的直接子代为“2”,依此类推。我需要将它们分组到由
是否可以在当前 Activity 之上添加 Activity 。例如,假设我单击一个按钮,然后它将第二个 Activity 添加到当前 Activity 。而第二个 Activity 只覆盖了我当前
我很难思考如何为子资源建模。 以作者的书籍为例。你可以有 N 本书,每本书只有一位作者。 /books GET /books POST /books/id PUT /books/id DELETE 到
有人可以向我解释以下内容(python 2.7) 来自已解析文件的两个字符串数字: '410.9''410.9 '(注意尾随空格) A_LIST = ['410.9 '] '410.9' in '41
背景 在 PowerShell 中构建 hash table 是很常见的通过特定属性快速访问对象,例如以 LastName 为基础建立索引: $List = ConvertFrom-Csv @' I
我真的很难弄清楚如何调用嵌套 Polymer Web 组件的函数。 这是标记: rise-distribution组件有 canPlay我想从 rise-playlist
我写了一个小工具转储(以 dot 格式)一个项目的依赖关系图,其中所有位于同一目录中的文件都聚集在一个集群中。当我尝试生成包含相应图形的 pdf 时,dot开始哭: 命令 dot -Tpdf trim
给定一个 CODE ref,是否可以: 访问该 CODE ref 的解析树 通过指定 CODE ref 的解析树来创建一个新的 CODE ref,该解析树可以包含在 1 中返回的解析树的元素 通常我们
我是一名优秀的程序员,十分优秀!