什么是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
,但是你不需要到任何地方的链接。
您可以使用大量的div
或p
标签作为菜单列表,但鼠标指针也可以作为它们的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="#">
实例的项目。