我听说在内联元素中放入块元素是一种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元素的解释
这种方式。
有没有人对这个问题有进一步的建议?
2023年1月更新:最新HTML5版本
Nothing is wrong with placing a div inside a tag. In fact, you can place just about anything inside a tag as long as they are categorized as transparent, except that no descendant may be interactive content (eg: buttons or inputs) or an a element, and no descendant may have a specified tabindex attribute.
Please refer to these documentations:
https://www.w3.org/TR/2011/WD-html5-20110525/text-level-semantics.html#the-a-element
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#properties.
If you inspect Angular Material official website, you can tell that they are indeed using div inside a element.
这是我从他们的网站上截取的一个例子:
<a href="/components/badge">
<div class="mat-list-item-content">
<div mat-ripple="" class="mat-ripple mat-list-item-ripple"></div>
<div class="mat-list-text"></div>
</div>
</a>
任何方法都有用……直到你把它们嵌在一起。
你可以把表格、div、鸟和蜜蜂塞进去,浏览器会耐心地配合你。但是一旦你把另一个<a>标签放在里面,它就会把它们分开,把里面的标签放在外面的标签关闭之后。这值得一试,即使是在F12控制台,当你的浏览器不喜欢某些东西时,你会惊讶地发现它是多么严格。
所以没有这样的事情:
<a href="#1">
<a href="#2"> Now what </a>
</a>
相反,它将变成:
<a href="#1"></a>
<a href="#2"> Now what </a>
同样的事情发生在<p>和其他一些;事实上,有一篇关于这个的Stacko文章-我可以嵌套这些标签吗?-唯一的答案有关键,在“HTML规范指示”部分寻找项目符号列表。最挑剔的显然是a和p,如h1..h6。(现在让我们诚实地说:你是否曾经专门使用p标签,因为它给了你别人没有的东西?……这么想的。我就把它扔了。)
TL, DR,你不能把a放在a里面。
在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语法上是正确的,但我不会进一步讨论这个问题,因为这不是问题的主题。