是否可以使用没有href属性的<a>(锚标记)?


152

我一直在使用Twitter Bootstrap构建网站,其许多功能取决于将内容包装在中<a>,即使它们只是执行Javascript也是如此。我在href="#"Bootstrap文档所建议的策略上遇到了问题,因此我试图寻找其他解决方案。

但是后来我尝试完全删除该href属性。我一直在使用<a class='bunch of classes' data-whatever='data'>,并让Javascript处理其余部分。而且有效。

但是有件事告诉我我不应该这样做。对?我的意思是,从技术上讲,<a>它应该是某事的链接,但是我不确定是为什么这是一个问题。还是?


Answers:


245

所述<a>nchor元件仅仅是一个锚,或从一些内容。最初,HTML规范允许使用命名锚(<a name="foo">)和链接锚(<a href="#foo">)。

命名锚格式不太常用,因为片段标识符现在用于指定[id]属性(尽管为了向后兼容,您仍然可以指定[name]属性)。没有属性<a>元素[href]仍然有效

就语义和样式而言,除非<a>元素:link具有[href]属性,否则它不是链接()。这样做的副作用是,默认情况下,没有的<a>元素不会[href]处于Tab键顺序。

真正的问题是<a>元素本身是否是的适当表示<button>。在语义级别上,a link和a 之间存在明显区别button

按钮是单击后导致动作发生的东西。

链接是一个按钮,可导致当前文档中的导航发生变化。如果是片段标识符(#foo),则发生的导航可能是在文档内移动;如果是URL(/bar),则发生的导航可能是移动到新文档。

由于链接是一种特殊类型的按钮,因此通常会将其操作重写为执行替代功能。从一致性的角度来看,可以继续使用锚点作为按钮是可以的,尽管从语义上来说并不十分准确。

如果您担心使用<a>元素(或<span>,或<div>)作为按钮的语义和可访问性,则应添加以下属性:

<a role="button" tabindex="0" ...>...</a>

按钮的作用告诉该特定元素被视为一个按钮作为用于任何语义底层元件可能有一个覆盖该用户。

对于<span><div>元素,你可能要添加JavaScript键侦听器SpaceEnter触发该click事件。<a href><button>元素默认情况下会执行此操作,但非按钮元素则不会。有时将click触发器绑定到其他键更有意义。例如,Web应用程序中的“帮助”按钮可能绑定到F1


1
@Zacqary,[role="button"]没有做任何具体的事情,您仍然需要监听click事件(但是无论如何,您都要做一个JS按钮)。它旨在用于辅助导航(也称为屏幕阅读器),以便屏幕阅读器知道将元素表示为按钮,而不是其原始语义值。添加[tabindex]将元素添加到制表顺序。在特殊情况下,您可能实际上并不希望/不需要按制表顺序导航按钮,因此它是可选属性。[role="button"]多余的元素不需要已经是按钮的元素。
zzzzBov 2012年

具有没有href和没有名称的锚标记是否有效?在我们的应用程序中,我们有一些删除链接被禁用(因此没有href属性),但仍显示给用户。
Joshua Muheim 2013年

1
@JoshuaMuheim,希望您不要介意,但我将您的问题作为单独的独立问题发布
zzzzBov 2013年

只是想补充一点,如果您使用它来为javascript操作创建“按钮”,则完全删除href属性也会导致Chrome(可能还有其他浏览器)在鼠标悬停时停止更改光标。显然,这很容易通过CSS重新添加-但要注意。
2015年

@Mir,如果您不打算使用[href],则可能应该使用a <span>作为按钮。
zzzzBov

45

我想您可以在这里找到答案:没有href属性的锚标记是否安全?

另外,如果您不想对href进行链接操作,则可以像这样使用它:

<a href="javascript:void(0);">something</a>

3
应该实际上是javascript:undefined
rybo111 2014年

2
@ rybo111你是正确的,但我仍然更喜欢void(0); 基本上是因为它看起来更好。我不希望我的客户将事情视为“未定义” ;-)
亚历克斯(Alex)

9
<a href="javascript:;">text</a>
diynevala 2014年

javascript:;用来破坏IE6中的翻转效果,甚至gif动画之类的东西。对于没有链接的操作,有专用的HTML元素,例如button。同时,href如果JS失败,诸如AJAX链接之类的内容可能会将其用作后备操作。
Ilya Streltsyn

14

是的,使用不带href属性的锚标记是有效的

如果该a元素没有href属性,则该元素表示一个占位符,如果没有关联,则可能已放置了链接,该链接仅由元素的内容组成。

是的,你可以使用class和其他属性,但不能使用targetdownloadrelhreflang,和type

targetdownloadrelhreflang,和type属性必须如果href属性不存在省略。

至于“ 我应该吗? ”部分,请参见第一个引文:“ 如果相关,则可能在其他位置放置了链接 ”。因此,我会问“ 如果没有JavaScript,我会将此标记用作链接吗? ”。如果答案是肯定的,那么应该使用<a>不使用href。如果否,那么我仍然会使用它,因为对于我来说,生产力比边缘情况语义更重要,但这只是我个人的看法。

另外,您应该注意不同的行为样式(例如,不带下划线,不带指针光标,不带:link)。

来源:W3C HTML5建议


与其说“边缘案例语义”,还不如说它的可访问性,它可以确保残疾人可以使用和理解网站的内容
neiya

3

是有效的。例如,您可以使用它来显示模式(或响应data-toggledata-target属性的类似内容)。

就像是:

<a role="button" data-toggle="modal" data-target=".bs-example-modal-sm" aria-hidden="true"><i class="fa fa-phone"></i></a>

在这里,我使用字体真棒图标,它a比更好地作为标签而不是button来显示模式。另外,设置role="button"会使指针更改为动作类型。没有href或时role="button",光标指针不会改变。


2
在这种情况下,您应该使用按钮。从语义和可访问性的角度来看,它都更合适。锚点应将您带到某处,而不要执行任何操作。另外,为什么要隐藏整个锚aria-hidden?也许是图标,但屏幕阅读器用户的体验不应减少。
isherwood
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.