¿Hay alguna forma de deshabilitar un enlace usando CSS?
Tengo una clase llamada current-pagey quiero que los enlaces con esta clase se deshabiliten para que no se produzca ninguna acción cuando se hace clic en ellos.
Si un enlace se debe usar o no tiene más valor semántico que de presentación. No debe deshabilitarse mediante CSS, sino mediante la utilización del hiddenatributo que sea aplicable a cualquier elemento HTML. CSS se puede utilizar para seleccionar, por ejemplo, el a[hidden]ancla y aplicarle el estilo correspondiente.
amn
@amn pero no creo que los navegadores muestren un elemento con el atributo oculto, por lo que el estilo se vuelve discutible.
user1794469
1
@ user1794469 Lo harán si les indica que, con CSS, usen display: block, por ejemplo, o algún otro valor para display. Pero hiddenno siempre es aplicable: es para elementos que son irrelevantes y, a partir de la pregunta, no está claro por qué el enlace debe deshabilitarse. Este es probablemente un caso de problema XY.
amn
Respuestas:
1348
La respuesta ya está en los comentarios de la pregunta. Para mayor visibilidad, estoy copiando esta solución aquí:
Advertencia: El uso de pointer-eventsCSS para elementos que no son SVG es experimental. La característica solía ser parte de la especificación borrador de CSS UI pero, debido a muchos problemas abiertos, se ha pospuesto a CSS4.
Además, esto no evita tabular el enlace y luego ingresar.
Jono
44
Si lo desea un poco, para que el usuario pueda ver que está deshabilitado. Déle algo de opacidad: .2
DNRN
44
Esto ahora funciona en todos los navegadores modernos, incluido IE 11. Si necesita soporte para IE 10 y versiones inferiores, puede usar un polyfill de JavaScript como este .
Keavon
26
Nota importante: Esto solo deshabilita los clics, no el enlace en sí. Todavía puede usar tab + enter para "hacer clic" en el enlace.
Pikamander2
11
El uso de pointer-events: none;no es perfecto. También deshabilita otros eventos, como el desplazamiento, que se requiere para mostrar title="…"o información sobre herramientas. Encontré que la solución JS es mejor (usando event.preventDefault();) junto con algunos CSS ( cursor: default; opacity: 0.4;) y una información sobre herramientas que explica por qué el enlace está deshabilitado.
Por estilo, intente cambiar pointer-events:none;a pointer-events:unset;. Luego, el cursor se puede cambiar a cursor:not-allowed;. Esto da una mejor pista de lo que le está sucediendo al usuario. Parece funcionar en FF, Edge, Chrome, Opera y Brave a partir de hoy.
Sablefoste
@Sablefoste Eso no funciona para mí en Chrome 60. El cursor sí not-allowed, pero el enlace sigue siendo cliqueable.
soupdog
122
CSS solo se puede usar para cambiar el estilo de algo. Lo mejor que probablemente podría hacer con CSS puro es ocultar el enlace por completo.
Lo que realmente necesitas es un poco de JavaScript. Así es como haría lo que quisiera usando la biblioteca jQuery.
No se olvide de la prevención de comportamientos predeterminados: function(ev){ ev.preventDefault(); ev.stopPropagation(); return false;.
ldiqual
55
@Idiqual, return falsehace eso
nickf
1
return falsesolo funciona si la acción se establece usando el hrefatributo
Justin
Además, esta versión se puede utilizar para deshabilitar los clics y mantener otros eventos de puntero como: hover o: focus! ¡La mejor respuesta!
Charlie Tupman
Aunque esto funciona en todos los navegadores, solo deshabilitó hacer clic en un enlace. Tenga en cuenta que muchos usuarios se utilizan para abrir enlaces desde el menú contextual o mediante el botón central del mouse.
Alexandru Severin
33
CSS no puede hacer eso. CSS es solo para presentación. Sus opciones son:
No incluya el hrefatributo en sus <a>etiquetas.
Use JavaScript para encontrar los elementos de anclaje con eso classy elimine sus atributos hrefo sus onclickatributos en consecuencia. jQuery te ayudaría con eso (NickF mostró cómo hacer algo similar pero mejor).
Esa no es la respuesta correcta: eventos de puntero: ninguno; css puede deshabilitarlo.
pie6k
¡No pensé en eso! ¿O tal vez el atributo aún no existía en 2010? En cualquier caso, es cierto que pointer-events: nonepuede deshabilitar los eventos del mouse. Sin embargo, no deshabilita el enlace subyacente. En una prueba que probé en Chrome 81, todavía puedo activar dicho enlace al presionarlo y escribir la tecla de retorno.
@nickf true, sin embargo, esta es una solución ordenada y es mejor que confiar en el mal estilo predeterminado de IE cuando está configurado como deshabilitado.
Para desactivarlo a, tendrá que reemplazar su evento de clic o href, según lo descrito por otros.
PD: Solo para aclarar, consideraría que esta es una solución bastante desordenada, y para SEO tampoco es la mejor, pero creo que es la mejor con CSS puro.
La propiedad de eventos de puntero permite controlar cómo los elementos HTML responden a los eventos de mouse / touch, incluidos los elementos activos / activadores de CSS, los eventos de clic / toque en Javascript y si el cursor está visible o no.
Esa no es la única forma de deshabilitar un enlace , sino una buena forma de CSS que funciona en IE10 + y todos los navegadores nuevos:
.current-page {pointer-events: none;color: grey;}
<ahref="#"class="current-page">This link is disabled</a>
Busqué en internet y no encontré nada mejor que esto . Básicamente para deshabilitar la funcionalidad de hacer clic en el botón, simplemente agregue estilo CSS usando jQuery de esta manera:
Gracias a todos los que publicaron soluciones, combiné varios enfoques para proporcionar una disabledfuncionalidad más avanzada . Aquí hay una esencia , y el código está debajo.
This provides for multiple levels of defense so that Anchors marked as disable actually behave as such.Usingthis 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.Includethis css,as it is the first line of defense.This assumes the selector you useis'a.disabled'
a.disabled {
pointer-events: none;
cursor:default;}2.Next, instantiate thisclass such as(with optional selector):
$ ->newAnchorDisabler()
Aquí está la clase coffescript:
classAnchorDisablerconstructor:(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)returntrueif target.hasClass('disabled')returntrueif target.attr('disabled')is'disabled'returnfalse
onFocus:(ev)=>### if an attempt is made to focus on a disabled element, just move it along to the next focusable one. ###returnunless@isStillDisabled(ev)
focusables = $(':focusable')returnunless focusables
current = focusables.index(ev.target)next=(if focusables.eq(current +1).length then focusables.eq(current +1)else focusables.eq(0))next.focus()ifnext
onClick:(ev)=># disabled could be dynamically removedreturnunless@isStillDisabled(ev)
ev.preventDefault()returnfalse
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
returnunless code is13# disabled could be dynamically removedreturnunless@isStillDisabled(ev)
ev.preventDefault()returnfalse
Hola !!, la respuesta es sobre CSSno JSo cualquier otra cosa!
Mehdi Dehghani
1
También puede cambiar el tamaño de otro elemento para que cubra los enlaces (usando el índice z correcto): Eso "comerá" los clics.
(Descubrimos esto por accidente porque tuvimos un problema con los enlaces repentinamente inactivos debido a un diseño "sensible" que causó que un H2 los cubriera cuando la ventana del navegador era de tamaño móvil).
¡Tu violín no funciona! El enlace aún está activo en Chrome.
Matt Byrne el
Para corregir este código, intercambie los dos primeros parámetros pasados a on (): $ ('html'). On ('click', 'a.Link', function (event) {event.preventDefault ();});
2C-B
1
Hola !!, la respuesta es sobre CSSno JSo cualquier otra cosa!
Mehdi Dehghani
0
Otro truco es colocar un elemento invisible encima de él. Esto deshabilitará cualquier efecto de desplazamiento también
hidden
atributo que sea aplicable a cualquier elemento HTML. CSS se puede utilizar para seleccionar, por ejemplo, ela[hidden]
ancla y aplicarle el estilo correspondiente.display: block
, por ejemplo, o algún otro valor paradisplay
. Perohidden
no siempre es aplicable: es para elementos que son irrelevantes y, a partir de la pregunta, no está claro por qué el enlace debe deshabilitarse. Este es probablemente un caso de problema XY.Respuestas:
La respuesta ya está en los comentarios de la pregunta. Para mayor visibilidad, estoy copiando esta solución aquí:
Para soporte del navegador, consulte https://caniuse.com/#feat=pointer-events . Si necesita admitir IE, hay una solución alternativa; ver esta respuesta .
Advertencia: El uso de
pointer-events
CSS para elementos que no son SVG es experimental. La característica solía ser parte de la especificación borrador de CSS UI pero, debido a muchos problemas abiertos, se ha pospuesto a CSS4.fuente
pointer-events: none;
no es perfecto. También deshabilita otros eventos, como el desplazamiento, que se requiere para mostrartitle="…"
o información sobre herramientas. Encontré que la solución JS es mejor (usandoevent.preventDefault();
) junto con algunos CSS (cursor: default; opacity: 0.4;
) y una información sobre herramientas que explica por qué el enlace está deshabilitado.fuente
pointer-events:none;
apointer-events:unset;
. Luego, el cursor se puede cambiar acursor:not-allowed;
. Esto da una mejor pista de lo que le está sucediendo al usuario. Parece funcionar en FF, Edge, Chrome, Opera y Brave a partir de hoy.not-allowed
, pero el enlace sigue siendo cliqueable.CSS solo se puede usar para cambiar el estilo de algo. Lo mejor que probablemente podría hacer con CSS puro es ocultar el enlace por completo.
Lo que realmente necesitas es un poco de JavaScript. Así es como haría lo que quisiera usando la biblioteca jQuery.
fuente
function(ev){ ev.preventDefault(); ev.stopPropagation(); return false;
.return false
hace esoreturn false
solo funciona si la acción se establece usando elhref
atributoCSS no puede hacer eso. CSS es solo para presentación. Sus opciones son:
href
atributo en sus<a>
etiquetas.class
y elimine sus atributoshref
o susonclick
atributos en consecuencia. jQuery te ayudaría con eso (NickF mostró cómo hacer algo similar pero mejor).fuente
pointer-events: none
puede deshabilitar los eventos del mouse. Sin embargo, no deshabilita el enlace subyacente. En una prueba que probé en Chrome 81, todavía puedo activar dicho enlace al presionarlo y escribir la tecla de retorno.Enlace deshabilitado Bootstrap
Botón de Bootstrap deshabilitado pero parece un enlace
fuente
Puede establecer el
href
atributo enjavascript:void(0)
fuente
Solía:
Y no fue suficiente; en algunos navegadores todavía mostraba el enlace, parpadeando.
Tuve que agregar:
fuente
a[disabled]:active { pointer-events: none !important; }
es mejorSi desea apegarse solo a HTML / CSS en un formulario, otra opción es usar un botón. Dale estilo y establece el
disabled
atributo.Por ejemplo, http://jsfiddle.net/cFTxH/1/
fuente
Si desea que sea solo CSS, la lógica de desactivación debe definirse mediante CSS.
Para mover la lógica en las definiciones CSS, deberá usar selectores de atributos. Aquí hay unos ejemplos :
Deshabilite el enlace que tiene un href exacto:
=
Puede optar por desactivar los enlaces que contienen un valor href específico de esta manera:
Deshabilite un enlace que contiene un fragmento de ruta:
*=
Aquí, cualquier enlace que contenga
/keyword/
en la ruta será deshabilitadoDeshabilite un enlace que comienza con:
^=
el
[attribute^=value]
operador apunta a un atributo que comienza con un valor específico. Le permite descartar sitios web y rutas raíz.Incluso puede usarlo para deshabilitar enlaces que no sean https. Por ejemplo :
Deshabilite un enlace que termina con:
$=
El
[attribute$=value]
operador apunta a un atributo que termina con un valor específico. Puede ser útil para descartar extensiones de archivo.O cualquier otro atributo
Css puede apuntar a cualquier atributo HTML. Podría ser
rel
,target
,data-custom
y así sucesivamente ...Combinación de selectores de atributos
Puedes encadenar múltiples reglas. Supongamos que desea deshabilitar todos los enlaces externos, pero no aquellos que apuntan a su sitio web:
O deshabilite los enlaces a archivos pdf de un sitio web específico:
Soporte del navegador
Los selectores de atributos son compatibles desde IE7.
:not()
selector desde IE9.fuente
Una forma de hacer esto con CSS sería establecer un CSS en una envoltura
div
que configuras para desaparecer y algo más toma su lugar.P.ej:
Con un CSS como
Para desactivarlo
a
, tendrá que reemplazar su evento de clic ohref
, según lo descrito por otros.PD: Solo para aclarar, consideraría que esta es una solución bastante desordenada, y para SEO tampoco es la mejor, pero creo que es la mejor con CSS puro.
fuente
Prueba esto:
fuente
Esa no es la única forma de deshabilitar un enlace , sino una buena forma de CSS que funciona en IE10 + y todos los navegadores nuevos:
fuente
Busqué en internet y no encontré nada mejor que esto . Básicamente para deshabilitar la funcionalidad de hacer clic en el botón, simplemente agregue estilo CSS usando jQuery de esta manera:
Luego, para habilitarlo nuevamente, haga esto
Comprobado en Firefox e IE 11, funcionó.
fuente
puedes usar este css:
fuente
Gracias a todos los que publicaron soluciones, combiné varios enfoques para proporcionar una
disabled
funcionalidad más avanzada . Aquí hay una esencia , y el código está debajo.Aquí está la clase coffescript:
fuente
CSS
noJS
o cualquier otra cosa!También puede cambiar el tamaño de otro elemento para que cubra los enlaces (usando el índice z correcto): Eso "comerá" los clics.
(Descubrimos esto por accidente porque tuvimos un problema con los enlaces repentinamente inactivos debido a un diseño "sensible" que causó que un H2 los cubriera cuando la ventana del navegador era de tamaño móvil).
fuente
Demo aquí
Prueba este
fuente
CSS
noJS
o cualquier otra cosa!Otro truco es colocar un elemento invisible encima de él. Esto deshabilitará cualquier efecto de desplazamiento también
fuente
Es posible hacerlo en CSS
Ver en:
Tenga en cuenta que
text-decoration: none;
ycolor: black;
no es necesario, pero hace que el enlace se parezca más a texto sin formato.fuente
pointer-events:none
deshabilitará el enlace:fuente
fuente