负边距删除静态兄弟姐妹的背景属性

gec*_*kob 5 html css

我在底部使用负边距来拉相邻元素以重叠当前元素。我的目的是让它重叠。但我希望整个 div 重叠在图像上方。但是,事实证明它也删除了被拉元素的背景。有人可以解释一下吗?

<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
  <style>
    .div1 {
      background-color: black;
    }

    img {
      margin-bottom:-20px;
    }
  
  </style>
  
  <div class="container">
    <div class="row">
      <div class="col-xs-4">
        <img src="http://placehold.it/200x300" alt="">
        <div class="div1">
          Here is example text
        </div> 
      </div>
    </div>
  </div>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

http://jsbin.com/mejoci/edit?html,css,output

编辑:当元素被定位(固定|相对|绝对)但不是静态位置时它有点工作,即使没有设置位置也是默认位置。

Dan*_*eld 3

在示例代码中,两个元素共享相同的堆栈上下文。

既然如此,定义元素如何分层的规则在规范中定义如下:(粗体是我的)

在每个堆叠上下文中,以下图层按从后到前的顺序绘制:

  1. 形成堆叠上下文的元素的背景和边框。
  2. 具有负堆栈级别的子堆栈上下文(首先是最负的)。
  3. 流入、非内联级别、非定位后代。
  4. 非定位浮动。
  5. 流入、内联级、非定位后代,包括内联表和内联块。
  6. 堆栈级别为 0 的子堆栈上下文和堆栈级别为 0 的定位后代。
  7. 具有正堆栈级别的子堆栈上下文(首先是最不积极的)。

所以你可以看到 -在相同的堆叠上下文中-内联级元素(#5)绘制在非内联级元素(#3)之上

因此,在您的情况下 - 由于 和<img>共享<div>相同的堆叠上下文,并且该<img>元素是内联级元素 - 它被绘制<div>- 即使<div>在文档树顺序中稍后出现。

查看这个codepen 演示,它进一步说明了这一点


额外阅读:

Stacking Context 的详细描述

无 z 索引的堆叠 (MDN)

Z-Index 和 CSS 堆栈:哪个元素首先显示?