我想了解当CSS为display:block
的元素是CSS为display:inline
的元素的DOM子元素时会发生什么(因此块元素是内联元素的子元素)。
CSS 2.1规范的Anonymous block boxes部分介绍了这种情况:该示例包含以下规则......
body { display: inline }
p { display: block }
......随附的文字说......
BODY元素包含一个块(C1) 匿名文本后跟一个 块级元素后跟 另一个匿名文本块(C2)。 结果框将是一个 身体周围的匿名挡盒, 包含匿名块框 在C1周围,P块框,和 C2周围的另一个匿名阻止框。
如果你有一个display:inline
父元素,如果这个父元素的子元素为display:block
,那么该子元素的存在似乎会使父元素接近的行为比如display:block
,并忽略它被定义为display:inline
的事实(因为父母现在只包含匿名和非匿名块子,但它不再包含任何内联子项)?
我的问题是,在这种情况下(有一个display:block
孩子),父母被定义display:inline
而不是display:block
之间有什么区别?
编辑:我对理解CSS 2.1标准比对各种浏览器实现在实践中的表现更感兴趣。
第二次编辑:
规范中注明了一个区别。在下面的文档中,第二个“块”段的边框围绕整个段落和页面的整个宽度;而第一个'内联段落的边框是在段落内的每一行(即使有多行),并且不超过每行的确切宽度(每行都比页面宽度短)。
<html>
<head>
<style type="text/css">
p.one
{
border-style:solid;
border-width:1px;
display: inline;
}
p.two
{
border-style:solid;
border-width:1px;
}
</style>
</head>
<body>
<p class="one">Some text. <b>Note:</b> The "border-width"
property does not work if it is used alone. Use the
"border-style" property to set the borders first.</p>
<p class="two">Some text.</p>
</body>
</html>
如果我添加以下样式规则......
b
{
display: block;
}
...然后第一个内联段落中的“注意:”变成一个块,它拆分段落(根据规范,段落的第一部分和最后部分现在是匿名块)。但是,段落的第一部分和最后一部分周围的边框仍然是“内联”式边框:因此,仍然不同于p.one
首先声明display:block
的情况。 / p>
该规范引用了一句话,
在导致的元素上设置属性 要生成的匿名块框 仍然适用于方框和内容 那个元素。例如,如果是 边界已经设置在BODY上 在上面的例子中,元素 边界将在C1周围绘制(打开 在线的末端)和C2(打开 在行的开头)。
“border-style”属性是唯一可以看到差异的属性吗?
答案 0 :(得分:29)
当我阅读the spec时,我发现您的问题实际上是quite well answered:
当内联框包含一个块框时,内嵌框[...]在块周围被打破。中断前和中断后的[in]行框用匿名框括起来,块框成为这些匿名框的兄弟。
<BODY style="display: inline; ">
This is anonymous text before the P.
<P>This is the content of P.</P>
This is anonymous text after the P.
</BODY>
结果框将是BODY周围的匿名块框,包含C1周围的匿名块框,P块框和C2周围的另一个匿名块框。
或者,视觉上:
+- anonymous block box around body ---+
| +- anonymous block box around C1 -+ |
| | + |
| +---------------------------------+ |
| |
| +- P block box -------------------+ |
| | + |
| +---------------------------------+ |
| |
| +- anonymous block box around C2 -+ |
| | + |
| +---------------------------------+ |
+-------------------------------------+
现在问你的问题:这与<BODY style="display: block; ">
不同吗?
在导致生成匿名块框的元素上设置的属性仍然适用于[生成的匿名块]框和该元素的内容。例如,如果在BODY上设置了边框在上面的例子中,边框将围绕C1(在行尾打开)和C2(在行的开头处打开)绘制:
+--------------------------------------
| This is anonymous text before the P.
+--------------------------------------
This is the content of P.
--------------------------------------+
This is anonymous text after the P. |
--------------------------------------+
这与<BODY style="display: block; ">
不同:
+--------------------------------------+
| This is anonymous text before the P. |
| |
| This is the content of P. |
| |
| This is anonymous text after the P. |
+--------------------------------------+
答案 1 :(得分:7)
内联容器不能包含块容器。发生这种情况时的通常结果是内联容器被转换为块以容纳其内容。如果您需要一个内联显示的容器,其中包含看似块的内容,请使用以下命令:
display: inline-block;
inline-block属性是一种显示模式,它以内联方式定位容器,内联容器的直接属性和定义仅应用于容器本身,而不会将其子项限制为此类约束。结果是,如果父级已定义定义,或者可能导致父级维度扩展以容纳更大的子级,则内联块父级的块容器子级将限制为父级的维度。设置为内联块的容器可以接收仅提供给块的属性,例如宽度或高度,而不会丢失与内联容器关联的默认定位。
FF2不支持该属性,因此Ice Weasel浏览器不支持该属性。几乎所有其他浏览器都支持该属性,包括IE6,所以你可以使用它,因为几乎没有人使用FF2或Ice Weasel,只有少数用户被限制在开箱即用的Linux发行版中。
答案 2 :(得分:1)
有时取决于确切的css
或浏览器。
最常见的是,我看过两种行为:
display:block
元素中的display:inline
元素使display:inline
表现得像display:block
width:100%
。
仅包含display:inline
display:block
或float:left
元素的float:right
元素不占用空间,就好像其中没有元素一样。 display:block
元素就像在另一个display:block
元素中的位置一样,有时根据position
执行时髦的操作。
position
和float
都会使子元素有时会出现奇怪的行为,但是避免使用它们会使它们像inline
一样工作。
答案 3 :(得分:1)
我认为我最终理解了这种差异,并且存在根本区别。
当使用display:block定义顶级元素(例如<BODY>
)时,则:
有一个与元素相关联的块
此块包含(即它充当包含块)匿名块(例如文本节点)和非匿名子元素(例如<P>
块)
顶级元素的样式属性,例如填充,与此包含块相关联
当使用display:inline定义顶级元素(例如<BODY>
)时,则:
没有与元素
元素的内容(匿名块中的文本节点和非匿名块中的子元素)不具有与顶级元素关联的包含块< / p>
顶级元素的样式属性,例如填充,与其内联内容相关联