如何仅使用CSS禁用链接?


844

有什么方法可以使用CSS禁用链接吗?

我有一个叫的类current-page,想禁用与该类的链接,以便在单击它们时不执行任何操作。


42
经过大量的谷歌搜索后,我得到了这个问题的完美答案css-tricks.com/pointer-events-current-nav
RSK

1
是否应使用链接所承载的语义要比表述的价值更大。不应通过CSS禁用它,而应通过利用hidden适用于任何HTML元素的属性来禁用它。然后,可以使用CSS选择a[hidden]锚,并相应地设置样式。
2013年

@amn,但我认为浏览器不会显示具有hidden属性的元素,因此样式变得毫无意义。
user1794469

1
@ user1794469如果您通过CSS指示他们使用display: block,例如将使用或其他值display。但是hidden并不总是适用的-它适用于无关紧要的元素,从这个问题出发,不清楚为什么应该禁用链接。这可能是XY问题的情况。
AMN

Answers:


1347

答案已经在问题的评论中。为了获得更多可见性,我在这里复制此解决方案

.not-active {
  pointer-events: none;
  cursor: default;
  text-decoration: none;
  color: black;
}
<a href="link.html" class="not-active">Link</a>

有关浏览器的支持,请参见https://caniuse.com/#feat=pointer-events。如果您需要支持IE,则有一种解决方法。看到这个答案

警告:pointer-eventsCSS中非SVG元素的使用是实验性的。该功能曾经是CSS3 UI草案规范的一部分,但由于存在许多未解决的问题,因此已推迟到CSS4。


36
同样,这也不能避免跳至链接然后输入。
Jono 2013年

4
如果您要为其设置样式,则用户可以看到它已被禁用。给它一些透明度:.2
DNRN

4
现在,它可以在包括IE 11在内的所有现代浏览器中使用。如果需要对IE 10及更低版本的支持,则可以使用JavaScript polyfill,例如this
Keavon 2014年

26
重要说明:这只会禁用单击,而不会禁用实际的链接本身。您仍然可以使用Tab键和Enter键来“单击”链接。
Pikamander2 2014年

11
使用pointer-events: none;不是完美的。它还禁用其他事件,例如悬停,这是显示title="…"或工具提示所必需的。我发现JS解决方案(使用event.preventDefault();)和一些CSS(cursor: default; opacity: 0.4;)更好,并且提供了解释为什么禁用链接的工具提示。
Quinn Comendant 2015年

140

.disabled {
  pointer-events: none;
  cursor: default;
  opacity: 0.6;
}
<a href="#" class="disabled">link</a>


您可能需要将显示设置为行内阻止(或行内以外)。
dev_masta '16

不错,但要注意指针的事件浏览器的支持(即<IE11):caniuse.com/#search=pointer-events
一个达伦

1
对于样式,请尝试更改pointer-events:none;pointer-events:unset;。然后,光标可以更改为cursor:not-allowed;。这为用户提供了更好的线索。到目前为止,似乎可以在FF,Edge,Chrome,Opera和Brave中使用。
Sablefoste

@Sablefoste在Chrome 60中对我而言不起作用。光标的确是not-allowed,但链接仍可单击。
汤犬

122

CSS只能用于更改某些样式。使用纯CSS可能要做的最好的事情就是完全隐藏链接。

您真正需要的是一些JavaScript。使用jQuery库的方法如下。

$('a.current-page').click(function() { return false; });

21
别忘了防止默认行为:function(ev){ ev.preventDefault(); ev.stopPropagation(); return false;
ldiqual 2012年

5
@Idiqual,return false确实是
nickf

1
return false仅当使用href属性设置操作时才有效
贾斯汀2012年

此版本还可以用于禁用点击,同时保留诸如:hover或:focus!之类的其他指针事件。最佳答案!
查理·图普曼

尽管这在所有浏览器中都有效,但仅禁用了单击链接的功能。请记住,许多用户习惯于从上下文菜单或使用鼠标中键打开链接。
亚历山德鲁·塞韦林

33

CSS无法做到这一点。CSS仅用于演示。您的选择是:

  • 不要href<a>标签中包含该属性。
  • 使用JavaScript查找具有的锚元素class,并相应地删除其hrefonclick属性。jQuery会帮助您解决这一问题(NickF展示了如何做类似但更好的事情)。

30
那不是正确的答案-指针事件:无;CSS可以禁用它。
pie6k 2015年

我没想到!也许该属性在2010年还不存在?无论如何,pointer-events: none可以禁用鼠标事件。但是,它不会禁用基础链接。在Chrome 81中尝试进行的测试中,我仍然可以通过以下方式激活这样的链接:在该链接上按Tab键并输入返回键。
凯文·康纳

31

引导程序禁用链接

<a href="#" class="btn btn-primary btn-lg disabled" role="button">Primary link</a>

<a href="#" class="btn btn-default btn-lg disabled" role="button">Link</a>

Bootstrap Disabled按钮,但看起来像链接

<button type="button" class="btn btn-link">Link</button>




10

如果只希望它是CSS,则禁用逻辑应由CSS定义。

要在CSS定义中移动逻辑,您必须使用属性选择器。这里有些例子 :

禁用具有确切href的链接: =

您可以选择禁用包含特定href值的链接,如下所示:

<a href="//website.com/exact/path">Exact path</a>

[href="https://stackoverflow.com//website.com/exact/path"]{
  pointer-events: none;
}

禁用包含一条路径的链接: *=

在此,/keyword/路径中包含的任何链接将被禁用

<a href="//website.com/keyword/in/path">Contains in path</a>

[href*="/keyword/"]{
  pointer-events: none;
}

禁用以以下内容开头的链接: ^=

[attribute^=value]操作者目标与一个特定的值开始的属性。允许您丢弃网站和根路径。

<a href="//website.com/begins/with/path">Begins with path</a>

[href^="//website.com/begins/with"]{
  pointer-events: none;
}

您甚至可以使用它来禁用非https链接。例如 :

a:not([href^="https://"]){
  pointer-events: none;
}

禁用以以下结尾的链接: $=

[attribute$=value]操作者的目标的属性,与一个特定的值结束。丢弃文件扩展名可能很有用。

<a href="/path/to/file.pdf">Link to pdf</a>

[href$=".pdf"]{
  pointer-events: none;
}

或其他任何属性

CSS可以定位任何HTML属性。可能是reltargetdata-custom等...

<a href="#" target="_blank">Blank link</a>

[target=_blank]{
  pointer-events: none;
}

组合属性选择器

您可以链接多个规则。假设您要禁用每个外部链接,但不禁用那些指向您的网站的链接:

a[href*="//"]:not([href*="my-website.com"]) {
    pointer-events: none;
}

或禁用指向特定网站pdf文件的链接:

<a href="//website.com/path/to/file.jpg">Link to image</a>

[href^="//website.com"][href$=".jpg"] {
  color: red;
}

浏览器支持

从IE7开始,支持属性选择器。:not()自IE9以来的选择器。


如何使用禁用的选择器禁用链接?例如<a class="test" disable href="3"> test </a> a:disabled {cursor:not-allowed; }
ecasper

10

使用CSS的一种方法是在包装上设置CSS div您设置为消失,然后由其他代替。

例如:

<div class="disabled">
    <a class="toggleLink" href="wherever">blah</a>
    <span class="toggleLink">blah</span
</div>

用CSS之类的

.disabled a.toggleLink { display: none; }
span.toggleLink { display: none; }
.disabled span.toggleLink { display: inline; }

要真正关闭,a您必须替换它的click事件或href,如其他人所述。

PS:只是为了澄清一下,我认为这是一个相当不整洁的解决方案,对于SEO来说也不是最好的解决方案,但是我相信纯CSS最好。


8

尝试这个:

<style>
.btn-disable {
    display:inline-block;
    pointer-events: none;       
}
</style>

6

使用pointer-events属性,可以控制HTML元素如何响应鼠标/触摸事件,包括CSS悬停/活动状态,Javascript中的单击/轻击事件以及光标是否可见。

不是禁用Link的唯一方法,而是一种在IE10 +和所有新浏览器中都可以使用的CSS好方法:

.current-page {
  pointer-events: none;
  color: grey;
}
<a href="#" class="current-page">This link is disabled</a>


4

我通过互联网搜索,发现没有比更好的了。基本上禁用按钮单击功能,只需使用jQuery添加CSS样式,如下所示:

$("#myLink").css({ 'pointer-events': 'none' });

然后再次启用它

$("#myLink").css({ 'pointer-events': '' });

通过Firefox和IE 11进行了检查。


3
您不需要jQuery,可以自己在CSS中进行设置。
Bram Vanroy

3

您可以使用以下CSS:

a.button,button {
    display: inline-block;
    padding: 6px 15px;
    margin: 5px;
    line-height: 1.42857143;
    text-align: center;
    white-space: nowrap;
    vertical-align: middle;
    -ms-touch-action: manipulation;
    touch-action: manipulation;
    cursor: pointer;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    background-image: none;
    border: 1px solid rgba(0, 0, 0, 0);
    border-radius: 4px;
    -moz-box-shadow: inset 0 3px 20px 0 #cdcdcd;
    -webkit-box-shadow: inset 0 3px 20px 0 #cdcdcd;
    box-shadow: inset 0 3px 20px 0 #cdcdcd;
}

a[disabled].button,button[disabled] {
    cursor: not-allowed;
    opacity: 0.4;
    pointer-events: none;
    -webkit-touch-callout: none;
}

a.button:active:not([disabled]),button:active:not([disabled]) {
    background-color: transparent !important;
    color: #2a2a2a !important;
    outline: 0;
    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .5);
    box-shadow: inset 0 3px 5px rgba(0, 0, 0, .5);
}
<button disabled="disabled">disabled!</button>
<button>click me!</button>
<a href="http://royansoft.com" disabled="disabled" class="button">test</a>
<a href="http://royansoft.com" class="button">test2</a>


2

感谢每个发布解决方案的人,我结合了多种方法来提供一些更高级的disabled功能。 这是要点下面是代码。

This provides for multiple levels of defense so that Anchors marked as disable actually behave as such.
Using this approach, you get an anchor that you cannot:
  - click
  - tab to and hit return
  - tabbing to it will move focus to the next focusable element
  - it is aware if the anchor is subsequently enabled


1.  Include this css, as it is the first line of defense.  This assumes the selector you use is 'a.disabled'
    a.disabled {
      pointer-events: none;
      cursor: default;
    }

 2. Next, instantiate this class such as (with optional selector):
    $ ->
      new AnchorDisabler()

这里是咖啡类:

class AnchorDisabler
  constructor: (selector = 'a.disabled') ->
    $(selector).click(@onClick).keyup(@onKeyup).focus(@onFocus)

  isStillDisabled: (ev) =>
    ### since disabled can be a class or an attribute, and it can be dynamically removed, always recheck on a watched event ###
    target = $(ev.target)
    return true if target.hasClass('disabled')
    return true if target.attr('disabled') is 'disabled'
    return false

  onFocus: (ev) =>
    ### if an attempt is made to focus on a disabled element, just move it along to the next focusable one. ###
    return unless @isStillDisabled(ev)

    focusables = $(':focusable')
    return unless focusables

    current = focusables.index(ev.target)
    next = (if focusables.eq(current + 1).length then focusables.eq(current + 1) else focusables.eq(0))

    next.focus() if next


  onClick: (ev) =>
    # disabled could be dynamically removed
    return unless @isStillDisabled(ev)

    ev.preventDefault()
    return false

  onKeyup: (ev) =>

    # 13 is the js key code for Enter, we are only interested in disabling that so get out fast
    code = ev.keyCode or ev.which
    return unless code is 13

    # disabled could be dynamically removed
    return unless @isStillDisabled(ev)

    ev.preventDefault()
    return false

您好!!,答案是关于CSS不是JS或其他什么!
Mehdi Dehghani

1

您还可以调整另一个元素的大小,以使其覆盖链接(使用正确的z-index):这样可以“消除”点击次数。

(我们偶然发现了此问题,因为由于“响应式”设计导致突然不活动的链接出现问题,导致浏览器窗口为移动大小时H2覆盖了它们。)


正确,但不适用于键盘导航。
AndFisher '16

1

演示在这里
试试这个

$('html').on('click', 'a.Link', function(event){
    event.preventDefault();
});

1
你的小提琴不起作用!该链接在Chrome中仍然有效。
马特·伯恩

要修复此代码,请交换传递给on()的前两个参数:$('html')。on('click','a.Link',function(event){event.preventDefault();});
2C-B

1
您好!!,答案是关于CSS不是JS或其他什么!
Mehdi Dehghani

0

另一个技巧是在其上方放置一个不可见的元素。这也会禁用任何悬停效果

.myButton{
    position: absolute;
    display: none;
}

.myButton::after{ 
    position: absolute;
    content:"";
    height:100%;
    width:100%;
    top:0;
    left:0;
}

-1

有可能在CSS中完成

.disabled{
  cursor:default;
  pointer-events:none;
  text-decoration:none;
  color:black;
}
<a href="https://www.google.com" target="_blank" class="disabled">Google</a>

见于:

请注意,并不需要text-decoration: none;color: black;,但是它使链接看起来更像纯文本。


-1

pointer-events:none 将禁用链接:

.disabled {
       pointer-events:none;
}
<a href="#" class="disabled">link</a>

1
这很好,但是如果用户使用他的键盘,则当然不起作用:(
gztomas

-1

<a href="#!">1) Link With Non-directed url</a><br><br>

<a href="#!" disabled >2) Link With with disable url</a><br><br>


2
<a>标记没有禁用的属性。
Hexodus
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.