当一个人想用 " " 方法引用网页的某个部分时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 5 规范,5.9.8 导航到片段标识符:
对于 HTML 文档(和 text/html MIME 类型),必须遵循以下处理模型来确定文档的指示部分是什么。
- 解析 URL,让 fragid 成为 URL 的 <fragment> 组件。
- 如果 fragid 是空字符串,则文档的指示部分是文档的顶部。
- 如果 DOM 中有一个元素的 ID 正好等于 fragid,那么树顺序中的第一个这样的元素就是文档的指示部分;在这里停止算法。
- 如果 DOM 中有一个a元素的 name 属性的值正好等于 fragid,那么树顺序中的第一个这样的元素就是文档的指示部分;在这里停止算法。
- 否则,文档中没有指定的部分。
所以,它会寻找id="foo"
,然后会跟随name="foo"
编辑:正如@hsivonen 所指出的,在 HTML5 中该a
元素没有 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 中不起作用的其他功能。
我不得不说,如果您要链接到页面中的那个区域......例如 page.html#foo 和 Foo Title 不是您应该使用的链接:
<h1 id="foo">Foo Title</h1>
如果您改为在其<a>
周围添加参考,您的标题将受到<a>
您网站中特定 CSS 的影响。这只是额外的标记,你不应该需要它。我强烈建议在标题上放置一个 id,它不仅格式更好,而且允许您在 Javascript 或 CSS 中处理该对象。
Wikipedia 大量使用此功能,如下所示:
<a href="#History">[...]</a>
<span class="mw-headline" id="History">History</span>
维基百科适用于所有人,所以我会觉得坚持使用这种形式是安全的。
也不要忘记,您不仅可以将它用于跨度,还可以用于 div 甚至表格单元格,然后您可以访问元素上的 :target 伪类。请注意不要更改宽度,例如粗体文本,因为这会移动内容,这很令人不安。
命名锚 - 我的投票是避免:
<h1 id="foo">Foo Title</h1>
是应该使用的。除非您需要链接,否则不要使用锚点。
JavaScript 用户注意:所有 ID 都成为 window 下的全局变量。
<h1 id="foo">Foo Title</h1>
刚刚创建了 JS 全局:
window.foo
的值window.foo
将是HTMLElement
的h1
。
除非您可以保证id
属性中使用的所有值都是安全的,否则您可能更喜欢坚持name
:
<h1 name="foo">Foo Title</h1>
ID 方法不适用于旧浏览器,锚名称方法将在较新的 HTML 版本中被弃用......我会选择 id。
没有语义差异;标准的趋势是使用id
而不是name
. 但是,在某些情况下,存在一些差异可能会导致人们更喜欢name
。HTML 4.01 规范提供了以下提示:
使用id
或name
?id
作者在决定是否使用name
锚名称时应考虑以下问题:
在 html 5 中,id=""
属性定义了元素的唯一标识符,它也是片段链接的锚点。在以前的 html 标准中,元素的name=""
属性<a>
定义了片段链接的锚点。我推荐这样的东西:<a name="foo" id="foo"></a><h1>Foo Title</h1>
因为对id=""
属性的支持有点参差不齐(即使所有主要浏览器的最新版本都支持它,但不超过几年的版本[而且最好不要破坏某些东西如果没有充分的理由])。它是兼容的,并且它不会为链接元素中的任何内容设置样式,因为结束 </a> 仍然在元素之外,但它在所有当前标准中仍然有效。
确保元素 的name=""
和id=""
属性相同。<a>
我有一个由许多垂直堆叠的 div 容器组成的网页,格式相同,仅序列号不同。我想在每个 div 的顶部隐藏名称锚点,因此最经济的解决方案是将锚点作为 id 包含在打开的 div 标签中,即
<div id="[serial number]" class="topic_wrapper">
第二个示例将唯一 ID 分配给相关元素。然后可以使用 DHTML 操作或访问该元素。
另一方面,第一个在文档中设置一个命名位置,类似于书签。附加到“锚”上,这很有意义。
只是对标记的观察 以前的 HTML 版本中的标记表单提供了一个锚点。HTML5 中使用 id 属性的标记表单虽然大部分是等效的,但需要一个元素来识别,几乎所有这些通常都包含内容。
例如,可以使用一个空的 span 或 div,但这种用法看起来和闻起来都变质了。
一种想法是为此目的使用 wbr 元素。wbr 有一个空的内容模型,并简单地声明可以换行;这仍然是对标记标记的略微无偿使用,但比无偿的文档划分或空文本跨度要少得多。
如何对旧浏览器使用 name 属性,对新浏览器使用 id 属性。这两个选项都将被使用,并且默认情况下将实现回退方法!!!
现在不是关于支持,因为谁会在 2021 年关心比 IE6 更旧的浏览器?
请注意,Stackoverflow 仍在使用锚点和“名称”属性而不是“名称”属性。
为什么?
因为你:
#sample
{
color: red;
}
<div id="postNr4245 sample"> Sample text </div> <!-- coloring doesn't work -->
<a href="#postNr4245">Jump to Post</a> <!-- jumping doesn't work -->
好的,您可以说您可以为此使用“类”。
这是真的,但如果您的网站上只有一个元素需要设置样式,那么您不应该使用 class.
为什么?
因为如果您使用 CSS 选择器 #idName 并且 Web 浏览器会找到该元素,它将不会进一步查找。它可以加快您网站的加载速度。
如果您使用 .class 它需要查找 DOM 的每个位置,因为 Web 浏览器不知道您是否使用过 .class 一次或多次。
根据定义,整个“命名锚”概念使用名称属性。您应该只使用名称,但 ID 属性对于某些 javascript 情况可能很方便。
如评论中所述,您始终可以同时使用两者来对冲您的赌注。