如果块元素包含另一个块元素,那么将块元素更改为内联 CSS 是错误的吗? [英] Is it wrong to change a block element to inline with CSS if it contains another block element?

查看:23
本文介绍了如果块元素包含另一个块元素,那么将块元素更改为内联 CSS 是错误的吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道将块元素放在内联元素中是错误的,但下面的呢?

想象一下这个有效的标记:

这是一个段落

现在添加这个 CSS:

div {显示:内联;}

这会造成内联元素包含块元素的情况(div变为内联,p默认为块)

页面元素是否仍然有效?

我们如何以及何时判断 HTML 是否有效 - 在应用 CSS 规则之前或之后?

更新:从那以后我了解到在 HTML5 中将块级元素放在链接标签中是完全有效的,例如:

<h1>标题</h1><p>段落.</p></a>

如果您希望将一大块 HTML 用作链接,这实际上非常有用.

来自 CSS 2.1 规范:

<块引用>

当内联框包含流入块级框时,内联框(及其在同一行框内的内联祖先)在块级框(以及任何连续或仅由可折叠的空白和/或流外元素分隔),将内联框分成两个框(即使任一侧为空),块级框的每一侧一个.中断之前和中断之后的行框都包含在匿名块框中,块级框成为这些匿名框的兄弟.当这样的内联框受到相对定位的影响时,任何由此产生的翻译也会影响内联框内包含的块级框.

如果符合以下规则,此模型将适用于以下示例:

p { display: inline }跨度{显示:块}

与此 HTML 文档一起使用:

<头部><TITLE>被块打断的匿名文本</TITLE><身体><P>这是 SPAN 之前的匿名文本.<SPAN>这是SPAN的内容.</SPAN>这是 SPAN 之后的匿名文本.</P></身体>

P 元素包含一个匿名文本块 (C1),然后是一个块级元素,然后是另一个匿名文本块 (C2).生成的框将是一个代表 BODY 的块框,其中包含一个围绕 C1 的匿名块框、SPAN 块框和另一个围绕 C2 的匿名块框.

匿名框的属性是从封闭的非匿名框继承而来的(例如,在小节标题匿名块框"下方的示例中,DIV 的属性).非继承属性有它们的初始值.比如匿名框的字体是继承自DIV,但是边距为0.

在导致生成匿名块框的元素上设置的属性仍然适用于该元素的框和内容.例如,如果在上面的例子中在 P 元素上设置了边框,那么边框将围绕 C1(在行尾打开)和 C2(在行首打开)绘制.

一些用户代理以其他方式在包含块的内联上实现了边框,例如,通过将这些嵌套块包装在匿名行框"中,从而在这些框周围绘制内联边框.由于 CSS1 和 CSS2 没有定义这种行为,CSS1-only 和 CSS2-only 用户代理可以实现这个替代模型,并且仍然声称符合 CSS 2.1 的这一部分.这不适用于本规范发布后开发的 UA.

按照你的意愿去做.显然,该行为是在 CSS 中指定的,但它是否涵盖所有情况,还是在当今的浏览器中一致实现尚不清楚.

I know it's wrong to put a block element inside an inline element, but what about the following?

Imagine this valid markup:

<div><p>This is a paragraph</p></div>

Now add this CSS:

div {
   display:inline;
}

This creates a situation where an inline element contains a block element (The div becomes inline and the p is block by default)

Are the page elements still valid?

How and when do we judge if the HTML is valid - before or after the CSS rules are applied?

UPDATE: I've since learned that in HTML5 it is perfectly valid to put block level elements inside link tags eg:

<a href="#">
      <h1>Heading</h1>
      <p>Paragraph.</p>
</a>

This is actually really useful if you want a large block of HTML to be a link.

解决方案

From the CSS 2.1 Spec:

When an inline box contains an in-flow block-level box, the inline box (and its inline ancestors within the same line box) are broken around the block-level box (and any block-level siblings that are consecutive or separated only by collapsible whitespace and/or out-of-flow elements), splitting the inline box into two boxes (even if either side is empty), one on each side of the block-level box(es). The line boxes before the break and after the break are enclosed in anonymous block boxes, and the block-level box becomes a sibling of those anonymous boxes. When such an inline box is affected by relative positioning, any resulting translation also affects the block-level box contained in the inline box.

This model would apply in the following example if the following rules:

p    { display: inline }
span { display: block }

were used with this HTML document:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HEAD>
  <TITLE>Anonymous text interrupted by a block</TITLE>
</HEAD>
  <BODY>
    <P>
      This is anonymous text before the SPAN.
      <SPAN>This is the content of SPAN.</SPAN>
      This is anonymous text after the SPAN.
    </P>
  </BODY>

The P element contains a chunk (C1) of anonymous text followed by a block-level element followed by another chunk (C2) of anonymous text. The resulting boxes would be a block box representing the BODY, containing an anonymous block box around C1, the SPAN block box, and another anonymous block box around C2.

The properties of anonymous boxes are inherited from the enclosing non-anonymous box (e.g., in the example just below the subsection heading "Anonymous block boxes", the one for DIV). Non-inherited properties have their initial value. For example, the font of the anonymous box is inherited from the DIV, but the margins will be 0.

Properties set on elements that cause anonymous block boxes to be generated still apply to the boxes and content of that element. For example, if a border had been set on the P element in the above example, the border would be drawn around C1 (open at the end of the line) and C2 (open at the start of the line).

Some user agents have implemented borders on inlines containing blocks in other ways, e.g., by wrapping such nested blocks inside "anonymous line boxes" and thus drawing inline borders around such boxes. As CSS1 and CSS2 did not define this behavior, CSS1-only and CSS2-only user agents may implement this alternative model and still claim conformance to this part of CSS 2.1. This does not apply to UAs developed after this specification was released.

Make of that what you will. Clearly the behaviour is specified in CSS, although whether it covers all cases, or is implemented consistently across today's browsers is unclear.

这篇关于如果块元素包含另一个块元素,那么将块元素更改为内联 CSS 是错误的吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆