Answers:
根据HTML 5规范5.9.8导航到片段标识符:
对于HTML文档(和text / html MIME类型),必须遵循以下处理模型来确定文档的指示部分是什么。
- 解析URL,并让fragid作为URL的<fragment>组件。
- 如果fragid是空字符串,则文档的指示部分是文档的顶部。
- 如果DOM中有一个元素的ID刚好等于fragid,则树形顺序中的第一个此类元素是文档的指示部分;在此处停止算法。
- 如果有一个是一个在具有名称属性,其值正好等于fragid的DOM元素,然后在树顺序中的第一元件,例如是在文档的所指示的部分; 在此处停止算法。
- 否则,文档中没有指示的部分。
因此,它将寻找id="foo"
,然后跟随name="foo"
编辑:正如@hsivonen所指出的那样,在HTML5中,a
元素没有名称属性。但是,以上规则仍适用于其他命名元素。
<h1 id="foo">Foo Title</h1>
甚至可以在IE6中使用,并且是HTML 4.01规范的
name="foo"
和的HTML5文档中id="foo"
(与页面中的顺序无关),Chrome和Firefox将跳至id
,而IE(在11中测试)和Edge将跳至name
您不应使用<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中不起作用的功能。
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
我必须说,如果您要链接到页面中的该区域...,例如page.html#foo和Foo Title不是您应该使用的链接:
<h1 id="foo">Foo Title</h1>
如果改用<a>
参考文献,您的标题将受到<a>
站点内特定CSS的影响。这只是额外的标记,您不需要它。我强烈建议在标题上放置一个ID,不仅ID格式更好,而且还可以使用Javascript或CSS寻址该对象。
Wikipedia大量使用此功能,如下所示:
<a href="#History">[...]</a>
<span class="mw-headline" id="History">History</span>
而且Wikipedia正在为所有人服务,因此我坚持使用这种形式会感到放心。
同样不要忘记,您不仅可以将其与范围一起使用,而且可以与div甚至表单元格一起使用,然后您可以访问元素上的:target伪类。只是要注意不要更改宽度,例如粗体文本会导致内容移动,这很令人不安。
命名锚点-我的投票是避免:
a {color:red}
步,共4 步:如果您设置样式,它将同时为<a href>链接和<a name>片段着色。您可以使用伪类a:link {color:red]}
或属性选择器解决此问题a:not([href]) {color:red;}
<a name="heading1"></a> ... document.html#heading1
而无需设置ID 非常有用,因为该ID可能与页面上的另一个ID冲突。他们没有name
在HTML5中放置属性,这真是遗憾。
面向JavaScript用户:所有ID都成为window下的全局变量。
<h1 id="foo">Foo Title</h1>
刚刚创建了JS全局:
window.foo
的值window.foo
将是HTMLElement
的h1
。
除非您可以保证id
属性中使用的所有值都是安全的,否则您最好遵循name
:
<h1 name="foo">Foo Title</h1>
window
。例如,<div id="open"></div>
不会覆盖函数window.open
。
没有语义上的差异。标准的趋势是朝着使用id
而非朝name
。但是,name
在某些情况下,有些差异可能会导致人们更喜欢。HTML 4.01规范提供了以下提示:
使用id
还是name
?作者在决定使用锚名称id
还是name
使用锚名称时应考虑以下问题:
id
在iOS 5的Safari中使用锚来工作,因此不仅仅是在09年已经“非常古老”的浏览器。我必须添加name
s才能使我的网站在iPad上正常工作。目前,该问题可能已经修复,我没有任何要检查的iOS 6设备。
id
锚似乎可以通用。如果此简单示例在您的手机上不起作用,我将检查设备的辅助功能设置。(@deathApril Wikipedia移动站点具有有效地导致URL片段被忽略的Javascript。)
ID方法在较旧的浏览器上将不起作用,锚点名称方法将在较新的HTML版本中弃用...我将使用id。
只是对标记的观察以前的HTML版本中的标记表单提供了一个锚点。使用id属性的HTML5中的标记表单虽然大体上是等同的,但需要一个元素来标识,通常期望其中的几乎所有元素都包含内容。
例如,可以使用空的span或div,但是这种用法看上去和嗅觉会退化。
一种想法是为此目的使用wbr元素。wbr的内容模型为空,仅声明可以换行;这仍然是标记标签的一点点免费使用,但远少于免费的文档划分或空白文本范围。
在html 5中,该id=""
属性定义元素的唯一标识符,这也是片段链接的锚点。在以前的html标准中,元素的name=""
属性<a>
定义了片段链接的锚点。我建议类似:<a name="foo" id="foo"></a><h1>Foo Title</h1>
因为支持id=""
属性的有些参差不齐(即使所有主流浏览器的最新版本都属性,但发布的时间也不得超过几年[并且最好不要破坏某些内容。如果没有充分的理由])。它是兼容的,并且不会对link'd元素中的内容进行任何样式设置,因为</a>仍在元素外部,但在所有当前标准中仍然有效。
确保元素的name=""
和id=""
属性<a>
相同。
name
是必需标记上的属性;将属性放在hN
或span
不起作用。
如何在旧浏览器中使用name属性,在新浏览器中使用id属性。这两个选项都将被使用,默认情况下将实施后备方法!
根据定义,整个“命名锚点”概念使用name属性。您应该坚持使用名称,但是ID属性在某些JavaScript情况下可能很方便。
正如评论中一样,您总是可以同时使用两者来对冲您的赌注。
http://example.com#foo
(因此不带/在#之前)