绝对定位允许您将任何页面元素准确地放置在您想要的位置。您可以使用顶部,左下角和右侧的定位属性来设置位置。这些值将相对于具有相对(或绝对)定位的下一个父元素。如果没有这样的父级,它将默认一直备份到元素本身,这意味着它将相对于页面本身放置。
下面是代码,其中绝对定位的子(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
)宽度为零?
答案 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(强调我的):
如果
left
,width
和right
中的所有三个都是auto
:首先设置任何auto
margin-left
和margin-right
到0
的值。然后,如果direction
建立包含静态位置的元素的属性 block是ltr设置为静态位置, 应用规则编号 下面三个 ;否则,设置为静态位置并应用 下面的规则第一。
因此,在您的示例中,属性中不存在left
,right
和width
,规则编号为3适用(忽略方向属性,截至目前,规则一和三宽度相同)。
规则3声明(强调我的):
如果
width
和right
为auto
且left
不是auto
,则width
为 的 收缩以适应的 即可。然后求解right
。
当孩子p
退出流程时,还有什么可以得出div
的宽度以使其缩小到适合?它唯一的文字内容是breaks
。
实际上,这会将div
缩小为0
。
对于p
内的div
,适用相同的规则。它也缩小到适合,但它的包含块是由它的祖先div
建立的(参见上面的第一个参考)。因此它会在容器div
的范围内缩小,以尽可能多地容纳内容。
将此样式添加到p
- word-break: break-all
,您会看到p
将缩小到一个宽度以容纳一个字符。