什么是href =“#”,为什么使用?

在很多网站上,我看到的链接有href="#" 。 这是什么意思? 它是干什么用的?

关于超链接:

锚标签的主要用途 – <a></a> – 是超链接 。 这基本上意味着他们把你带到某个地方。 超链接需要href属性,因为它指定了一个位置。

哈希:

超链接中的散列 – #指定窗口应该滚动到的html元素ID。

href="#some-id"会滚动到当前页面上的一个元素,比如<div id="some-id">

href="//site.com/#some-id"将转到site.com并滚动到该页面上的ID。

滚动到顶部:

href="#"没有指定一个id名称,但是有一个相应的位置 – 页面顶部。 点击带有href="#"的锚点将滚动位置移动到顶部。

看到这个演示。

根据w3文档,这是预期的行为

超链接占位符:

一个超链接占位符合理的例子就是模板预览。 在模板的单页演示中,我经常看到<a href="#">这样的锚标记是一个超链接,但不去任何地方。 为什么不把href属性留空? 空白的href属性实际上是到当前页面的超链接。 换句话说,它会导致页面刷新。 正如我所讨论的, href="#"也是一个超链接,并导致滚动。 因此,超链接占位符的最佳解决scheme实际上就是href="#!" 这里的想法是,有希望不是页面上的元素id="!" (谁这样做!?),因此超链接指的是什么 – 所以没有任何反应。

关于锚定标记:

你可能想知道的另一个问题是,“为什么不把href属性关掉?”。 我听到的一个共同的反应是, href属性是必需的,所以它应该“在锚点”。 这是假的! href属性只需要一个锚实际上是一个超链接! 从w3阅读这个 。 那么,为什么不把它留给占位? 浏览器呈现元素的默认样式,并将更改不具有href属性的定位标签的默认样式。 相反,它会被认为是普通文本。 它甚至改变了浏览器对元素的行为。 当hover在没有href属性的锚点上时,状态栏(屏幕底部)将不会显示。 最好在锚点上使用占位符href值,以确保它被视为超链接。

看到这个演示风格和行为的差异。

将“#”符号表示为href,意味着它不指向不同的URL,而是指向同一页上的另一个id或name标记。 例如:

 <a href="#bottomOfPage">Click to go to the bottom of the page</a> blah blah blah blah ... <a id="bottomOfPage"></a> 

但是,如果没有id或名字,那么它就会“不在哪里”。

这里是另外一个类似的问题, 用'name'或'id'问HTML锚点?

这是一个链接到本质的链接(它只是添加“#”到URL)。 它被用于许多不同的原因。 例如,如果你正在使用某种JavaScript / jQuery,并且不希望实际的HTML链接到任何地方。

它也用于页面定位,用于redirect到页面的不同部分。

无序列表通常是为了将它们用作菜单而创build的,但是列表项是文本。 由于列表li是文本,所以鼠标指针不是箭头,而是“I游标”。 用户习惯于在可点击的时候看到鼠标指针。 在li标签内部使用锚标签会使鼠标指针变成指向手指。 使用这个列表作为一个菜单,指向手指会更好。

 <ul id="menu"> <li><a href="#">Menu Item 1</a></li> <li><a href="#">Menu Item 2</a></li> <li><a href="#">Menu Item 3</a></li> <li><a href="#">Menu Item 4</a></li> </ul> 

如果列表正用于菜单,并且不需要链接,则不需要指定URL。 但问题是,如果省略href属性, <a>标签中的文本将被视为文本,因此鼠标指针将返回到I-cursor。 I型光标可能会使用户认为菜单项不可点击。 因此,你仍然需要一个href ,但是你不需要到任何地方的链接。

您可以使用大量的divp标签作为菜单列表,但鼠标指针也可以作为它们的I-cursor。

您可以使用堆叠在一起的大量button作为菜单列表,但列表似乎更可取。 这可能就是为什么指向无处的href="#"被用在列表标签​​中的锚标签中的原因。

您可以在CSS中设置指针样式,这是另一种select。 无处不在的href="#"可能只是懒惰的方式来设置一些样式。

据我所知,它通常是一个链接的占位符,有一些JavaScript附加到他们。 链接的要点是通过执行JavaScript代码来实现的。 用JS支持的浏览器然后忽略真正的链接目标。 如果浏览器不支持JS,哈希标记本质上将链接变成一个无操作。 另请参阅不显眼的JavaScript 。

对于空链接使用href =“#”的问题是,它会带你到页面的顶部,这可能不是所需的操作。 为避免这种情况,对于旧版浏览器或非HTML5文档types,请使用

 <a href="javascript:void(0)">Goes Nowhere</a> 

正如其他一些答案所指出的那样, a元素需要href属性, #被用作占位符,但也是一个历史的人为因素。

来自Mozilla开发者networking :

HREF

这是定义超文本源链接的定位器的唯一必需属性,但在HTML5中不再需要。 省略此属性将创build一个占位符链接。 href属性指示链接目标,即URL或URL片段。 一个URL片段是一个名字前面有一个散列标记(#),它指定了当前文档中的一个内部目标位置(一个ID)。

另外,根据HTML5 规范 :

如果a元素没有href属性,那么元素表示一个占位符,表示一个链接可能被放置的位置,如果它是相关的,则只包含元素的内容。

不幸的是, <a href="#">最常见的用法是懒惰的程序员,他们希望可点击的非超链接的JavaScript代码元素的行为像锚点,但他们不能被添加cursor: pointer; 或者:hover样式caching到非超链接元素的类中,而且还懒得将href设置为javascript:void(0);

这个问题是一个<a href="#" onclick="some_function();">或另一个不可避免地结束了一个javascript错误,并且一个onclick javascript错误的锚总是在它的href结束。 通常这最终会成为页面顶部的烦人跳转,但是在使用<base>的网站的情况下, <a href="#">被处理为<a href="[base href]/#"> ,导致意外的导航。 如果正在生成任何可疑错误,除非启用持久性日志,否则在后一种情况下将不会看到它们。

如果使用锚元素作为非锚点, 则应将其href设置为javascript:void(0); 为了优雅的退化。

我只是浪费了两天的时间来debugging一个随机意外的页面redirect,应该只刷新页面,最后跟踪到一个函数,引发一个<a href="#">的点击事件。 用javascript:void(0);replace# javascript:void(0); 修复。

我星期一做的第一件事是清除所有<a href="#">实例的项目。