有什么方法可以使用CSS禁用链接吗?
我有一个叫的类current-page
,想禁用与该类的链接,以便在单击它们时不执行任何操作。
hidden
适用于任何HTML元素的属性来禁用它。然后,可以使用CSS选择a[hidden]
锚,并相应地设置样式。
display: block
,例如将使用或其他值display
。但是hidden
并不总是适用的-它适用于无关紧要的元素,从这个问题出发,不清楚为什么应该禁用链接。这可能是XY问题的情况。
有什么方法可以使用CSS禁用链接吗?
我有一个叫的类current-page
,想禁用与该类的链接,以便在单击它们时不执行任何操作。
hidden
适用于任何HTML元素的属性来禁用它。然后,可以使用CSS选择a[hidden]
锚,并相应地设置样式。
display: block
,例如将使用或其他值display
。但是hidden
并不总是适用的-它适用于无关紧要的元素,从这个问题出发,不清楚为什么应该禁用链接。这可能是XY问题的情况。
Answers:
答案已经在问题的评论中。为了获得更多可见性,我在这里复制此解决方案:
.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-events
CSS中非SVG元素的使用是实验性的。该功能曾经是CSS3 UI草案规范的一部分,但由于存在许多未解决的问题,因此已推迟到CSS4。
pointer-events: none;
不是完美的。它还禁用其他事件,例如悬停,这是显示title="…"
或工具提示所必需的。我发现JS解决方案(使用event.preventDefault();
)和一些CSS(cursor: default; opacity: 0.4;
)更好,并且提供了解释为什么禁用链接的工具提示。
.disabled {
pointer-events: none;
cursor: default;
opacity: 0.6;
}
<a href="#" class="disabled">link</a>
pointer-events:none;
为pointer-events:unset;
。然后,光标可以更改为cursor:not-allowed;
。这为用户提供了更好的线索。到目前为止,似乎可以在FF,Edge,Chrome,Opera和Brave中使用。
not-allowed
,但链接仍可单击。
CSS只能用于更改某些样式。使用纯CSS可能要做的最好的事情就是完全隐藏链接。
您真正需要的是一些JavaScript。使用jQuery库的方法如下。
$('a.current-page').click(function() { return false; });
function(ev){ ev.preventDefault(); ev.stopPropagation(); return false;
。
return false
确实是
return false
仅当使用href
属性设置操作时才有效
CSS无法做到这一点。CSS仅用于演示。您的选择是:
href
在<a>
标签中包含该属性。class
,并相应地删除其href
或onclick
属性。jQuery会帮助您解决这一问题(NickF展示了如何做类似但更好的事情)。pointer-events: none
可以禁用鼠标事件。但是,它不会禁用基础链接。在Chrome 81中尝试进行的测试中,我仍然可以通过以下方式激活这样的链接:在该链接上按Tab键并输入返回键。
<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>
<button type="button" class="btn btn-link">Link</button>
您可以将href
属性设置为javascript:void(0)
.disabled {
/* Disabled link style */
color: black;
}
<a class="disabled" href="javascript:void(0)">LINK</a>
我用了:
.current-page a:hover {
pointer-events: none !important;
}
而且还不够;在某些浏览器中,它仍然显示链接,闪烁。
我必须添加:
.current-page a {
cursor: text !important;
}
a[disabled]:active { pointer-events: none !important; }
更好。
如果您只想在表单上坚持HTML / CSS,则另一个选择是使用按钮。设置样式并设置disabled
属性。
如果只希望它是CSS,则禁用逻辑应由CSS定义。
要在CSS定义中移动逻辑,您必须使用属性选择器。这里有些例子 :
=
您可以选择禁用包含特定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属性。可能是rel
,target
,data-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以来的选择器。
使用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最好。
我通过互联网搜索,发现没有比这更好的了。基本上禁用按钮单击功能,只需使用jQuery添加CSS样式,如下所示:
$("#myLink").css({ 'pointer-events': 'none' });
然后再次启用它
$("#myLink").css({ 'pointer-events': '' });
通过Firefox和IE 11进行了检查。
您可以使用以下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>
感谢每个发布解决方案的人,我结合了多种方法来提供一些更高级的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
或其他什么!
您还可以调整另一个元素的大小,以使其覆盖链接(使用正确的z-index):这样可以“消除”点击次数。
(我们偶然发现了此问题,因为由于“响应式”设计导致突然不活动的链接出现问题,导致浏览器窗口为移动大小时H2覆盖了它们。)
演示在这里
试试这个
$('html').on('click', 'a.Link', function(event){
event.preventDefault();
});
CSS
不是JS
或其他什么!
有可能在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;
,但是它使链接看起来更像纯文本。