当想要使用“ http://example.com/#foo ”方法引用网页的某个部分时,应该使用
http://example.com/#foo
<h1><a name="foo"/>Foo Title</h1>
要么
<h1 id="foo">Foo Title</h1>
他们都工作,但他们是平等的,还是他们有语义差异?
根据HTML 5规范,5.9.8 Navigating to a fragment identifier:
对于HTML文档(以及text / html MIME类型),必须遵循以下处理模型以确定文档的指示部分 . 解析URL,并将fragid作为URL的<fragment>组件 . 如果fragid是空字符串,则文档的指示部分是文档的顶部 . 如果DOM中的元素具有完全等于fragid的ID,则树顺序中的第一个这样的元素是文档的指示部分;在这里停止算法 . 如果DOM中有一个元素具有name属性,其值完全等于fragid,则树顺序中的第一个这样的元素是文档的指示部分;在这里停止算法 . 否则,文档中没有指明的部分 .
So, it will look for id="foo", and then will follow to name="foo"
编辑:正如@hsivonen所指出的,在HTML5中, a 元素没有名称属性 . 但是,上述规则仍适用于其他命名元素 .
a
您不应在 text/html 的任何HTML版本中使用 <h1><a name="foo"/>Foo Title</h1> ,因为 text/html 不支持XML空元素语法 . 但是, <h1><a name="foo">Foo Title</a></h1> 在HTML4中没问题 . 它在当前草拟的HTML5中无效 .
text/html
<h1><a name="foo">Foo Title</a></h1>
<h1 id="foo">Foo Title</h1> 在HTML4和HTML5中都可以 . 这在Netscape 4中不起作用,但你可能会使用其他一些在Netscape 4中不起作用的功能 .
我不得不说你是否要链接到页面中的那个区域...例如page.html#foo和Foo Title不是你应该使用的链接:
如果您改为在其周围添加 <a> 参考,那么您的 Headers 将受到您网站中 <a> 特定CSS的影响 . 它's just extra markup, and you shouldn' t需要它 . 我强烈建议在 Headers 上放置一个id,不仅形成得更好,而且它允许你在Javascript或CSS中寻址该对象 .
<a>
Wikipedia makes heavy use of this feature like this:
<a href="#History">[...]</a> <span class="mw-headline" id="History">History</span>
维基百科正在为每个人工作,所以我觉得这个表格很安全 .
另外不要忘记,您不仅可以使用spans,还可以使用div或甚至表格单元格,然后您可以访问元素上的:target伪类 . 只要注意不要改变宽度,就像粗体文字一样,导致内容移动,这是令人不安的 .
Named anchors - my vote is to avoid:
"Names and ids are in the same namespace..." - 具有相同命名空间的两个属性非常疯狂 . 我们只是说已经弃用了 .
"Anchors elements without href atribute" - 再一次,元素的性质(超链接与否)是通过具有属性来定义的?!双重疯狂 . 常识说要完全避免它 .
如果您设置了没有伪类的锚,则样式适用于每个类 . 在CSS3中,您可以使用属性选择器(或每个伪类的相同样式)来解决这个问题,但是它仍然会出现因为您为每个伪类选择颜色,并且默认情况下存在下划线只有删除才有意义使其与其他文本相同 . 但是你决定把你的链接变粗,这会给你带来麻烦 .
Netscape 4可能不支持id功能,但仍然是一个未知属性赢得't cause any trouble. That' s称为兼容性的我 .
是应该使用的 . 除非您想要链接,否则不要使用锚点 .
为JavaScript用户着想: all IDs become global variables under window .
刚刚创建了JS全局:
window.foo
对于 h1 , window.foo 的值将为 HTMLElement .
h1
HTMLElement
除非您能保证 id 属性中使用的所有值都是安全的,否则您可能更喜欢坚持 name :
id
name
<h1 name="foo">Foo Title</h1>
ID方法不适用于较旧的浏览器,锚名称方法将在较新的HTML版本中弃用...我会使用id .
没有语义差异;标准的趋势是使用 id 而不是 name . 但是,在某些情况下,存在差异可能导致人们更喜欢 name . HTML 4.01规范提供the following hints:
使用 id 或 name ?在决定是否使用 id 或 name 作为锚名称时,作者应考虑以下问题:
id属性不仅可以充当锚名称(例如,样式表选择器,处理标识符等) .
某些较旧的用户代理不支持使用id属性创建的锚点 .
name属性允许更丰富的锚名称(带实体) .
我有一个由多个垂直堆叠的div容器组成的网页,格式相同,只有序列号不同 . 我想在每个div的顶部隐藏名称锚点,因此最经济的解决方案是在开始div标签中包含锚点作为id,即
<div id="[serial number]" class="topic_wrapper">
只是关于标记的观察以前的标记形式HTML版本提供了一个锚点 . HTML5中的标记使用id属性形成,虽然大部分是等价的,但需要一个元素来识别,几乎所有元素通常都需要包含内容 .
例如,可以使用空的span或div,但这种用法看起来和气味都是退化的 .
一种想法是为此目的使用wbr元素 . wbr有一个空的内容模型,只是声明可以换行;这仍然是对标记标记的轻微无偿使用,但远不如无偿文档划分或空文本 Span .
第二个样本为相关元素分配唯一ID . 然后可以使用DHTML操纵或访问此元素 .
另一方面,第一个在文档中设置一个类似于书签的命名位置 . 附加到“锚”,它是完全有道理的 .
在html 5中, id="" 属性定义元素的唯一标识符,该元素也是片段链接的锚点 . 在以前的html标准中, <a> 元素的 name="" 属性定义了片段链接的锚点 . 我建议像:<a name="foo" id="foo"></a><h1>Foo Title</h1>因为对 id="" 属性的支持有点不稳定(尽管所有主流浏览器的最新版本都支持它,但是这些版本已经超过几年了[并且它是一个很好的理由]) . 它's compatible, & it doesn' t样式无论's in the link' d元素,关闭</a>仍然在元素之外,但它仍然在所有当前标准中有效 .
id=""
name=""
<a name="foo" id="foo"></a><h1>Foo Title</h1>
确保 <a> 元素的 name="" 和 id="" 属性相同 .
如何将旧浏览器的name属性和id属性用于新浏览器 . 将使用这两个选项,默认情况下将执行回退方法!
根据定义,整个“命名锚”概念使用name属性 . 您应该坚持使用该名称,但ID属性可能对某些javascript情况很方便 .
与评论中一样,您可以随时使用两者来对冲您的赌注 .
14 回答
根据HTML 5规范,5.9.8 Navigating to a fragment identifier:
So, it will look for id="foo", and then will follow to 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中不起作用的功能 .我不得不说你是否要链接到页面中的那个区域...例如page.html#foo和Foo Title不是你应该使用的链接:
如果您改为在其周围添加
<a>
参考,那么您的 Headers 将受到您网站中<a>
特定CSS的影响 . 它's just extra markup, and you shouldn' t需要它 . 我强烈建议在 Headers 上放置一个id,不仅形成得更好,而且它允许你在Javascript或CSS中寻址该对象 .Wikipedia makes heavy use of this feature like this:
维基百科正在为每个人工作,所以我觉得这个表格很安全 .
另外不要忘记,您不仅可以使用spans,还可以使用div或甚至表格单元格,然后您可以访问元素上的:target伪类 . 只要注意不要改变宽度,就像粗体文字一样,导致内容移动,这是令人不安的 .
Named anchors - my vote is to avoid:
"Names and ids are in the same namespace..." - 具有相同命名空间的两个属性非常疯狂 . 我们只是说已经弃用了 .
"Anchors elements without href atribute" - 再一次,元素的性质(超链接与否)是通过具有属性来定义的?!双重疯狂 . 常识说要完全避免它 .
如果您设置了没有伪类的锚,则样式适用于每个类 . 在CSS3中,您可以使用属性选择器(或每个伪类的相同样式)来解决这个问题,但是它仍然会出现因为您为每个伪类选择颜色,并且默认情况下存在下划线只有删除才有意义使其与其他文本相同 . 但是你决定把你的链接变粗,这会给你带来麻烦 .
Netscape 4可能不支持id功能,但仍然是一个未知属性赢得't cause any trouble. That' s称为兼容性的我 .
是应该使用的 . 除非您想要链接,否则不要使用锚点 .
为JavaScript用户着想: all IDs become global variables under window .
刚刚创建了JS全局:
对于
h1
,window.foo
的值将为HTMLElement
.除非您能保证
id
属性中使用的所有值都是安全的,否则您可能更喜欢坚持name
:ID方法不适用于较旧的浏览器,锚名称方法将在较新的HTML版本中弃用...我会使用id .
没有语义差异;标准的趋势是使用
id
而不是name
. 但是,在某些情况下,存在差异可能导致人们更喜欢name
. HTML 4.01规范提供the following hints:使用
id
或name
?在决定是否使用id
或name
作为锚名称时,作者应考虑以下问题:id属性不仅可以充当锚名称(例如,样式表选择器,处理标识符等) .
某些较旧的用户代理不支持使用id属性创建的锚点 .
name属性允许更丰富的锚名称(带实体) .
我有一个由多个垂直堆叠的div容器组成的网页,格式相同,只有序列号不同 . 我想在每个div的顶部隐藏名称锚点,因此最经济的解决方案是在开始div标签中包含锚点作为id,即
只是关于标记的观察以前的标记形式HTML版本提供了一个锚点 . HTML5中的标记使用id属性形成,虽然大部分是等价的,但需要一个元素来识别,几乎所有元素通常都需要包含内容 .
例如,可以使用空的span或div,但这种用法看起来和气味都是退化的 .
一种想法是为此目的使用wbr元素 . wbr有一个空的内容模型,只是声明可以换行;这仍然是对标记标记的轻微无偿使用,但远不如无偿文档划分或空文本 Span .
第二个样本为相关元素分配唯一ID . 然后可以使用DHTML操纵或访问此元素 .
另一方面,第一个在文档中设置一个类似于书签的命名位置 . 附加到“锚”,它是完全有道理的 .
在html 5中,
id=""
属性定义元素的唯一标识符,该元素也是片段链接的锚点 . 在以前的html标准中,<a>
元素的name=""
属性定义了片段链接的锚点 . 我建议像:<a name="foo" id="foo"></a><h1>Foo Title</h1>
因为对
id=""
属性的支持有点不稳定(尽管所有主流浏览器的最新版本都支持它,但是这些版本已经超过几年了[并且它是一个很好的理由]) . 它's compatible, & it doesn' t样式无论's in the link' d元素,关闭</a>仍然在元素之外,但它仍然在所有当前标准中有效 .确保
<a>
元素的name=""
和id=""
属性相同 .如何将旧浏览器的name属性和id属性用于新浏览器 . 将使用这两个选项,默认情况下将执行回退方法!
根据定义,整个“命名锚”概念使用name属性 . 您应该坚持使用该名称,但ID属性可能对某些javascript情况很方便 .
与评论中一样,您可以随时使用两者来对冲您的赌注 .