【问题标题】:Using position:absolute, the nearest positioned ancestor is having no effect使用位置:绝对,最近的定位祖先无效
【发布时间】:2017-03-19 22:42:13
【问题描述】:

我有一个父 div 和一个子 div。父级有一个图像。子 div 有另一个图像。子图像需要出现在父图像的左上角,我想将子图像的位置设置为absolute,并将父图像的位置设置为某个非静态位置,例如relative 或absolute。 (我也设置了left 和top,但我们暂时忘记它。)

这是因为为子元素设置 absolute 只有当它的第一个祖先按照 W3Schools absolute 非静态定位时才应该起作用,这意味着 元素相对于它的第一个定位(不是static) 祖先元素。

但我注意到,即使我没有设置父级的位置(即默认情况下它的位置将是“静态”),那么子图像仍然可以很好地定位在左上角。

有人可以帮助我理解为什么我不必将父级的位置设置为某个非静态值以使absolute 属性正常工作吗?还是我对absolute 的工作理解有误?

<div class="parent">
    <img src="https://lh4.ggpht.com/wKrDLLmmxjfRG2-E-k5L5BUuHWpCOe4lWRF7oVs1Gzdn5e5yvr8fj-ORTlBF43U47yI=w300">
  <div class="child">
    <img src="http://xiostorage.com/wp-content/uploads/2015/10/test.png" width="200">
  </div>
</div>

/*.parent {
  position:relative;
}*/

.child {
  display:none;
  position:absolute;
  left:0;
}
.parent:hover .child {
  display:initial;
}

Here is the JSFiddle code.

更新: Connexo 帮助更新了代码。

尝试取消注释 position 以解开谜团。接受的答案有更多信息。

<h1>
   Positioning test
</h1>
<div class="parent">
    <img src="https://lh4.ggpht.com/wKrDLLmmxjfRG2-E-k5L5BUuHWpCOe4lWRF7oVs1Gzdn5e5yvr8fj-ORTlBF43U47yI=w300">
  <div class="child">
    <img src="http://xiostorage.com/wp-content/uploads/2015/10/test.png" width="200">
  </div>

/*
.parent {
  position:relative;
}*/

.child {
  display: none;
  position: absolute;
  left: 0;
  top: 0;
}
.parent:hover .child {
  display:initial;
}

【问题讨论】:

  • 但是我注意到,即使我没有设置父级的位置(即默认情况下它的位置将是“静态”),事件然后子图像仍然很好地定位在顶部-left。现在用right: 0;而不是left: 0;试试同样的方法,你就更接近谜团了。
  • 元素相对于其第一个定位(非静态)祖先元素进行定位。如果没有,则定位到body。在您的示例中,哪个与 div.parent 共享左上角。
  • @connexo,而不是 body。 initial containing block 或 HTML / 视口。
  • @connexo 您的第一条评论并没有帮助我接近谜团,但由于引入了新的 H1 标签,jsfiddle 示例确实有所帮助。 :) 谢谢。

标签: css css-position


【解决方案1】:

要记住的两条一般规则:

  • 一个绝对定位的元素将被定位在它的包含块中,它由最近的定位祖先定义。但是,如果没有定位的祖先,则包含块是初始包含块(即视口)。

    您的.parent div 几乎与视口的左上角对齐。这就是为什么你的绝对定位的孩子在任何一个包含块中都会有相似的定位。

  • 当您将position: absolute 应用于一个元素时,您会将其从正常流程中移除。而已。元素仍将被定位,就好像它在正常流中一样。直到您应用 CSS 偏移属性(left、right、top、bottom)后,您才能真正定位元素。

【讨论】:

  • 谢谢@Michael_B。你能告诉你视口是什么意思吗?我的代码中的视口是什么?
  • 出于所有意图和目的,它是html 元素(也称为根元素)。详细解释见:w3.org/TR/CSS22/visudet.html#containing-block-details
  • 是否可以使用css 或javascript 找到绝对 定位元素的定位包含块? (例如为块添加边框。)如果是,那么如何? :) 谢谢
【解决方案2】:

您忘记在您的 JSFiddle 中设置 top,所以它所做的只是与页面的左侧对齐,您的图像也是如此。在 JSFiddle 中添加 top: 0px 后,您会注意到图片确实位于页面的左上角。

下面是添加了top 和margin 将.parent 推离角落的简单演示。

.parent {
  margin: 30px;
  /* position: relative;*/
}
.child {
  display:none;
  position:absolute;
  left:0;
  top:0;
}
.parent:hover .child {
  display:initial;
}
<div class="parent">
    <img src="https://lh4.ggpht.com/wKrDLLmmxjfRG2-E-k5L5BUuHWpCOe4lWRF7oVs1Gzdn5e5yvr8fj-ORTlBF43U47yI=w300">
  <div class="child">
    <img src="http://xiostorage.com/wp-content/uploads/2015/10/test.png" width="200">
  </div>
</div>

【讨论】:

  • 零长度的单位应该省略。最重要的是,OP 的代码确实为.child 定义了top: 0;。
  • @connexo w3.org/TR/CSS2/syndata.html#length-units 标识符是可选的,所以添加它没有错,我个人认为它更清晰。
  • @connexo 我回答时内联代码不存在。我回答后他编辑了问题。
  • 还有什么比0 更清楚的呢?即使实际上您是正确的并且该单位对于零长度是可选的,但它比例如 imo 更具可读性和简洁性。 0px。顺便说一句,我认为几乎没有人再提到 CSS 2。这是您的链接的 CSS 3 版本:w3.org/TR/css3-values/#lengths
  • @davidmulder 感谢您的回答。在将问题发布到 stackoverflow 之前,我确实尝试了 top 属性,发现设置 top 或不设置没有任何区别。不知道你为什么说“顶级”是这里的问题。 (我再次从内联代码中删除了顶部)。我的问题是为什么我不需要将父母的位置设置为“相对”以确保孩子工作的“绝对”。
猜你喜欢
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
相关资源
最近更新 更多