Como desativar um link usando apenas CSS?

844

Existe alguma maneira de desativar um link usando CSS?

Eu tenho uma classe chamada current-pagee quero que os links com essa classe sejam desativados, para que nenhuma ação ocorra quando eles são clicados.

RSK
fonte
42
depois de um monte de googling eu tenho a resposta perfeita para essa pergunta css-tricks.com/pointer-events-current-nav
RSK
1
Se um link deve ser usado ou não, carrega mais semântica que valor de apresentação. Ele não deve ser desativado por meio do CSS, mas pela utilização do hiddenatributo aplicável a qualquer elemento HTML. O CSS pode então ser usado para selecionar, por exemplo, a[hidden]âncora e estilizá-la de acordo.
01:
@ amn, mas não acho que os navegadores exibirão um elemento com o atributo oculto para que o estilo se torne discutível.
precisa saber é o seguinte
1
@ user1794469 Eles o instruirão se, com CSS, usar display: block, por exemplo, ou algum outro valor para display. Mas hiddennem sempre é aplicável - é para elementos irrelevantes e, da questão, não está claro por que o link deve ser desativado. Este é provavelmente um caso de problema XY.
01

Respostas:

1348

A resposta já está nos comentários da pergunta. Para mais visibilidade, estou copiando esta solução aqui:

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

Para suporte ao navegador, consulte https://caniuse.com/#feat=pointer-events . Se você precisar dar suporte ao IE, há uma solução alternativa; veja esta resposta .

Aviso: O uso de pointer-eventsCSS para elementos não SVG é experimental. O recurso costumava fazer parte da especificação de rascunho da interface do usuário do CSS3, mas, devido a muitos problemas em aberto, foi adiado para o CSS4.

RSK
fonte
36
Além disso, isso não evita tabular o link e, em seguida, insira.
Jono
4
Se você quiser estilizá-lo um pouco, para que o usuário possa ver que está desativado. Dê-lhe alguma opacidade: .2
DNRN
4
Isso agora funciona em todos os navegadores modernos, incluindo o IE 11. Se você precisar de suporte para o IE 10 e versões inferiores, poderá usar um polyfill JavaScript como este .
Keavon
26
Nota importante: isso desativa apenas o clique, não o próprio link real. Você ainda pode usar a guia + enter para "clicar" no link.
Pikamander2
11
O uso de pointer-events: none;não é perfeito. Ele também desativa outros eventos, como foco, necessário para a exibição title="…"ou dicas de ferramentas. Descobri que a solução JS é melhor (usando event.preventDefault();) junto com algum CSS ( cursor: default; opacity: 0.4;) e uma dica de ferramenta explicando por que o link está desativado.
Quinn Comendant
140

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

Amir Keshavarz
fonte
Pode ser necessário definir a exibição como bloco embutido (ou algo diferente de embutido).
Dev1masta
apoio agradáveis, mas cuidado com ponteiro-eventos navegador (ou seja <IE11): caniuse.com/#search=pointer-events
um darren
1
Para obter estilo, tente mudar pointer-events:none;para pointer-events:unset;. Em seguida, o cursor pode ser alterado para cursor:not-allowed;. Isso dá uma pista melhor sobre o que está acontecendo com o usuário. Parece funcionar em FF, Edge, Chrome, Opera e Brave a partir de hoje.
Sablefoste 5/09/17
@Sablefoste Isso não funciona para mim no Chrome 60. O cursor é mesmo not-allowed, mas o link permanece clicável.
soupdog 11/09/19
122

CSS só pode ser usado para alterar o estilo de algo. O melhor que você provavelmente poderia fazer com CSS puro é ocultar o link completamente.

O que você realmente precisa é de algum javascript. Aqui está como você faria o que deseja usando a biblioteca jQuery.

$('a.current-page').click(function() { return false; });
nickf
fonte
21
Não se esqueça prevenir comportamentos padrão: function(ev){ ev.preventDefault(); ev.stopPropagation(); return false;.
precisa
5
@Idiqual, return falsefaz isso
nickf
1
return falsesó funciona se a ação é definida usando o hrefatributo
Justin
Além disso, esta versão pode ser usada para desativar cliques, mantendo outros eventos de ponteiro como: hover ou: focus! Top resposta!
Charlie Tupman 5/05
Embora isso funcione em todos os navegadores, apenas desativou o clique em um link. Lembre-se de que muitos usuários são usados ​​para abrir links no menu de contexto ou usando o botão do meio do mouse.
Alexandru Severin
33

CSS não pode fazer isso. CSS é apenas para apresentação. Suas opções são:

  • Não inclua o hrefatributo nas suas <a>tags.
  • Use JavaScript, para encontrar os elementos âncora com isso classe remova seus hrefou onclickatributos de acordo. O jQuery ajudaria você com isso (o NickF mostrou como fazer algo semelhante, mas melhor).
Kevin Conner
fonte
30
Essa não é a resposta correta - eventos-ponteiro: nenhum; CSS pode desativá-lo.
pie6k
Eu não pensei nisso! Ou talvez o atributo ainda não existisse em 2010? De qualquer forma, é verdade que pointer-events: nonepode desativar os eventos do mouse. No entanto, ele não desativa o link subjacente. Em um teste que experimentei no Chrome 81, ainda posso ativar esse link, tabulando-o e digitando a tecla Enter.
Kevin Conner
31

Link desativado de inicialização

<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>

Botão de inicialização desativada, mas parece com o link

<button type="button" class="btn btn-link">Link</button>
Jigar Bhatt
fonte
19

Você pode definir o hrefatributo comojavascript:void(0)

.disabled {
  /* Disabled link style */
  color: black;
}
<a class="disabled" href="javascript:void(0)">LINK</a>

Xinus
fonte
2
@nickf true, no entanto, esta é uma solução interessante e é melhor do que depender do estilo pobre do IE padrão quando definido como desativado.
SausageFingers
Eu acho que poderia ser um pouco mais complicado que isso. Aqui está uma solução: snook.ca/archives/javascript/clear_links_to_1 #
Mike Gifford
12

Eu usei:

.current-page a:hover {
pointer-events: none !important;
}

E não foi suficiente; em alguns navegadores, ele ainda exibia o link, piscando.

Eu tive que adicionar:

.current-page a {
cursor: text !important;
}
Pablo Molina
fonte
3
Eu acho que a[disabled]:active { pointer-events: none !important; }é melhor
Masamoto Miyata
10

Se você deseja manter apenas HTML / CSS em um formulário, outra opção é usar um botão. Denomine-o e defina o disabledatributo.

Por exemplo, http://jsfiddle.net/cFTxH/1/

Sebastian Patten
fonte
10

Se você deseja que seja apenas CSS, a lógica de desativação deve ser definida pelo CSS.

Para mover a lógica nas definições de CSS, você precisará usar seletores de atributos. Aqui estão alguns exemplos :

Desative o link que tem um href exato: =

Você pode optar por desativar os links que contêm um valor de href específico, como:

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

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

Desative um link que contenha um caminho: *=

Aqui, qualquer link que contenha /keyword/no caminho será desativado

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

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

Desative um link que comece com: ^=

o [attribute^=value]operador segmenta um atributo que começa com um valor específico. Permite descartar sites e caminhos raiz.

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

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

Você pode até usá-lo para desativar links não https. Por exemplo :

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

Desative um link que termina com: $=

O [attribute$=value]operador segmenta um atributo que termina com um valor específico. Pode ser útil descartar extensões de arquivo.

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

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

Ou qualquer outro atributo

CSS pode direcionar qualquer atributo HTML. Poderia ser rel, target, data-custome assim por diante ...

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

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

Combinando seletores de atributos

Você pode encadear várias regras. Digamos que você deseja desativar todos os links externos, mas não aqueles que apontam para o seu site:

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

Ou desabilite os links para arquivos pdf de um site específico:

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

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

Suporte do navegador

Os seletores de atributos são suportados desde o IE7. :not()seletor desde o IE9.

Creaforge
fonte
Como desabilito um link usando o seletor desabilitado? por exemplo, <a class="test" desativado href="3"> test </a> a: desativado {cursor: não permitido; }
ecasper 27/08/18
10

Uma maneira de fazer isso com CSS seria definir um CSS em uma embalagem div que você definir para desaparecer e algo mais acontecer.

Por exemplo:

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

Com um CSS como

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

Para realmente desativar o, avocê precisará substituir o evento click ouhref , , conforme descrito por outras pessoas.

PS: Apenas para esclarecer, consideraria essa uma solução bastante desarrumada, e para o SEO também não é a melhor, mas acredito que seja a melhor com CSS puramente.

fyjham
fonte
8

Tente o seguinte:

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

A propriedade pointer-events permite controlar como os elementos HTML respondem a eventos de mouse / touch - incluindo estados ativos / pairar em CSS, eventos de clique / toque em Javascript e se o cursor está ou não visível.

Essa não é a única maneira de desativar um Link , mas uma boa maneira de CSS que funciona no IE10 + e em todos os novos navegadores:

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

Alireza
fonte
4

Eu procurei na internet e não achei melhor do que isso . Basicamente, para desativar a funcionalidade de clique no botão, basta adicionar o estilo CSS usando o jQuery da seguinte forma:

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

Em seguida, para habilitá-lo novamente, faça isso

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

Verificado no Firefox e IE 11, funcionou.

Faisal Mq
fonte
3
Você não precisa do jQuery para isso, você mesmo pode definir isso no CSS.
Bram Vanroy 15/04
3

você pode usar este 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>

javad shariaty
fonte
2

Obrigado a todos que publicaram soluções, combinei várias abordagens para fornecer disabledfuncionalidades mais avançadas . Aqui está uma essência , e o código está abaixo.

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()

Aqui está a classe coffescript:

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
Kross
fonte
Olá !!, a resposta é sobre CSSnão JSou mais nada!
Mehdi Dehghani
1

Você também pode dimensionar outro elemento para que ele cubra os links (usando o z-index correto): Isso "consumirá" os cliques.

(Descobrimos isso acidentalmente porque tivemos um problema com links inativos repentinamente devido ao design "responsivo", causando um H2 para cobri-los quando a janela do navegador era do tamanho móvel.)

Tor Iver Wilhelmsen
fonte
Verdadeiro, mas não para navegação no teclado.
precisa saber é o seguinte
1

Demonstração aqui
Experimente esta

$('html').on('click', 'a.Link', function(event){
    event.preventDefault();
});
Suresh Pattu
fonte
1
Seu violino não funciona! O link ainda está ativo no Chrome.
Matt Byrne
Para corrigir esse código, troque os dois primeiros parâmetros passados ​​para on (): $ ('html'). On ('clique', 'a.Link', função (evento) {event.preventDefault ();});
2C-B
1
Olá !!, a resposta é sobre CSSnão JSou mais nada!
Mehdi Dehghani
0

Outro truque é colocar um elemento invisível acima dele. Isso desativará qualquer efeito de foco também

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

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

É possível fazer isso em CSS

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

Veja em:

Observe que o text-decoration: none;e color: black;não é necessário, mas faz com que o link pareça mais com texto simples.


fonte
-1

pointer-events:none desativará o link:

.disabled {
       pointer-events:none;
}
<a href="#" class="disabled">link</a>
Nikki
fonte
1
Isso é bom, mas é claro, não funciona se os usuários usa seu teclado :(
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>

Rudra
fonte
2
A tag <a> não possui um atributo desativado.
Hexodus 23/01/19