【发布时间】:2018-07-21 17:11:09
【问题描述】:
情况如下:
body {
margin: 0;
background: pink;
color: #fff;
}
.box {
margin-top: 20px;
background: red;
}
.bottom {
text-align: right;
background: green;
animation: animate 2s infinite alternate linear;
}
@keyframes animate {
from {
margin-top: 10px;
}
to {
margin-top: -40px;
}
}
<div class="box">
some content
</div>
<div class="bottom">
other content
</div>
发生了什么?
如您所见,我们有两个div,没有任何复杂的样式(只是背景颜色)。我通过应用否定的margin-top 使第二个div 与第一个重叠。我希望看到一个完全重叠另一个,但事实并非如此。第二个div 在第一个的内容和背景之间滑动,这对我来说是一个奇怪的行为。
动画在这里无关,我只是用它来更好地展示行为。我们可以简单地在没有动画的情况下添加负边距,我们会得到同样的结果:
body {
margin: 0;
background: pink;
color: #fff;
}
.box {
margin-top: 20px;
background: red;
}
.bottom {
margin-top:-10px;
text-align: right;
background: green;
}
<div class="box">
some content
</div>
<div class="bottom">
other content
</div>
所以我的问题是:为什么会有这样的行为?
顺便说一句,我们都知道 CSS 有一些棘手的事情,当我们第一次面对它们时我们不会怀疑它们(比如边缘折叠、从正文到 html 的背景传播、空白问题等。 ..) 但它们在某处得到了清楚的解释,我希望找到一个官方资源,我可以清楚地理解这一点,而不仅仅是得到像 “也许这是因为......”,“这样的东西我怀疑这与...”、“我认为这与...有关”等。
我对此的看法/解释
我认为像文本这样的内容比背景和其他视觉样式更重要,所以当我们重叠时,我们将所有文本放在顶部,所有其他样式放在底部,我们决定每个组内的顺序,然后我们打印结果。
这是一个更复杂的例子:
body {
margin: 0;
background: pink;
color: #fff;
}
div {
font-size: 39px;
line-height: 28px;
margin-bottom: -20px;
font-weight: bold;
}
body :nth-child(1) {
background: red;
border:3px solid brown;
}
body :nth-child(2) {
background: blue;
border:3px solid yellow;
color: #000;
}
body :nth-child(3) {
background: green;
border:3px solid orange;
}
<div>
some content
</div>
<div>
other content
</div>
<div>
more content
</div>
我们可以清楚的看到视觉栈如下(从下往上):
- 第一个 div(背景+边框)的样式
- 第二个 div(背景+边框)的样式
- 第三个 div(背景+边框)的样式
- 第一个 div的文本内容
- 第二个 div的文本内容
- 第三个 div的文本内容
重要通知:在回答之前,请注意,我不是在寻找解决此问题或如何避免此问题的方法。只需添加position:relative,行为就会消失,我们可以使用z-index 来决定堆叠。我希望了解为什么会发生这种情况。
【问题讨论】:
-
@Danield 啊!我很漂亮,有一个 dup :) [我在我的问题中也说过,但删除了通知,因为没有人出现你有点困惑......而且也没有明确的理由为什么它会像我们预期的那样而不是像我们预期的那样:/
-
是的,这非常违反直觉......顺便说一句。即使基本问题相同,我也不会将您的问题称为重复问题,因为您也在问为什么规范也必须是这样的。我的问题的答案中也没有解释为什么。我很想看看有没有人能解释一下,谢谢! +1
-
这种行为是否仅在您对属性使用负值时才会发生?还是正值也会发生这种情况?
-
@YvonneAburrow 好吧,这种行为发生在重叠时,所以我认为你不能使用边距的正值进行重叠......所以我在这里发现的唯一原因是使用负边距使它们重叠,但从理论上讲,如果也有一些正边距也会发生这种情况;)
标签: html css background overlap