我的理解是,使用display:inline-block
样式化的元素将在内部作为块布局,但在其内部的任何容器中都被视为内联元素。如果他们在li
或div
或其他一些东西里面,那似乎是真的;但如果他们在p
里面,那就不同了,原因我不明白。请考虑以下示例:
<!DOCTYPE html>
<p>Test1<table style="display:inline-block"><tr><td>x</td></tr></table>Test1</p>
<div>Test2<table style="display:inline-block"><tr><td>x</td></tr></table>Test2</div>
<p>Test3<span style="display:inline-block"><table><tr><td>x</td></tr></table></span>Test3</p>
<div>Test4<span style="display:inline-block"><table><tr><td>x</td></tr></table></span>Test4</div>
此处前两行的内容display:inline-block
分别位于p
和div
内。接下来的两个内容包含span
内的表格,该表格具有内联块样式,同样位于p
和div
内。在Test2和Test4中,div
个案例,整个事情出现在一行上(正如我所期望的那样)。在Test1中,所谓的内联块元素在前面有一个换行符,在Test3中,所谓的内联块元素前面和后面都有一个换行符。
为什么?
答案 0 :(得分:4)
这是不属于p
元素的流元素的经典案例,以两种有趣的方式表现。前言:p
元素不能包含流元素,包括table
。请参阅spec。这些流元素被放置为p
元素的以下兄弟节点。所以:
<p><table></table></p>
确实是<p></p><table></table><p></p>
和<p><span><table></table></span></p>
真的是<p><span></span></p><table></table><p></p>
。(在Why does a stray </p> end tag generate an empty paragraph?)
中解释了两个案例中迷路</p>
结束标记与新<p>
开始标记匹配的原因
当包含元素为div
时,您已经知道了预期的行为,因此我们只关注具有p
元素的Test1和Test3。
在Test1中,内联块元素前面有一个换行符,因为它位于p
之后的新段落中。 (请注意,将table
元素显示为内联块实际上只会导致table
元素生成一个包含其后代的匿名表框 - 这就是表格布局似乎被保留的原因。)以下&#34;测试1&#34;文本随之流动,因为它位于同一个匿名段落中,与内联块位于同一行。
请注意,通过将迷路</p>
结束标记与其自己的开始标记匹配而生成的段落实际上并不包含该文本。我在上面链接的同一问题中描述了这种行为。
在Test3中,p
元素能够包含内联块,因为它是span
元素。但是,p
元素在table
元素开始的位置结束,因此内联块span
完全包含在p
元素中,并且不包含{{1 (事实上,它完全是空的)。所以table
出现在它自己的行上,它的布局完好无损,以及下面的&#34; Test3&#34;文本出现在table
之后的另一行上,因为默认情况下表是块级的,因此永远不会出现在与任何其他元素(包括内联)相同的行上。
另请注意,所有这些行为都非常明确(在相应的规范中),并且虽然table
元素不能包含p
元素,但Test1中的所有内容都会导致但不是包括table
结束标记在技术上是有效的HTML。它没有像你预期的那样表现。
答案 1 :(得分:3)
table
元素不允许作为p
的子元素。 p element有一个phrasing content模型,table
不是短语内容。
答案 2 :(得分:0)
[更新] ========这个答案已经过时了||属于4.0规格===========
The P element represents a paragraph. It cannot contain block-level elements (including P itself).
source。
表是一个块元素......所以这可能不是准确的答案,但它是代码示例的基本问题。
答案 3 :(得分:0)
aabbbcccc
是块级元素,它只能包含内联元素,尽管它是块级元素。
有关详细信息,请参阅p - Paragraph
元素here