具有“名称”或“ID”的HTML锚点?

当有人想用“ http://example.com/#foo ”方法引用网页的某个部分时,应该使用

 <h1><a name="foo"/>Foo Title</h1> 

要么

 <h1 id="foo">Foo Title</h1> 

他们都工作,但他们是平等的,还是他们有语义上的差异?

根据HTML 5规范, 5.9.8导航到片段标识符 :

对于HTML文档(以及text / html MIMEtypes),必须遵循以下处理模型来确定文档的指示部分是什么。

  1. parsingURL,让fragid成为URL的<fragment>组件。
  2. 如果fragid是空string,则文档的指示部分是文档的顶部。
  3. 如果DOM中有一个元素的ID与fragid完全相同,那么树中第一个这样的元素就是文档的指示部分; 在这里停止algorithm。
  4. 如果在DOM中有一个名称属性的值等于fragid的元素,那么树中第一个这样的元素就是文档的指定部分; 在这里停止algorithm。
  5. 否则,文件没有标明的部分。

所以,它会查找id="foo" ,然后将按照name="foo"

编辑:正如@hsivonen指出的,在HTML5中, a元素没有名称属性。 但是,上述规则仍然适用于其他指定元素。

你不应该在用作text/html任何HTML格式中使用<h1><a name="foo"/>Foo Title</h1> ,因为text/html不支持XML空元素语法。 但是, <h1><a name="foo">Foo Title</a></h1>在HTML4中可以。 目前草拟的HTML5无效。

<h1 id="foo">Foo Title</h1>在HTML4和HTML5中都可以。 这在Netscape 4中不起作用,但是您可能会使用其他一些在Netscape 4中不起作用的function。

我不得不说,如果你要链接到页面中的该区域…如page.html#富和Foo标题不是你应该使用的链接:

 <h1 id="foo">Foo Title</h1> 

如果您将<a>引用放在它的附近,则标题将受到您网站中的<a>特定CSS的影响。 这只是额外的标记,你不应该需要它。 强烈build议在标题上放置一个id,不仅更好地形成,而且可以让你用Javascript或CSS来处理这个对象。

 <h1 id="foo">Foo Title</h1> 

是应该使用的。 除非你想要一个链接,否则不要使用锚点。

维基百科大量使用这个function:

 <a href="#History">[...]</a> <span class="mw-headline" id="History">History</span> 

维基百科正在为每个人工作,所以我会觉得安全的坚持这种forms。

另外不要忘记,你可以使用这不仅与跨度,但与div甚至表格单元格,然后你有权访问元素:目标伪类。 只要注意不要改变宽度,就像用粗体文本一样,导致移动内容,这是令人不安的。

命名的主播 – 我的投票是要避免:

  • “名称和id在同一个命名空间中…” – 具有相同命名空间的两个属性只是疯狂的。 我们只是说已经弃用。
  • “锚点没有href属性的元素” – 再一次,一个元素的性质(超链接或没有)被定义为一个属性?! 双重疯狂。 常识说完全避免它。
  • 如果你在没有伪类的情况下使用锚点,那么样式适用于每个types。 在CSS3中,你可以使用属性select器(或每个伪类的相同样式)来解决这个问题,但仍然是一个解决方法。 这通常不会出现,因为您select每个伪类的颜色,并且下划线是默认存在的,这只是有意义的删除,这使得它与其他文本相同。 但是你决定把你的链接放大,这会造成麻烦。
  • Netscape 4可能不支持idfunction,但仍然是一个未知的属性不会造成任何麻烦。 这就是我所说的兼容性。

ID方法在旧版浏览器上不起作用,锚名称方法将在新的HTML版本中被弃用…我会去与ID。

没有语义上的差异; 标准的趋势是使用id而不是name 。 然而,在某些情况下,可能会导致人们更喜欢name 。 HTML 4.01规范提供了以下提示 :

使用idname ? 在决定是否使用idname作为锚点名称时,作者应考虑以下问题:

  • id属性可以不仅仅是一个锚点名称(例如,样式表select器,处理标识符等)。
  • 一些较旧的用户代理不支持使用id属性创build的锚点。
  • 名称属性允许更加丰富的锚名称(与实体)。

为JavaScript用户打个招呼: 所有ID在窗口下成为全局variables

 <h1 id="foo">Foo Title</h1> 

刚刚创build了JS全球:

 window.foo 

window.foo的值将是h1HTMLElement

除非你可以保证id属性中使用的所有值都是安全的,否则你可能更喜欢坚持name

 <h1 name="foo">Foo Title</h1> 

我有一个由多个垂直堆叠的div容器组成的网页,格式相同,只有序号不同。 我想隐藏每个div顶部的名称锚,所以最经济的解决scheme竟然是在开始的div标签中包含锚作为id,也就是说,

 <div id="[serial number]" class="topic_wrapper"> 

只是关于标记的观察HTML的以前版本中的标记forms提供了一个定位点。 HTML5中使用id属性的标记forms虽然大部分是等价的,但需要一个元素来标识,几乎所有元素通常都包含内容。

例如,可以使用一个空的跨度或div,但是这个用法看起来和味道都是退化的。

一个想法是为了这个目的使用wbr元素。 wbr有一个空的内容模型,并简单地声明换行符是可能的; 这仍然是对标记标记的稍微不必要的使用,但是比无偿的文档分割或者空的文本跨度要less得多。

第二个示例为正在讨论的元素分配一个唯一的ID。 然后可以使用DHTML操作或访问此元素。

另一方面,第一个在文档中设置一个命名的位置,类似于书签。 附加到“锚”,这是非常有道理的。

如何使用旧的浏览器的名称属性和ID属性到新的浏览器。 这两个选项将被使用,并且回退方法将被默认实现!

在html 5中, id=""属性定义了一个元素的唯一标识符,这也是一个片段链接的锚点。 在以前的html标准中, <a>元素的name=""属性定义了一个片段链接的锚点。 我推荐如下的东西:
<a name="foo" id="foo"></a><h1>Foo Title</h1>
由于对id=""属性的支持有点多余(尽pipe所有主stream浏览器的最新版本都支持它,但是不会超过几年的版本[最好不要破坏if没有一个好的理由])。
确保<a>元素的name=""id=""属性是相同的。

根据定义,整个“命名锚”概念使用名称属性。 你应该坚持使用名称,但ID属性可能是一些JavaScript的情况下得心应手。

正如在评论中,你总是可以用这两个来对冲你的赌注。