为什么绝对元素会相互堆叠而不是一个接一个地堆叠?

新手上路,请多包涵

如何让下面的代码中的 #row1#row2 在垂直方向上一个接一个地可见,就好像没有涉及任何 absolute/relative 定位 ca尽管没有删除定位属性)?即有两个 .row <div> 显示为“正常”块元素。

 body { position:relative; min-height: 2em; width: 100%; }
.container {position:absolute;}
.row {position:relative;}
.col1, .col2 {position: absolute;}
 <body>
  <div class="container">
    <div id="row1" class="row">
      <div class="col1">Hello</div>
      <div class="col2">World</div>
    </div>
    <div id="row2" class="row">
      <div class="col1">Salut</div>
      <div class="col2">le monde</div>
    </div>
  </div>
</body>

(样本也可作为 小提琴 使用。)

由于此处排除的原因,我需要元素具有 CSS 规则中提供的定位。

内容在程序上是动态的;我事先不知道元素的高度,所以解决方案不能基于在任何地方指定绝对长度(例如’px’)。

原文由 Fellow Stranger 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 310
2 个回答

好吧,你有一些奇怪的愿望,所以让我向你解释一下这些位置在 CSS 中的真正含义以及它们是如何工作的,使用 position: relative; 就像使用 static position , the difference is making an element position: relative; , you will be able to use top , right , bottom and left 属性,虽然元素会移动,但实际上它会在文档流中..

在此处输入图像描述

来到 position: absolute; ,当你制作任何元素 position: absolute; 时,它脱离了文档流,因此,它与任何其他元素无关,所以在你的例子中你有 .col1, .col2 {position: absolute;} 位于 absolute 并且由于两者都不在文档流中,它们将重叠…因为它们已经嵌套在 position: absolute; .container 因为没有分配 width ,它将占用最小的 width 因此,你的元素重叠,如果你不能改变我的 CSS’t明白为什么你不能改变)仍然如果你愿意,你能做的就是这个..

演示(不删除您的任何 position 属性)这真的很脏


对于 s 字符,它将位于 top 因为您的容器元素不在流中,因此,文档中不会考虑 height 流,除非并且直到你将 s 包装在某个元素中,并用 margin padding 或 CSS 定位。


CSS 位置解释

正如我所评论的,这里有几个 CSS 定位实际如何工作的例子,首先, position 属性有 4 个值,即 static 这是默认值, relative , absolutefixed , 所以从 static 开始 display: inline-block 。 With static positioning, top , right , bottom and left won’t work.

演示


来到 position: relative; 我已经向你解释了一般情况,它与 static 一样,它堆叠在其他元素上,它在文档流中,但你可以调整elements position using top , right , bottom and left , physically, the element stays in the flow,只有元素的 position 发生了变化。

演示 2


现在来 absolute 这通常很多人无法理解,在制作元素时 absolute 它脱离了文档流,因此保持独立,与其他元素定位无关除非它被其他 position: absolute 元素重叠,可以使用 z-index 更改堆栈级别。这里要记住的主要事情是有一个 position: relative; 容器,这样你的 absolute 定位的元素是 对于那个 relative 定位的元素,否则你的元素将飞出元素在野外。

值得注意的是 position: absolute; 元素定位 absolute; 内部 absolute 定位父元素,而 不是相 对于哪个父元素可能位于 relative

演示 3 (没有 position: relative; 容器)

演示 4 (使用 position: relative; 容器)


最后是 position fixed ,这与 absolute 相同,但是当你滚动时它会流动,它不在文档流中,但它也会滚动 position: fixed; element cannot be relative to any container element having any type of position , not even relative , position fixed element is always relative to the viewport, so designers use position: absolute; when they want to have a fixed position behavior but relative 父级并调整 top 属性 onScroll

演示 5

原文由 Mr. Alien 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果不修改 CSS position 属性,你想要的是不可能的。但是,在不触及现有 CSS 的情况下,您可以用更具体的选择器覆盖它

.row .col1, .row .col2 {
    position: relative;
}

参见 JSFiddle

原文由 Olaf Dietsche 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题