Come disabilitare un collegamento usando solo CSS?


844

Esiste un modo per disabilitare un collegamento tramite CSS?

Ho una classe chiamata current-pagee voglio che i collegamenti con questa classe siano disabilitati in modo che non si verifichino azioni quando vengono cliccati.


42
dopo un sacco di ricerche su google ho ottenuto la risposta perfetta a questa domanda css-tricks.com/pointer-events-current-nav
RSK

1
Se un collegamento deve essere utilizzato o meno ha un valore più semantico rispetto al valore di presentazione. Non deve essere disabilitato tramite CSS, ma utilizzando l' hiddenattributo applicabile a qualsiasi elemento HTML. Quindi è possibile utilizzare CSS per selezionare, ad esempio, l' a[hidden]ancoraggio e adattarlo di conseguenza.
am

@amn ma non credo che i browser mostreranno un elemento con l'attributo nascosto in modo che lo stile diventi discutibile.
user1794469,

1
@ user1794469 Lo faranno se li istruisci a, con CSS, usando display: block, per esempio o qualche altro valore per display. Ma hiddennon è sempre applicabile: è per elementi irrilevanti e dalla domanda non è chiaro perché il collegamento debba essere disabilitato. Questo è probabilmente un caso di problema XY.
AMN

Risposte:


1348

La risposta è già nei commenti della domanda. Per maggiore visibilità, sto copiando questa soluzione qui:

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

Per il supporto del browser, consultare https://caniuse.com/#feat=pointer-events . Se è necessario supportare IE, esiste una soluzione alternativa; vedi questa risposta .

Avvertenza: l'uso di pointer-eventsCSS per elementi non SVG è sperimentale. La funzione faceva parte della bozza delle specifiche dell'interfaccia utente CSS3 ma, a causa di molti problemi aperti, è stata rinviata a CSS4.


36
Inoltre, questo non evita la tabulazione del collegamento, quindi entra.
Jono,

4
Se lo modifichi un po ', in questo modo l'utente può vedere che è disabilitato. Dagli un po 'di opacità: .2
DNRN

4
Ora funziona con tutti i browser moderni, incluso IE 11. Se hai bisogno di supporto per IE 10 e versioni precedenti, puoi usare un polyfill JavaScript come questo .
Keavon,

26
Nota importante: questo disabilita solo il clic, non il collegamento vero e proprio. Puoi comunque usare tab + Invio per "fare clic" sul link.
Pikamander2,

11
L'uso di pointer-events: none;non è perfetto. Disabilita anche altri eventi come il passaggio del mouse, necessario per la visualizzazione title="…"o i suggerimenti. Ho scoperto che la soluzione JS è migliore (utilizzando event.preventDefault();) insieme ad alcuni CSS ( cursor: default; opacity: 0.4;) e una descrizione comandi che spiega perché il collegamento è disabilitato.
Quinn Comendant,

140

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


Potrebbe essere necessario impostare il display inline-block (o qualcosa di diverso da inline).
dev_masta,

bello, ma attenzione al supporto del browser eventi puntatore (es. <IE11): caniuse.com/#search=pointer-events
a darren

1
Per stile, prova a cambiare pointer-events:none;inpointer-events:unset; . Quindi, il cursore può essere modificato in cursor:not-allowed;. Ciò fornisce una migliore idea di ciò che sta succedendo all'utente. Sembra funzionare oggi in FF, Edge, Chrome, Opera e Brave.
Sablefoste,

@Sablefoste Questo non funziona per me in Chrome 60. Il cursore è effettivamente not-allowed, ma il collegamento rimane cliccabile.
soupdog,

122

I CSS possono essere usati solo per cambiare lo stile di qualcosa. Il meglio che probabilmente potresti fare con CSS puro è nascondere del tutto il link.

Ciò di cui hai veramente bisogno è un po 'di javascript. Ecco come faresti quello che vuoi usando la libreria jQuery.

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

21
Non dimenticare prevenire comportamenti predefiniti: function(ev){ ev.preventDefault(); ev.stopPropagation(); return false;.
ldiqual,

5
@Idiqual, lo return falsefa
nickf

1
return falsefunziona solo se l'azione è impostata usando l' hrefattributo
Giustino il

Inoltre, questa versione può essere utilizzata per disabilitare i clic mantenendo altri eventi puntatore come: hover o: focus! Risposta migliore!
Charlie Tupman,

Sebbene funzioni in tutti i browser, ha disabilitato solo il clic su un collegamento. Tieni presente che molti utenti vengono utilizzati per aprire i collegamenti dal menu di scelta rapida o utilizzando il pulsante centrale del mouse.
Alexandru Severin,

33

CSS non può farlo. CSS è solo per presentazione. Le tue opzioni sono:

  • Non includere l' hrefattributo nel tuo<a> tag.
  • Usa JavaScript, per trovare gli elementi di ancoraggio con quello class, e rimuovi i loro hrefo onclickattributi di conseguenza. jQuery ti aiuterebbe in questo (NickF ha mostrato come fare qualcosa di simile ma migliore).

30
Non è una risposta corretta - pointer-events: none; css può disabilitarlo.
pie6k,

Non ci avevo pensato! O forse l'attributo non esisteva ancora nel 2010? In ogni caso è vero che pointer-events: nonepuò disabilitare gli eventi del mouse. Tuttavia, non disabilita il collegamento sottostante. In un test che ho provato in Chrome 81, posso ancora attivare un tale collegamento effettuando la tabulazione e digitando il tasto Invio.
Kevin Conner,

31

Link disabilitato Bootstrap

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

Pulsante Bootstrap disabilitato ma sembra un collegamento

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

19

È possibile impostare l' hrefattributo sujavascript:void(0)

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


2
@nickf true, tuttavia, questa è una soluzione accurata ed è meglio che fare affidamento sullo stile di default di IE predefinito quando impostato su disabilitato.
SausageFingers

Penso che potrebbe essere un po 'più complicato di così. Ecco una soluzione snook.ca/archives/javascript/clear_links_to_1
Mike Gifford,

12

Ero solito:

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

E non era abbastanza; in alcuni browser mostrava ancora il collegamento, lampeggiante.

Ho dovuto aggiungere:

.current-page a {
cursor: text !important;
}

3
Penso che a[disabled]:active { pointer-events: none !important; }sia meglio.
Masamoto Miyata,


10

Se si desidera che sia solo CSS, la logica di disabilitazione deve essere definita da CSS.

Per spostare la logica nelle definizioni CSS, dovrai usare i selettori di attributo. Ecco alcuni esempi :

Disabilita il link che ha un href esatto: =

Puoi scegliere di disabilitare i collegamenti che contengono un valore href specifico in questo modo:

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

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

Disabilita un collegamento che contiene un tratto di percorso: *=

Qui, qualsiasi collegamento contenente /keyword/nel percorso verrà disabilitato

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

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

Disabilita un collegamento che inizia con: ^=

l' [attribute^=value]operatore indirizza un attributo che inizia con un valore specifico. Ti consente di scartare siti Web e percorsi di root.

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

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

Puoi persino usarlo per disabilitare i collegamenti non https. Per esempio :

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

Disabilita un collegamento che termina con: $=

L' [attribute$=value]operatore indirizza un attributo che termina con un valore specifico. Può essere utile scartare le estensioni di file.

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

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

O qualsiasi altro attributo

Css può targetizzare qualsiasi attributo HTML. Potrebbe essere rel, target, data-custome così via ...

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

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

Combinazione di selettori di attributi

Puoi concatenare più regole. Supponiamo che tu voglia disabilitare tutti i link esterni, ma non quelli che rimandano al tuo sito web:

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

O disabilitare i collegamenti ai file pdf di un sito Web specifico:

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

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

Supporto per il browser

I selettori di attributi sono supportati da IE7. :not()selettore da IE9.


Come posso disabilitare un collegamento usando il selettore disabilitato? ad es. <a class="test" disabled href="3"> test </a> a: disabled {cursore: non consentito; }
ecasper

10

Un modo per farlo con i CSS sarebbe quello di impostare un CSS su un wrapping div che hai impostato per scomparire e qualcos'altro prende il suo posto.

Per esempio:

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

Con un CSS come

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

Per disattivare effettivamente aè necessario sostituire l'evento click ohref , come descritto da altri.

PS: Giusto per chiarire, la considero una soluzione abbastanza disordinata, e per la SEO non è neanche la migliore, ma credo che sia la migliore con puramente CSS.


8

Prova questo:

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

6

La proprietà pointer-events consente di controllare il modo in cui gli elementi HTML rispondono agli eventi del mouse / touch, inclusi gli stati di passaggio del mouse / stati CSS attivi, gli eventi click / tap in Javascript e la visibilità del cursore.

Ecco , non l'unico modo in cui si disattiva un collegamento , ma un modo buon CSS che lavorano in IE10 + e tutti i nuovi browser:

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


4

Ho cercato su internet e ho trovato meglio di questo . Fondamentalmente per disabilitare la funzionalità clic sui pulsanti, basta aggiungere lo stile CSS usando jQuery in questo modo:

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

Quindi per abilitarlo di nuovo, fallo

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

Controllato su Firefox e IE 11, ha funzionato.


3
Non hai bisogno di jQuery per questo, puoi impostarlo tu stesso nel CSS.
Bram Vanroy,

3

puoi usare questo 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

Grazie a tutti coloro che hanno pubblicato soluzioni, ho combinato diversi approcci per fornire alcune disabledfunzionalità più avanzate . Ecco un riassunto e il codice è sotto.

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

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

Ciao !!, la risposta riguarda CSSno JSo qualsiasi altra cosa!
Mehdi Dehghani,

1

Puoi anche ridimensionare un altro elemento in modo che copra i collegamenti (usando il giusto z-index): che "mangerà" i clic.

(L'abbiamo scoperto per caso perché abbiamo avuto un problema con collegamenti improvvisamente inattivi a causa del design "reattivo" che causava un H2 per coprirli quando la finestra del browser era mobile).


Vero, ma non per la navigazione da tastiera.
AndFisher,

1

Demo qui
Prova questo

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

1
Il tuo violino non funziona! Il collegamento è ancora attivo in Chrome.
Matt Byrne,

Per correggere questo codice, scambia i primi due parametri passati a on (): $ ('html'). On ('click', 'a.Link', function (event) {event.preventDefault ();});
2C-B

1
Ciao !!, la risposta riguarda CSSno JSo qualsiasi altra cosa!
Mehdi Dehghani,

0

Un altro trucco è posizionare un elemento invisibile sopra di esso. Questo disabiliterà anche qualsiasi effetto hover

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

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

-1

È possibile farlo in CSS

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

Vedi a:

Si noti che text-decoration: none;e color: black;non è necessario ma rende il collegamento più simile al testo normale.


-1

pointer-events:none disabiliterà il collegamento:

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

1
Questo va bene, ma ovviamente non funziona se gli utenti usano la tastiera :(
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
Il tag <a> non ha un attributo disabilitato.
Hexodus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.