当想要使用 "http://example.com/#foo
" 方法引用网页的某个部分时,应该使用什么?
<h1><a name="foo"/>Foo Title</h1>
或者<h1 id="foo">Foo Title</h1>
它们都可以使用,但是它们是否完全相等,还是有语义上的区别?
当想要使用 "http://example.com/#foo
" 方法引用网页的某个部分时,应该使用什么?
<h1><a name="foo"/>Foo Title</h1>
或者<h1 id="foo">Foo Title</h1>
它们都可以使用,但是它们是否完全相等,还是有语义上的区别?
因此,它会查找对于HTML文档(以及text/html MIME类型),必须遵循以下处理模型以确定文档中指定的部分。
- 解析URL,并将fragid设置为URL的<fragment>组件。
- 如果fragid为空字符串,则文档的指定部分为文档的顶部。
- 如果DOM中存在一个ID完全等于fragid的元素,则树中第一个这样的元素是文档的指定部分;停止算法处理。
- 如果DOM中存在一个带有名称属性且其值完全等于fragid的a元素,则树中第一个这样的元素是文档的指定部分;停止算法处理。
- 否则,文档中没有指定的部分。
id="foo"
,然后会继续查找name="foo"
编辑:正如@hsivonen所指出的,在HTML5中,a
元素没有名称属性。然而,上述规则仍适用于其他命名的元素。
foo
的name
属性和一个id
属性(无论它们在页面中的顺序如何),Chrome和Firefox会跳转到id
,但是IE(测试版本为11)和Edge会跳转到name
。 - Alvaro Montoro在任何一种以text/html
格式服务的HTML中,不应使用 <h1><a name="foo"/>Foo Title</h1>
, 因为XML空元素语法在text/html
中不受支持。然而,在HTML4中使用 <h1><a name="foo">Foo Title</a></h1>
是可以的。但是在当前起草的HTML5中无效。
<h1 id="foo">Foo Title</h1>
在HTML4和HTML5中都可以使用。这在Netscape 4中不起作用,但您可能会使用其他数十个在Netscape 4中不起作用的功能。
:target
选择器的兼容性方面也会像name
锚点一样对待id
。测试过的浏览器包括: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。 - Stephen M. Harris<a name="something" id="something></a>[ELEMENT TO SCROLL TO]
可能是最好的选择,因为它兼容性好,并且不会对要滚动到的元素进行样式设置。 - JustinCB如果你要链接到页面上的某个区域,例如page.html#foo,而“Foo标题”不是一个链接,那么你不应该使用它:
<h1 id="foo">Foo Title</h1>
如果你把标题用<a>
包裹起来,你的标题将受到网站中<a>
特定CSS的影响。这只是额外的标记,你不需要它。我强烈建议在标题上放置一个id,这不仅格式更好,而且可以让你在Javascript或CSS中针对该对象进行操作。维基百科大量使用这个功能,如下所示:
<a href="#History">[...]</a>
<span class="mw-headline" id="History">History</span>
维基百科为每个人服务,因此我会感到安全,坚持使用这种形式。
还要记住,您不仅可以使用,还可以在
锚点名称 - 我建议避免使用:
a {color:red}
样式,它将同时应用于<a href>链接和<a name>片段。您可以通过伪类a:link {color:red]}
或属性选择器a:not([href]) {color:red;}
来解决这个问题。 - Bob Stein<a name="heading1"></a> ... document.html#heading1
而无需设置 ID 是非常有用的,因为 ID 可能会与页面上的另一个 ID 冲突。HTML5 没有放置 name
属性真是遗憾。 - Jez提醒JavaScript用户:在window
下 所有ID都将成为全局变量。
<h1 id="foo">Foo Title</h1>
刚刚创建了JS全局变量:
window.foo
window.foo
的值将会是 h1
元素的 HTMLElement
。
除非你能保证在 id
属性中使用的所有值都是安全的,否则你可能更喜欢使用 name
。
<h1 name="foo">Foo Title</h1>
window
中定义的函数。例如,<div id="open"></div>
不会覆盖函数window.open
。 - Flimm<h1 id="foo">Foo Title</h1>
应该使用标记, 除非您需要一个链接,否则不要使用锚点。
ID方法在旧版浏览器上无法使用,锚点名称方法将在新版HTML版本中被弃用...我会选择使用id。
id
而不是name
。然而,在某些情况下,存在可能使人们更喜欢使用name
的差异。HTML 4.01规范提供了以下提示:id
还是name
?作者在决定为锚点名称使用id
还是name
时应考虑以下问题:
id
属性可以充当不仅仅是锚点名称(例如样式表选择器、处理标识符等)。id
属性创建的锚点。name
属性允许使用实体创建更丰富的锚点名称。id
锚点在Gingerbread 2.3.7附带的标准浏览器上不起作用,但在最新版本的Opera和Firefox中可以。 - Daniel Sanerid
锚点似乎在所有设备上都能正常工作。如果这个简单的例子在你的移动设备上无法正常工作,我建议检查设备的可访问性设置。(@deathApril Wikipedia移动站点使用的Javascript会有效地忽略URL片段。) - Stephen M. Harrisid=""
属性定义了一个元素的唯一标识符,也是片段链接的锚点。在先前的HTML标准中,<a>
元素的name=""
属性定义了片段链接的锚点。我建议使用以下格式:<a name="foo" id="foo"></a><h1>Foo Title</h1>
id=""
属性的支持有些不稳定(尽管所有主要浏览器的最新版本都支持它,但不支持的版本不超过几年[如果没有充分的理由最好不要破坏它])。这种格式兼容性好,并且不会为链接元素中的内容设置样式,因为关闭的</a>仍然在元素外部,但在所有当前标准中仍然有效。
请确保<a>
元素的name=""
和id=""
属性相同。
我有一个网页,由许多垂直堆叠的 div 容器组成,这些容器在格式上完全相同,只是序列号不同。我想隐藏每个 div 顶部的名称锚点,因此最经济的解决方案是将锚点作为 id 包含在开放的 div 标签中,即
<div id="[serial number]" class="topic_wrapper">
http://example.com#foo
(所以在 # 前面没有 /)。 - Danahttp://example.com#foo
和http://example.com/#foo
是等效的。 - Oliver<h1 id="foo"></h1>
可以在 Javascript 中从window.foo
引用,这可能不是您所期望的,请参见 https://dev59.com/BXRB5IYBdhLWcg3w3K8J#28568419。 - Flimm