我听说在内联元素中放入块元素是一种HTML错误:
<a href="http://example.com">
<div>
What we have here is a problem.
You see, an anchor element is an inline element,
and the div element is a block level element.
</div>
</a>
但是如果在样式表中将外部锚设置为display:block呢?还是错的吗?关于块级和内联元素的HTML 4.01规范似乎是这样认为的:
样式表提供了实现的方法
指定任意的呈现
元素,包括是否为元素
呈现为块或内联。在
有些情况,比如内联样式
对于列表元素,这可能是
恰当,但总的来说,
不鼓励作者
超越常规
HTML元素的解释
这种方式。
有没有人对这个问题有进一步的建议?
W3C文档没有使用错误和罪恶这样的概念,但它确实使用了诸如提供方法、可能是适当的和不鼓励的概念。
实际上,在第4节的第二段中,4.01规范列出了如下的单词
本文件中的关键字“必须”、“必须不”、“要求”、“应当”、“不应当”、“应该”、“不应该”、“建议”、“可能”和“可选”按[RFC2119]解释。但是,为了可读性,这些单词在本规范中不以所有大写字母出现。
考虑到这一点,我相信在7.5.3块级和内联元素中有明确的声明,其中说
通常,内联元素只能包含数据和其他内联元素。
条件“一般”似乎引入了足够的模糊性,说明HTML 4.01确实允许内联元素包含块元素。
当然,CSS2有一个显示属性值inline-block,它似乎适合您所描述的目的。我不确定它是否得到了广泛的支持,但似乎有人预见到了这种行为的需要。
DTD在这里似乎不那么宽容,但DTD的文本遵从规范:
HTML 4.01规范包括额外的
不能在内部表示的语法约束
dtd。
在另一个注释中,您建议通过将块包装在锚中使其激活。我不认为HTML禁止这样做,CSS显然允许这样做。因此,要回答标题中关于它是否正确的问题,我的回答是肯定的。按照标准,这有时是正确的。
在http://www.w3.org/TR/REC-html40/sgml/dtd.html上有一个针对HTML 4的DTD。这个DTD是规范的机器可处理形式,限制了DTD管理XML和HTML 4,特别是“暂时的”类型,允许许多不是“合法的”XML的东西。不过,我认为它接近于编纂说明符的意图。
<!ELEMENT A - - (%inline;)* -(A) -- anchor -->
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">
<!ENTITY % phrase "EM | STRONG | DFN | CODE | SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
<!ENTITY % special "A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">
我将把这个层次结构中列出的标签解释为允许的标签总数。
虽然规范可能会说“内联元素”,但我非常确定,它并没有打算通过将块元素的显示类型声明为内联来绕过这个意图。无论您如何滥用内联标记,它们都具有不同的语义。
另一方面,我发现包含special似乎允许嵌套A元素是很有趣的。规范中可能有一些强硬的措辞禁止这样做,即使它在xml语法上是正确的,但我不会进一步讨论这个问题,因为这不是问题的主题。
W3C文档没有使用错误和罪恶这样的概念,但它确实使用了诸如提供方法、可能是适当的和不鼓励的概念。
实际上,在第4节的第二段中,4.01规范列出了如下的单词
本文件中的关键字“必须”、“必须不”、“要求”、“应当”、“不应当”、“应该”、“不应该”、“建议”、“可能”和“可选”按[RFC2119]解释。但是,为了可读性,这些单词在本规范中不以所有大写字母出现。
考虑到这一点,我相信在7.5.3块级和内联元素中有明确的声明,其中说
通常,内联元素只能包含数据和其他内联元素。
条件“一般”似乎引入了足够的模糊性,说明HTML 4.01确实允许内联元素包含块元素。
当然,CSS2有一个显示属性值inline-block,它似乎适合您所描述的目的。我不确定它是否得到了广泛的支持,但似乎有人预见到了这种行为的需要。
DTD在这里似乎不那么宽容,但DTD的文本遵从规范:
HTML 4.01规范包括额外的
不能在内部表示的语法约束
dtd。
在另一个注释中,您建议通过将块包装在锚中使其激活。我不认为HTML禁止这样做,CSS显然允许这样做。因此,要回答标题中关于它是否正确的问题,我的回答是肯定的。按照标准,这有时是正确的。