我认为我理解了CSS定位的规则,直到我碰到下面的简单代码(也在JSFiddle中)。
#outer {
/*position: absolute;*/
box-shadow: inset 0 0 3px red;
}
#inner {
box-shadow: inset 0 0 3px blue;
/*position: absolute;
left: 15px;*/
}
<p id="outer">outer
<p id="inner">inner</p>
</p>
我没有得到的是:
position: absolute;
规则时,为什么outer
段落在inner
段之上?外部段落没有任何非静态父级,因此应该相对于浏览器窗口放置,对吧?position: absolute; left: 15px;
段落的inner
时,为什么元素会被按下一点?答案 0 :(得分:0)
外部没有重新定位,或者似乎没有,因为内部(和外部)有一个默认的边距,使其不会上升到顶部,我认为这是你所期望的。
第二个问题也是如此。内部有边距和线高。通过将margin,padding和line-height设置为零来播放,或者使用其他值来查看会发生什么。
顺便说一下,你的HTML无效。 validate :image_present
def image_present
if image.present? && image_file_size < 2.megabytes
errors.add(:file_size, "file size must be between 0 and 2 megabytes.")
end
end
元素不能包含其他<p>
元素。
答案 1 :(得分:0)
完全披露:W3C HTML Validator认为这不是有效标记,因此使用无效标记时结果可能会有所不同。一个好的重构(假设你希望#inner
标签的样式不同,那就是将它包装在<span></span>
标签中并适当地设置样式。
现在回答问题1:我的答案是因为一旦你给了一个position: absolute:
规则没有父有position: relative;
规则的元素,它将相对于浏览器窗口定位并被删除从文件流程。从那里#inner
元素将忽略#outer
元素并将其放在文档流中。
答案 2 :(得分:0)
p
标记内不允许使用块级元素。
http://www.w3.org/TR/html401/struct/text.html#h-9.3.1
您的原始html浏览器收到
<p id="outer">outer
<p id="inner">inner</p>
</p>
它注意到它无效并纠正它。浏览器在文本外部后添加结束p
标记。这使其具有结束</p>
标记。它通过添加开头<p>
标记来纠正这一点。
这是浏览器创建的html。浏览器添加的标签以粗体显示
<p id="outer"> outer
的 </p>
强>
<p id="inner"> inner </p>
的 <p>
强> </p>
因此你没有得到你期望的结果。
答案 3 :(得分:0)
首先,<p>
元素不应包含另一个<p>
元素。 #inner
和#outer
都是<p>
元素,默认情况下为display: block
。它们还有一个上下边距。
当您使用#outer
设置position: absolute
时,如果您检查,您可以看到#outer
相对于其第一个定位的祖先元素的位置 - <body>
。
如果您将代码更改为:
<div id="outer">outer
<p id="inner">inner</p>
</div>
然后将position: absolute
和left: 15px
应用于#inner
它现在相对于其祖先元素 - #outer
。
如果您需要在#inner
之上移动#outer
,则需要将显示值更改为display: inline;
两个元素并在{{position: absolute
上设置#inner
1}}并删除#outer
上的位置值。
请记住:position: absolute
=元素将相对定位到第一个定位(非静态)祖先元素。