具有“名称”或“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),必须遵循以下处理模型来确定文档的指示部分是什么。
- parsingURL,让fragid成为URL的<fragment>组件。
- 如果fragid是空string,则文档的指示部分是文档的顶部。
- 如果DOM中有一个元素的ID与fragid完全相同,那么树中第一个这样的元素就是文档的指示部分; 在这里停止algorithm。
- 如果在DOM中有一个名称属性的值等于fragid的元素,那么树中第一个这样的元素就是文档的指定部分; 在这里停止algorithm。
- 否则,文件没有标明的部分。
所以,它会查找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规范提供了以下提示 :
使用id
或name
? 在决定是否使用id
或name
作为锚点名称时,作者应考虑以下问题:
- id属性可以不仅仅是一个锚点名称(例如,样式表select器,处理标识符等)。
- 一些较旧的用户代理不支持使用id属性创build的锚点。
- 名称属性允许更加丰富的锚名称(与实体)。
为JavaScript用户打个招呼: 所有ID在窗口下成为全局variables 。
<h1 id="foo">Foo Title</h1>
刚刚创build了JS全球:
window.foo
window.foo
的值将是h1
的HTMLElement
。
除非你可以保证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的情况下得心应手。
正如在评论中,你总是可以用这两个来对冲你的赌注。