为什么绝对定位父元素宽度为零?

时间:2015-10-20 11:26:16

标签: css css3

  

绝对定位允许您将任何页面元素准确地放置在您想要的位置。您可以使用顶部,左下角和右侧的定位属性来设置位置。这些值将相对于具有相对(或绝对)定位的下一个父元素。如果没有这样的父级,它将默认一直备份到元素本身,这意味着它将相对于页面本身放置。

下面是代码,其中绝对定位的子(p)将相对于具有绝对定位的下一个父元素(div),但是{{1块宽度

div

下面是代码,其中绝对定位的子(<div style= "position:absolute;"> <p style = "position:absolute; top:4px; left:5px;"> text text </p> <br/> <br/> <br/> <br/> <br/> <br/> <br/> <br/> <br/> <br/> </div> )将相对于具有相对定位的下一个父元素(p),{{1阻止宽度为非零

div

在第一种情况下,为什么绝对定位的父元素(div)宽度为零?

2 个答案:

答案 0 :(得分:4)

绝对定位的元素决定自己的宽度,它们需要定义。静态div自动100%宽,但只要您将其定位absolute,它就会丢失此宽度,而不是预定义的宽度或默认0。静态(和相对)元素将按其内容推送,但绝对符号不会

答案 1 :(得分:2)

根据此处的规格:http://www.w3.org/TR/css3-positioning/#abs-pos

  

在绝对定位模型中......从正常流程中移除   完全...绝对定位的盒子建立一个新的包含   阻止正常流动儿童和绝对(但不固定或页面)   定位后代..

在您提供的示例中,div绝对定位,因此从正常流程中删除。不仅如此,后代p也是绝对定位的,因此也从流中移除,但其包含块由div建立。

现在,根据此处的规范:http://www.w3.org/TR/css3-positioning/#abs-non-replaced-width强调我的):

  

如果leftwidthright中的所有三个都是auto:首先设置任何auto   margin-leftmargin-right0的值。然后,如果direction   建立包含静态位置的元素的属性   block是ltr设置为静态位置, 应用规则编号   下面三个 ;否则,设置为静态位置并应用   下面的规则第一。

因此,在您的示例中,属性中不存在leftrightwidth,规则编号为3适用(忽略方向属性,截至目前,规则一和三宽度相同)。

规则3声明(强调我的):

  

如果widthrightautoleft不是auto,则width为   的 收缩以适应的 即可。然后求解right

当孩子p退出流程时,还有什么可以得出div的宽度以使其缩小到适合?它唯一的文字内容是breaks

实际上,这会将div缩小为0

对于p内的div,适用相同的规则。它也缩小到适合,但它的包含块是由它的祖先div建立的(参见上面的第一个参考)。因此它会在容器div的范围内缩小,以尽可能多地容纳内容。

将此样式添加到p - word-break: break-all,您会看到p将缩小到一个宽度以容纳一个字符。