我重新创建了一个我在模板中遇到的问题 . nav 有 position: relative;
. 在 nav 内部有一个 div ,其中嵌套了两个列表 .
其中一个列表绝对是坚持 nav 的底部 . 当 div 应用了转换时会发生此问题 .
当绝对和相对定位元素之间的 div 得到变换属性时,绝对列表相对于 div 而不是 nav 定位自己 .
MDN Docs state the following about position:absolute
不要为元素留出空间 . 相反,将其定位在相对于其最近定位祖先的指定位置(如果有的话),或相对于包含块 . 绝对定位的盒子可以有边距,并且它们不会与任何其他边缘一起折叠 .
这是否意味着转换元素是定位元素?为什么这样做?我在Edge,FF和Chrome中测试过 . 他们都行事一样 .
您可以在下面运行重新创建的代码段 . 我在导航的悬停上应用div的变换 .
*{
margin: 0;
padding: 0;
box-sizing: border-box;
}
html, body{
min-height: 100%;
height: 100%;
}
nav{
background: #000;
height: 100%;
width: 50%;
position: relative;
}
nav:hover > div{
transform: translateX(50px) translateY(0) translateZ(0);
}
a{
color: #fff;
}
ul{
padding: 16px;
}
ul.main{
background: blue;
}
ul.lower{
position: absolute;
background: red;
bottom: 0;
width: 100%;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<nav>
<div>
<ul class="main">
<li><a href="">link</a></li>
<li><a href="">link</a></li>
<li><a href="">link</a></li>
<li><a href="">link</a></li>
</ul>
<ul class="lower">
<li><a href="">link</a></li>
<li><a href="">link</a></li>
<li><a href="">link</a></li>
<li><a href="">link</a></li>
</ul>
</div>
</nav>
</body>
</html>
3 回答
基本上因为应用了transform属性的任何元素会自动触发新的堆叠顺序:https://developer.mozilla.org/en-US/docs/Web/CSS/transform
“如果属性的值不是none,则会创建堆栈上下文 . 在这种情况下,对象将作为position的包含块:它包含的固定元素 . ”
以下是有关堆叠上下文的一些额外信息:https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context
CSS规范声明defining a transform on an element creates a containing block:
那(see spec):
这里的关键是将元素的
transform
属性设置为none
之外的任何其他属性,创建一个新的 containing block ;堆叠上下文与元素的放置方式无关 .请参阅以下代码段中的示例 .
如果您将转换应用于
.main
而不是div
,它似乎按预期工作 .