【问题标题】:How to put a block-level element inside an inline element?如何将块级元素放入内联元素中?
【发布时间】:2013-08-04 18:48:53
【问题描述】:

在我的部分代码中,我将<DIV> 元素放在<SPAN> 中。通过 CSS 自定义,它可以正常工作,但页面没有通过 W3 验证。

代码如下:

<span class="spanclass">
    <div class="divclass">Content</div>
</span>

验证后出现此错误:

所提到的元素不允许出现在上下文中 你已经放置了它;其他提到的元素是唯一的元素 都允许在那里并且可以包含提到的元素。这 可能意味着您需要一个包含元素,或者您可能已经 忘记关闭前一个元素。造成这种情况的一个可能原因 消息是您试图放置一个块级元素(例如 作为内联元素中的“&lt;p&gt;”或“&lt;table&gt;”)(例如“&lt;a&gt;&lt;span&gt;“或“&lt;font&gt;”)。

我知道如果我使用 &lt;div&gt; 而不是 &lt;span&gt; 可以轻松解决此问题,但我对另一种解决方案感兴趣:

如何使用DTD 声明强制验证器,以允许内联元素中的块级元素?

【问题讨论】:

    标签: html validation dom dtd xml


    【解决方案1】:

    您已经知道它是无效的 HTML。因此,为了符合标准实践并仍然实现您想要重用您的spanclass CSS 来定义一个新的 CSS 类为

    spanclass, divlikespanclass {
      /* span css data */
    }
    

    并将您的 HTML 更改为

    <div class="divlikespanclass">
        <div class="divclass">Content</div>
    </div>
    

    或者,简单地说

    <div class="divclass divlikespanclass">Content</div>
    

    编辑:(响应 OP 的 cmets;但不推荐)

    重新声明&lt;SPAN&gt;

    <!ELEMENT SPAN - - ((%inline;) | DIV)*  -- generic language/style container -->
    

    或者,应用于所有内联元素的变化

    <!ENTITY % inline "#PCDATA | DIV | %fontstyle; | %phrase; | %special; | %formctrl;">
    

    【讨论】:

    • 感谢您的建议,但我在问题中提到,我知道如何通过 DOM 更改来做到这一点。我的问题与 DTD 声明有关,而不是与 HTML 元素的使用有关。我的意思是,我想找到,如果有办法通过 DTD 做到这一点。请参阅@MrP 的回答中的my comment
    • @zur4ik 请检查更新。我没有尝试使用新的 DTD 进行验证,但我想你明白了。
    • 第一种方法仅适用于跨度给出错误:HTML ERROR parameter entity "inline" not defined,但另一种适用于所有对象的方法正在工作。谢谢!
    【解决方案2】:

    您(以及此处的大多数答案)似乎混淆了三个截然不同的概念:有效性、针对 HTML(或 XHTML)DTD 的有效性以及对 HTML(或 XHTML)规范的一致性。

    • 当且仅当文档符合特定 DTD 中表达的规则时,文档才对特定 DTD 有效。

      您可以通过提供文档有效的 DTD 来使任何文档有效(在某种绝对意义上)。这允许数据通过无意义和无意义的测试,这些测试要求 XML 在其生命周期中的某个特定点有效,而无需指定它对什么模式有效。 (您听起来好像是在试图让数据通过这样的测试,但目前尚不清楚这种无意识和无意义的测试是别人强加给您的,还是您自己强加给您的。)

      具体而言,您可以通过告诉验证器使用适当的 DTD(或其他模式)来使通用 XML 验证器报告您的输入是有效的。如果您制作了 XHTML DTD 的修改版本,并从您的文档中指向它,那么您描述的文档很容易被报告为针对该 DTD 有效。 (这不一定适用于 HTML 的 W3C 验证服务,因为该服务不是通用的基于 DTD 的验证器,它对 HTML 输入使用特殊规则。)

    • 当且仅当文档符合该(该风味的)DTD 中表达的规则时,文档才针对(X)HTML DTD(该风味的某个风味)有效。

      您不能使在span 元素中嵌入div 元素的HTML 文档对该DTD 有效,因为根据定义,DTD 禁止此类嵌入。修改 DTD 以使其接受此类嵌入具有生成新的不同 DTD 的自然结果,该 DTD 不再是 (X)HTML DTD。

    • 一个文档符合 (X)HTML 规范当且仅当它满足该规范中规定的文档的一致性要求。

      您不太可能使在span 元素中嵌入div 元素的文档被视为符合标准。一个结论性的演示需要比我今天早上花更多的时间来处理 HTML 规范。

    【讨论】:

      【解决方案3】:

      你不能(或不应该)因为它违反规范。

      跨度只能包含“短语内容”。基本上这归结为: &lt;abbr&gt;, &lt;audio&gt;, &lt;b&gt;, &lt;bdo&gt;, &lt;br&gt;, &lt;button&gt;, &lt;canvas&gt;, &lt;cite&gt;, &lt;code&gt;, &lt;command&gt;, &lt;datalist&gt;, &lt;dfn&gt;, &lt;em&gt;, &lt;embed&gt;, &lt;i&gt;, &lt;iframe&gt;, &lt;img&gt;, &lt;input&gt;, &lt;kbd&gt;, &lt;keygen&gt;, &lt;label&gt;, &lt;mark&gt;, &lt;math&gt;, &lt;meter&gt;, &lt;noscript&gt;, &lt;object&gt;, &lt;output&gt;, &lt;progress&gt;, &lt;q&gt;, &lt;ruby&gt;, &lt;samp&gt;, &lt;script&gt;, &lt;select&gt;, &lt;small&gt;, &lt;span&gt;, &lt;strong&gt;, &lt;sub&gt;, &lt;sup&gt;, &lt;svg&gt;, &lt;textarea&gt;, &lt;time&gt;, &lt;var&gt;, &lt;video&gt;, &lt;wbr&gt; or plain text。 请参阅https://developer.mozilla.org/en-US/docs/Web/HTML/Content_categories#Phrasing_content 了解更多信息

      【讨论】:

      • 我知道这一点,但如果你在对象上有一些自定义属性,它也是无效的,例如:&lt;li rel="value"&gt;&lt;/li&gt; 但是如果你将&lt;!ATTLIST li rel CDATA #IMPLIED&gt; 放在&lt;!DOCTYPE&gt; 声明中,那么它变得有效。所以我的问题是:有什么方法可以强制,我的问题中提到的,有效吗?
      猜你喜欢
      • 2010-12-15
      • 2011-08-29
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 2021-01-23
      • 2010-10-17
      相关资源
      最近更新 更多