我应该使用“名称”或“ id”制作HTML锚吗?


782

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

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

要么

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

它们都起作用,但是它们是相等的还是语义上的差异?


2
链接实际上应该是http://example.com#foo(因此不带/在#之前)
Dana

71
实际上,它http://example.com#foohttp://example.com/#fooURI中的RFC之一所定义的是等效的。
奥利弗

Answers:


616

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

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

  1. 解析URL,并让fragid作为URL的<fragment>组件。
  2. 如果fragid是空字符串,则文档的指示部分是文档的顶部。
  3. 如果DOM中有一个元素的ID刚好等于fragid,则树形顺序中的第一个此类元素是文档的指示部分;在此处停止算法。
  4. 如果有一个是一个在具有名称属性,其值正好等于fragid的DOM元素,然后在树顺序中的第一元件,例如是在文档的所指示的部分; 在此处停止算法。
  5. 否则,文档中没有指示的部分。

因此,它将寻找id="foo",然后跟随name="foo"

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


76
该算法与有效性之间没有隐含的关系。<a name>在当前起草的HTML5中无效。
hsivonen

13
实际上,它不适用于其他“命名元素”。至于名称属性,它仅适用于<a name>。但是,作者不能使用该属性。用户代理对于较旧的HTML页面仅需尊重它。
安妮(Anne)2009年

19
@RafaelSoares <h1 id="foo">Foo Title</h1>甚至可以在IE6中使用,并且是HTML 4.01规范的
2013年

4
它不会寻找name =“ foo”,而是寻找<a name="foo">。看到链接
Daniel Herzog 2013年

3
在带有name="foo"和的HTML5文档中id="foo"(与页面中的顺序无关),Chrome和Firefox将跳至id,而IE(在11中测试)和Edge将跳至name
Alvaro Montoro

182

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

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


6
+1讨论浏览器支持。NS4是唯一不支持url#id => element.id的人吗?
Hashbrown

14
@Hashbrown找不到答案,所以我做了一些测试。我发现,即使是非常老的浏览器在URL片段和CSS 选择器的兼容性方面id也像name锚一样对待s 。经过测试:Chrome 6,Firefox 1.5,IE6,Opera 8.02,Safari 3.1.2,Netscape 7.2,Lynx 2.24和移动浏览器:Android 2.2,Chrome 26,Dolphin 9.3,Firefox 19,IE10,Safari 4和Opera Mini 5.1。:target
Stephen M. Harris

1
@smhmic,我找到了一个。一次性网络浏览器可以识别通过<a name="foo"/>定义的锚,但是不能识别通过<sometag id =“ foo”>定义的锚,OB1的最后更新时间是8年前。它的作者夸耀说,它“可能是世界上最小,最快的,完全支持HTML 3.2的Web浏览器。” 它声称通过XP支持Win95,但在64位Win7上也可以正常工作。那么,为什么会有这样的恐龙呢?当然,为了进行测试,请确保我的网站在使用真正的老式浏览器时不会损坏得太厉害。另外,我还在闪存驱动器上携带OB1。它很小,设备齐全,不受感染。
戴夫·伯顿

26
在2016年阅读此书就像.Netscape 4?
ADTC

1
使用`<a name="something" id="something> </A> [ELEMENT滚动到]可能是最好的,因为它是兼容的,与它没有风格的元素无论是滚动到。
JustinCB

52

我必须说,如果您要链接到页面中的该区域...,例如page.html#foo和Foo Title不是您应该使用的链接:

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

如果改用<a>参考文献,您的标题将受到<a>站点内特定CSS的影响。这只是额外的标记,您不需要它。我强烈建议在标题上放置一个ID,不仅ID格式更好,而且还可以使用Javascript或CSS寻址该对象。


不仅如此,我还一直在解决一个奇怪的显示错误:IE中没有显示任何内容。缺少任何关于攻击点的想法,我把它扔到了一个验证器上,该验证器标记了<a name="foo">条目,因此我更改了它们-现在显示:没有一个可以正常工作。
罗兰·佩希特尔

这绰绰有余,仅此效果就不需要锚标签。
华莱士·西德瑞(WallaceSidhrée)2015年

27

Wikipedia大量使用此功能,如下所示:

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

而且Wikipedia正在为所有人服务,因此我坚持使用这种形式会感到放心。

同样不要忘记,您不仅可以将其与范围一起使用,而且可以与div甚至表单元格一起使用,然后您可以访问元素上的:target伪类。只是要注意不要更改宽度,例如粗体文本会导致内容移动,这很令人不安。

命名锚点-我的投票是避免:

  • “名称和ID在相同的名称空间中...”-具有相同名称空间的两个属性简直太疯狂了。让我们说已经弃用了。
  • “锚定没有href属性的元素”-再一次,元素的性质(是否具有超链接)是通过具有属性来定义的!双重疯狂。常识说完全避免它。
  • 如果您曾经设置过没有伪类的锚样式,则样式将应用于每个样式。在CSS3中,可以使用属性选择器(或每个伪类使用相同的样式)解决此问题,但这仍然是一种解决方法。通常不会出现这种情况,因为您为每个伪类选择了颜色,并且默认情况下显示的下划线仅有意义,因此将其删除,使其与其他文本相同。但是您曾经决定使链接变为粗体,这会引起麻烦。
  • Netscape 4可能不支持id功能,但是未知属性仍然不会造成任何麻烦。这就是我所说的兼容性。

1
建议编辑第3 a {color:red}步,共4 步:如果您设置样式,它将同时为<a href>链接和<a name>片段着色。您可以使用伪类a:link {color:red]}或属性选择器解决此问题a:not([href]) {color:red;}
Bob Stein

您是对的,但对我来说,项目符号3恰恰说明了这一点。也许是我的英语,虽然...
佐尔坦莫尔瓦伊

最终,我明白了:“如果您对锚定器进行样式设置而没有伪类,则样式将应用于每个样式。” 模棱两可:您可能会想到“每个伪类”。对。但是我在考虑使用锚的“每种情况”,这意味着命名和href-ed。澄清。:)您的评论后无需编辑,但如果您坚持的话,我可以。但也仍然不容易出现颜色发生,因为你通常打算让他们有所不同,但还是同样的情况下使用字体重...
佐尔坦莫尔瓦伊

很高兴阅读您的评论@ZoltánMorvai。“双重疯狂”和“ netscape 4” doubleplusgood。
兰迪L

1
具有相同名称空间的两个属性很疯狂-并非如此。在处理用户生成的内容时,能够将某些内容指定为片段链接<a name="heading1"></a> ... document.html#heading1而无需设置ID 非常有用,因为该ID可能与页面上的另一个ID冲突。他们没有name在HTML5中放置属性,这真是遗憾。
Jez

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

是应该使用的。除非需要链接,否则不要使用锚点。


蒂姆·奈特(Tim Knight)的答案与之前的答案相同,发布时间与此相同。-1
吕克,

13

面向JavaScript用户:所有ID都成为window下的全局变量

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

刚刚创建了JS全局:

window.foo

的值window.foo将是HTMLElementh1

除非您可以保证id属性中使用的所有值都是安全的,否则您最好遵循name

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

12
好消息是您不能覆盖中定义的功能window。例如,<div id="open"></div>不会覆盖函数window.open
Flimm 2015年

8

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

使用id还是name?作者在决定使用锚名称id还是name使用锚名称时应考虑以下问题:

  • id属性不仅可以用作锚名称(例如,样式表选择器,处理标识符等)。
  • 一些较旧的用户代理不支持使用id属性创建的锚。
  • name属性允许使用更丰富的锚点名称(带有实体)。

14
明确地说,当他们说“较旧的用户代理”时,它们的意思是真正的旧用户代理。我不会担心的。
伊莱(Eli)2009年

1
HTML5也允许“丰富” ID。是否有人拥有无法处理ID锚定片段的市场占有率大于0.1%的浏览器版本号?–还是恐龙Netscape 4.7实际上是使用最广泛的恐龙?
罗伯特·西默

7
FWIW,我无法id在iOS 5的Safari中使用锚来工作,因此不仅仅是在09年已经“非常古老”的浏览器。我必须添加names才能使我的网站在iPad上正常工作。目前,该问题可能已经修复,我没有任何要检查的iOS 6设备。
Daniel Saner 2012年

@DanielSaner真的吗?因此en.wikipedia.org/wiki/IPad#Applications在您的iPad上无法使用?
2013年

1
@DanielSaner我使用模拟器测试了移动Safari 5.02和5.1,以及Android浏览器2.2和2.3,这些id锚似乎可以通用。如果此简单示例在您的手机上不起作用,我将检查设备的辅助功能设置。(@deathApril Wikipedia移动站点具有有效地导致URL片段被忽略的Javascript。)
Stephen M. Harris

8

ID方法在较旧的浏览器上将不起作用,锚点名称方法将在较新的HTML版本中弃用...我将使用id。


2
您有这些主张的来历吗?不要误会我的意思;我只是一般感兴趣。
亨里克·保罗

11
这没有说明“在旧版浏览器上将无法使用”。–除了Netscape 4,这些浏览器是什么?
罗伯特·西默

3
我试过在div上使用id,即使在IE 7中也可以使用。虽然无法在IE 6中进行测试..但是现在谁在使用IE 6 ...
Gilly 2013年

@deathApril在某些情况下(取决于HASLAYOUT)是越野车。
2013年

@RobertSiemer几乎可以通用-在此答案下查看我的评论。
Stephen M. Harris

3

我有一个网页,其中包含许多垂直堆叠的div容器,其格式相同,但序列号不同。我想在每个div的顶部隐藏锚点的名称,因此最经济的解决方案是将锚点作为id包含在div标签的开头,例如,

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

2

只是对标记的观察以前的HTML版本中的标记表单提供了一个锚点。使用id属性的HTML5中的标记表单虽然大体上是等同的,但需要一个元素来标识,通常期望其中的几乎所有元素都包含内容。

例如,可以使用空的span或div,但是这种用法看上去和嗅觉会退化。

一种想法是为此目的使用wbr元素。wbr的内容模型为空,仅声明可以换行;这仍然是标记标签的一点点免费使用,但远少于免费的文档划分或空白文本范围。


那是个很好的观点。有关更多信息wbrw3.org/TR/html-markup/wbr.html使用<wbr id="foo" />而不是<a name="foo"></a>
Luke

1

第二个示例将唯一的ID分配给相关元素。然后可以使用DHTML操纵或访问此元素。

另一方面,第一个在文档中设置一个类似于书签的命名位置。附加到“锚”上,这很有意义。


1

在html 5中,该id=""属性定义元素的唯一标识符,这也是片段链接的锚点。在以前的html标准中,元素的name=""属性<a>定义了片段链接的锚点。我建议类似:
<a name="foo" id="foo"></a><h1>Foo Title</h1>
因为支持id=""属性的有些参差不齐(即使所有主流浏览器的最新版本都属性,但发布的时间也不得超过几年[并且最好不要破坏某些内容。如果没有充分的理由])。它是兼容的,并且不会对link'd元素中的内容进行任何样式设置,因为</a>仍在元素外部,但在所有当前标准中仍然有效。

确保元素的name=""id=""属性<a>相同。


2
并非所有使用HTML的东西都是浏览器。我正在使用Java库,该库在使用HTML的窗口中显示信息。这是唯一有效的方法。这name是必需标记上的属性;将属性放在hNspan不起作用。
火星


-3

根据定义,整个“命名锚点”概念使用name属性。您应该坚持使用名称,但是ID属性在某些JavaScript情况下可能很方便。

正如评论中一样,您总是可以同时使用两者来对冲您的赌注。


两者同时使用时,id:s和名称是否全局唯一?例如,我可以使用与ID和名称相同的字符串吗?
亨里克·保罗

可以,但是有些人认为这是不好的做法。
亚历克斯·福特

9
根据HTML规范,如果两者都存在,则名称和ID应该相同。它还说名称和ID在同一名称空间中。HTML验证程序服务不会检查这些内容,我怀疑浏览器是否在乎,但是无论如何,它们似乎是很好的指南。
erickson

3
现实重新定义!<一个名字...从一开始就生病了,CSS链接样式使它更加恶心。
罗伯特·西默
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.