将 li 包裹在 a 中是否合法?

Is it legal to wrap li in a?

我有点难以理解这里的文档:http://w3c.github.io/html-reference/terminology.html#transparent which is linked to from here: http://w3c.github.io/html-reference/a.html#a-changes

据我了解,下面的代码应该没问题:

<!doctype html>
<head><title>Yo!</title>
<body>
    <ul>
        <a>
            <li>My list item is wrapped in an anchor.
        </a>
    </ul>

但是当我将这段代码粘贴到不同的验证器中时,他们都同意不能像这样将 li 元素包装在 a 元素中。我是不是读错了文档,还是我发现的所有验证器都过时了?

合法 是的,没有人会因此将您送进监狱。 - 合法吗? 没有!

W3.org: li – list item

Permitted parent elements

ul, ol, menu

如评论中所述,某些浏览器会显示无效 HTML,但验证器会始终警告您无效代码。

首先,您没有使用 HTML 规范。 http://w3c.github.io/html-reference/ 只是一个“non-normative 参考”,并且已经过时(这是 2012 年的草稿)。

HTML5 规范(目前是最新的 HTML W3C 推荐标准)是 https://www.w3.org/TR/2014/REC-html5-20141028/. HTML 5.1 is currently a Candidate Recommendation(可能很快就会成为 W3C 推荐标准)。

以下链接指向 HTML5 W3C 推荐标准。


a element is transparent 的内容模型。内容模型解释了 a 元素可能包含的其他元素。在 transparent 的情况下,这意味着将使用 parent 元素的内容模型。但是内容模型没有说明 a 元素可能出现的位置。¹

"contexts in which this element can be used"² 列出元素可能出现的位置。在 a 的情况下,它是:

Where phrasing content is expected.

因此您可以在任何允许使用文本、abbrspan 等的地方使用 a。请注意,此处未列出 li 元素(li 不是措辞内容)。

查看 ul element 的内容模型:它只允许 li 和 "script-supporting" 元素(而不是 a)。


¹ 当然,除了嵌套在 a 元素中的 a 元素。但这是明确不允许的:"there must be no interactive content descendant".

² 此清单是 non-normative(仅为方便起见而提供)。您可以通过检查每个可能的 parent 内容模型来查看规范上下文。