【问题标题】:Which is more correct: <h1><a>...</a></h1> OR <a><h1>...</h1></a>哪个更正确: <h1><a>...</a></h1> 或 <a><h1>...</h1></a>
【发布时间】:2011-10-24 19:25:19
【问题描述】:

&lt;h1&gt;&lt;a ...&gt; ... &lt;/a&gt;&lt;/h1&gt;&lt;a ...&gt;&lt;h1&gt; ... &lt;/h1&gt;&lt;/a&gt; 都是有效的 HTML,还是只有一个正确?如果它们都正确,它们的含义是否不同?

【问题讨论】:

    标签: html semantics


    【解决方案1】:

    两个版本都是正确的。它们之间最大的区别在于,对于&lt;h1&gt;&lt;a&gt;..&lt;/a&gt;&lt;/h1&gt;,只有标题中的文本是可点击的。

    如果您将&lt;a&gt; 放在&lt;h1&gt; 周围并且css display 属性为block(默认情况下),则整个块(&lt;h1&gt; 的高度和宽度的 100% &lt;h1&gt; 所在的容器)将是可点击的。

    从历史上看,您不能将块元素放在内联元素中,但 HTML5 不再是这种情况。我认为&lt;h1&gt;&lt;a&gt;..&lt;/a&gt;&lt;/h1&gt; 方法更传统。

    如果您想在标题上放置锚点,比&lt;a id="my-anchor"&gt;&lt;h1&gt;..&lt;/h1&gt;&lt;/a&gt; 更好的方法是使用idname 属性,如下所示:&lt;h1 id="my-anchor"&gt;..&lt;/h1&gt;&lt;h1 name="my-anchor"&gt;..&lt;/h1&gt;

    【讨论】:

    • ..

      听起来更适合 HTML 5,因为它为触摸设备用户提供了更大的点击目标,对吧?
    • 当标题和副标题都链接到相同的内容时,将两者包装在相同的 &lt;a&gt; 中以便它们共享悬停状态在视觉上更具吸引力:jsfiddle.net/jjyLemq2
    【解决方案2】:

    在 HTML 5 之前的这个

    <a><h1>..</h1></a>
    

    不会验证。您可以在 HTML 5 中使用它。 但是,我会使用这个:

    <h1><a>..</a></h1>
    

    除非你需要在

    里面添加超过

    【讨论】:

      【解决方案3】:

      &lt;a&gt;&lt;h1&gt;&lt;/h1&gt;&lt;/a&gt; 不是 W3C 有效的......基本上,你不能把 block elements 放在 inline elements 里面

      【讨论】:

      • 是的.. 但不知何故,我觉得将块元素放在链接中有点草率(个人意见),就像不关闭标签(在 HTML5 中有效).. 但是嘿!.. 也许它会影响搜索引擎优化
      【解决方案4】:

      H1 ​​元素是块级元素,锚点是内联元素。您可以在块级元素中包含内联元素,但反之则不行。当您考虑盒子模型和 HTML 规范时,这是有道理的。

      总之,最好的方法是:

      <h1><a href="#">Link</a></h1>
      

      【讨论】:

      【解决方案5】:

      您要使用超链接&lt;a href="…"&gt;/a:link,还是要在标题中添加锚点?如果你想添加一个锚点,你可以简单地分配一个 id &lt;h1 id="heading"&gt;。然后您可以将其链接为page.htm#heading

      如果您想让标题可点击(链接),请使用&lt;h1&gt;&lt;a&gt;&lt;/a&gt;&lt;/h1&gt;/h1 &gt; a - 先使用块级元素,再使用内联元素

      【讨论】:

        【解决方案6】:

        &lt;h1&gt;&lt;a&gt;..&lt;/a&gt;&lt;/h1&gt;&lt;a&gt;&lt;h1&gt;..&lt;/h1&gt;&lt;/a&gt; 在样式表不影响呈现时的行为总是几乎相同。差不多,但不完全。如果您使用 Tab 键导航或以其他方式关注链接,则在大多数浏览器中,链接周围会出现一个“焦点矩形”。对于&lt;h1&gt;&lt;a&gt;..&lt;/a&gt;&lt;/h1&gt;,此矩形仅围绕链接文本。对于&lt;a&gt;&lt;h1&gt;..&lt;/h1&gt;&lt;/a&gt;,矩形延伸到可用的水平空间,因为标记使a 元素成为渲染中的块元素,默认占据100% 的宽度。

        下面展示了一个焦点 &lt;a href=foo&gt;&lt;h1&gt;link&lt;/h1&gt;&lt;/a&gt; 是如何被 Chrome 渲染的:

        这意味着如果您设置元素的样式,例如通过为链接设置背景颜色,效果以类似的方式有所不同。

        从历史上看,&lt;a&gt;&lt;h1&gt;..&lt;/h1&gt;&lt;/a&gt; 在 HTML 2.0 中被宣布为无效,随后的 HTML 规范也随之而来,但 HTML5 改变了这一点并宣布它为有效。正式定义不影响浏览器,只影响验证器。然而,一些用户代理(可能不是普通浏览器,但例如专门的 HTML 渲染器、数据提取器、转换器等)可能无法正确处理 &lt;a&gt;&lt;h1&gt;..&lt;/h1&gt;&lt;/a&gt;,因为规范中不允许这样做。

        很少有充分的理由将标题或标题中的文本设置为链接。 (这主要是不合逻辑的,并且不利于可用性。)但是在将标题(或标题中的文本)作为链接的潜在目的地时,经常会出现类似的问题,例如&lt;h2&gt;&lt;a name=foo&gt;...&lt;/a&gt;&lt;/h2&gt;&lt;a name=foo&gt;&lt;h2&gt;...&lt;/h2&gt;&lt;/a&gt;。类似的考虑适用于此(两者都有效,可能存在差异,因为后者使 a 元素成为一个块,而在 HTML5 之前,只有前者被正式允许)。但此外,这两种方式都已过时,现在建议直接在标题元素上使用id 属性:&lt;h2 id=foo&gt;...&lt;/h2&gt;

        【讨论】:

        • "There is seldom a good reason to make a heading or text in a heading a link" -> 我必须不同意那个。实际上有很多充分的理由将标题设置为链接。给出的示例:博客文章列表,其中每个标题也是一个链接。或者查看 SO 本身:首页上的所有问题都是h3 元素,以及一个链接。无论如何,很好的解释;)
        • @giorgio,例如您提到的 SO 链接不利于可用性:制作指向页面本身的链接毫无意义且令人困惑。
        • 嗯,我的意思是主页上的 SO 链接,它将用户引导到另一个页面,特别是问题页面。是的,问题页面标题中的链接(并非完全)无用,但这并不一定对可用性不利。主要原因是搜索引擎优化(在问题页面上)。
        • 那个 loopback h1 SEO 对可用性不利。为什么页面标题(h1)会让屏幕阅读器宣布指向其他地方的链接?这很令人困惑。出于同样的原因,在子标题中包含链接会让人感到困惑,因为某些内容应该是页面中某个部分的标题,同时也是另一个页面的标题。
        【解决方案7】:

        此外,还有风格层次的差异。如果您将其设置为&lt;h1&gt;&lt;a href="#"&gt;Heading here&lt;/a&gt;&lt;/h1&gt;,则锚的样式将覆盖 h1 元素的样式。示例:

        a {color:red;font-size:30px;line-height:30px;}
        

        将推翻

        h1 {color:blue;font-size:40px;line-height:40px;}
        

        【讨论】:

        • -1 因为这根本没有解决问题(哪个更正确)。
        【解决方案8】:

        两者都是正确的。它们取决于您想要的锚标记的大小以及您希望网站的布局方式。 你可以做&lt;h1&gt;&lt;a href="example.com"&gt;Home Page&lt;/a&gt;&lt;/h1&gt;,在这种情况下它会返回:

        主页

        但是有一个锚。
        或者您可以执行&lt;a href="example.com"&gt;&lt;h1&gt;Home Page&lt;/h1&gt;&lt;/a&gt;,它会返回一个 H1 超链接,而不是仅仅将一个锚点指向 H1,如下所示:

        首页

        但是,大多数情况下,您不能在 H1 中添加链接,因为它只会将其呈现为 h1 上的锚点,而不是添加超链接。但是,我认为我的说法是正确的,您可以在不同的浏览器上看到此行为的差异。

        但如果我错了,请纠正我。 :)

        【讨论】:

          猜你喜欢
          • 2011-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-11
          • 2014-08-05
          • 1970-01-01
          • 2012-09-30
          相关资源
          最近更新 更多