Comment désactiver un lien en utilisant uniquement CSS?
844
Existe-t-il un moyen de désactiver un lien en utilisant CSS?
J'ai une classe appelée current-pageet je souhaite que les liens avec cette classe soient désactivés afin qu'aucune action ne se produise lorsqu'ils sont cliqués.
L'utilisation ou non d'un lien est plus sémantique que la valeur de présentation. Il ne doit pas être désactivé via CSS, mais en utilisant l' hiddenattribut applicable à tout élément HTML. CSS peut ensuite être utilisé pour sélectionner par exemple l' a[hidden]ancre et la styliser en conséquence.
amn
@amn mais je ne pense pas que les navigateurs afficheront un élément avec l'attribut caché, donc le style devient théorique.
user1794469
1
@ user1794469 Ils le feront si vous leur demandez, avec CSS, d'utiliser display: block, par exemple, ou une autre valeur pour display. Mais hiddenn'est pas toujours applicable - c'est pour les éléments qui ne sont pas pertinents , et de la question, il n'est pas clair pourquoi le lien doit être désactivé. C'est probablement un cas de problème XY.
amn
Réponses:
1348
La réponse est déjà dans les commentaires de la question. Pour plus de visibilité, je copie cette solution ici:
Avertissement: L'utilisation de pointer-eventsen CSS pour les éléments non-SVG est expérimentale. La fonctionnalité faisait auparavant partie du projet de spécification de l'interface utilisateur CSS3 mais, en raison de nombreux problèmes ouverts, a été reportée à CSS4.
En outre, cela n'évite pas de tabuler le lien, puis entrez.
Jono
4
Si vous le stylisez un peu, l'utilisateur peut voir qu'il est désactivé. Donnez-lui une certaine opacité: .2
DNRN
4
Cela fonctionne maintenant dans tous les navigateurs modernes, y compris IE 11. Si vous avez besoin de prise en charge pour IE 10 et versions antérieures, vous pouvez utiliser un polyfill JavaScript comme celui-ci .
Keavon
26
Remarque importante: cela ne désactive que le clic, pas le lien lui-même. Vous pouvez toujours utiliser tabulation + entrée pour "cliquer" sur le lien.
Pikamander2
11
L'utilisation de pointer-events: none;n'est pas parfaite. Il désactive également d'autres événements tels que le survol, qui est requis pour l'affichage title="…"ou les info-bulles. J'ai trouvé que la solution JS est meilleure (en utilisant event.preventDefault();) avec du CSS ( cursor: default; opacity: 0.4;) et une info-bulle expliquant pourquoi le lien est désactivé.
Pour le style, essayez de changer pointer-events:none;pour pointer-events:unset;. Ensuite, le curseur peut être changé en cursor:not-allowed;. Cela donne une meilleure idée de ce qui se passe pour l'utilisateur. Semble fonctionner dans FF, Edge, Chrome, Opera et Brave à partir d'aujourd'hui.
Sablefoste
@Sablefoste Cela ne fonctionne pas pour moi dans Chrome 60. Le curseur est en effet not-allowed, mais le lien reste cliquable.
soupdog
122
CSS ne peut être utilisé que pour changer le style de quelque chose. Le mieux que vous puissiez probablement faire avec du CSS pur est de masquer complètement le lien.
Ce dont vous avez vraiment besoin, c'est de javascript. Voici comment vous feriez ce que vous voulez en utilisant la bibliothèque jQuery.
Ne pas oublier la prévention des comportements par défaut: function(ev){ ev.preventDefault(); ev.stopPropagation(); return false;.
ldiqual
5
@Idiqual, return falsefait ça
nickf
1
return falsene fonctionne que si l'action est définie à l'aide de l' hrefattribut
Justin
Cette version peut également être utilisée pour désactiver les clics tout en conservant d'autres événements de pointeur comme: hover ou: focus! Meilleure réponse!
Charlie Tupman
Bien que cela fonctionne dans tous les navigateurs, il a seulement désactivé de cliquer sur un lien. Gardez à l'esprit que de nombreux utilisateurs sont habitués à ouvrir des liens à partir du menu contextuel ou en utilisant le bouton central de la souris.
Alexandru Severin
33
CSS ne peut pas faire ça. CSS est pour la présentation seulement. Vos options sont:
N'incluez pas l' hrefattribut dans vos <a>balises.
Utilisez JavaScript pour trouver les éléments d'ancrage avec cela classet supprimez leur hrefou leurs onclickattributs en conséquence. jQuery vous aiderait avec cela (NickF a montré comment faire quelque chose de similaire mais mieux).
Ce n'est pas la bonne réponse - événements-pointeurs: aucun; css peut le désactiver.
pie6k
Je n'y ai pas pensé! Ou peut-être que l'attribut n'existait pas encore en 2010? Dans tous les cas, il est vrai que cela pointer-events: nonepeut désactiver les événements de la souris. Cependant, il ne désactive pas le lien sous-jacent. Dans un test que j'ai essayé dans Chrome 81, je peux toujours activer un tel lien en le tabulant et en tapant la touche retour.
@nickf true, cependant, c'est une solution intéressante et vaut mieux que de s'appuyer sur le mauvais style IE par défaut lorsqu'il est défini sur désactivé.
Je pense que a[disabled]:active { pointer-events: none !important; }c'est mieux.
Masamoto Miyata
10
Si vous souhaitez vous limiter à HTML / CSS sur un formulaire, une autre option consiste à utiliser un bouton. Stylisez-le et définissez l' disabledattribut.
Désactivez un lien contenant un morceau de chemin: *=
Ici, tout lien contenant /keyword/dans path sera désactivé
<ahref="//website.com/keyword/in/path">Contains in path</a>
[href*="/keyword/"]{
pointer-events: none;
}
Désactivez un lien qui commence par: ^=
l' [attribute^=value]opérateur cible un attribut qui commence par une valeur spécifique. Vous permet de supprimer les sites Web et les chemins d'accès racine.
<ahref="//website.com/begins/with/path">Begins with path</a>
[href^="//website.com/begins/with"]{
pointer-events: none;
}
Vous pouvez même l'utiliser pour désactiver les liens non https. Par exemple :
a:not([href^="https://"]){
pointer-events: none;}
Désactivez un lien qui se termine par: $=
L' [attribute$=value]opérateur cible un attribut qui se termine par une valeur spécifique. Il peut être utile de supprimer les extensions de fichier.
<ahref="/path/to/file.pdf">Link to pdf</a>
[href$=".pdf"]{
pointer-events: none;
}
Ou tout autre attribut
Css peut cibler n'importe quel attribut HTML. Peut - être rel, target, data-customet ainsi de suite ...
Comment désactiver un lien à l'aide du sélecteur désactivé? par exemple <a class="test" désactivé href="3"> test </a> a: désactivé {curseur: non autorisé; }
ecasper
10
Une façon de le faire avec CSS, serait de définir un CSS sur un habillage divque vous définissez pour disparaître et quelque chose d'autre prend sa place.
Pour désactiver réellement le, avous devrez remplacer son événement de clic ou href, comme décrit par d'autres.
PS: Juste pour clarifier, je considérerais cela comme une solution assez désordonnée, et pour le référencement ce n'est pas le meilleur non plus, mais je pense que c'est le meilleur avec purement CSS.
La propriété pointer-events permet de contrôler la façon dont les éléments HTML réagissent aux événements souris / tactiles - y compris les états CSS de vol stationnaire / actif, les événements clic / tapotement en Javascript, et si le curseur est visible ou non.
Ce n'est pas la seule façon de désactiver un lien , mais une bonne façon CSS qui fonctionne dans IE10 + et tous les nouveaux navigateurs:
.current-page {pointer-events: none;color: grey;}
<ahref="#"class="current-page">This link is disabled</a>
J'ai cherché sur Internet et a trouvé pas mieux que cela . Fondamentalement, pour désactiver la fonctionnalité de clic de bouton, ajoutez simplement un style CSS à l'aide de jQuery comme ceci:
Merci à tous ceux qui ont publié des solutions, j'ai combiné plusieurs approches pour fournir des disabledfonctionnalités plus avancées . Voici un résumé , et le code est ci-dessous.
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()
Voici la classe 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
Bonjour !!, la réponse CSSne concerne pas JSou autre chose!
Mehdi Dehghani
1
Vous pouvez également dimensionner un autre élément pour qu'il couvre les liens (en utilisant le bon z-index): cela "mangera" les clics.
(Nous avons découvert cela par accident parce que nous avions un problème avec des liens soudainement inactifs en raison d'une conception "réactive" qui faisait que H2 les couvrait lorsque la fenêtre du navigateur était de taille mobile.)
Votre violon ne fonctionne pas! Le lien est toujours actif dans Chrome.
Matt Byrne
Pour corriger ce code, permutez les deux premiers paramètres passés à on (): $ ('html'). On ('click', 'a.Link', function (event) {event.preventDefault ();});
2C-B
1
Bonjour !!, la réponse CSSne concerne pas JSou autre chose!
Mehdi Dehghani
0
Une autre astuce consiste à placer un élément invisible au-dessus. Cela désactivera également les effets de survol
hidden
attribut applicable à tout élément HTML. CSS peut ensuite être utilisé pour sélectionner par exemple l'a[hidden]
ancre et la styliser en conséquence.display: block
, par exemple, ou une autre valeur pourdisplay
. Maishidden
n'est pas toujours applicable - c'est pour les éléments qui ne sont pas pertinents , et de la question, il n'est pas clair pourquoi le lien doit être désactivé. C'est probablement un cas de problème XY.Réponses:
La réponse est déjà dans les commentaires de la question. Pour plus de visibilité, je copie cette solution ici:
Pour la prise en charge du navigateur, veuillez consulter https://caniuse.com/#feat=pointer-events . Si vous devez prendre en charge IE, il existe une solution de contournement; voir cette réponse .
Avertissement: L'utilisation de
pointer-events
en CSS pour les éléments non-SVG est expérimentale. La fonctionnalité faisait auparavant partie du projet de spécification de l'interface utilisateur CSS3 mais, en raison de nombreux problèmes ouverts, a été reportée à CSS4.la source
pointer-events: none;
n'est pas parfaite. Il désactive également d'autres événements tels que le survol, qui est requis pour l'affichagetitle="…"
ou les info-bulles. J'ai trouvé que la solution JS est meilleure (en utilisantevent.preventDefault();
) avec du CSS (cursor: default; opacity: 0.4;
) et une info-bulle expliquant pourquoi le lien est désactivé.la source
pointer-events:none;
pourpointer-events:unset;
. Ensuite, le curseur peut être changé encursor:not-allowed;
. Cela donne une meilleure idée de ce qui se passe pour l'utilisateur. Semble fonctionner dans FF, Edge, Chrome, Opera et Brave à partir d'aujourd'hui.not-allowed
, mais le lien reste cliquable.CSS ne peut être utilisé que pour changer le style de quelque chose. Le mieux que vous puissiez probablement faire avec du CSS pur est de masquer complètement le lien.
Ce dont vous avez vraiment besoin, c'est de javascript. Voici comment vous feriez ce que vous voulez en utilisant la bibliothèque jQuery.
la source
function(ev){ ev.preventDefault(); ev.stopPropagation(); return false;
.return false
fait çareturn false
ne fonctionne que si l'action est définie à l'aide de l'href
attributCSS ne peut pas faire ça. CSS est pour la présentation seulement. Vos options sont:
href
attribut dans vos<a>
balises.class
et supprimez leurhref
ou leursonclick
attributs en conséquence. jQuery vous aiderait avec cela (NickF a montré comment faire quelque chose de similaire mais mieux).la source
pointer-events: none
peut désactiver les événements de la souris. Cependant, il ne désactive pas le lien sous-jacent. Dans un test que j'ai essayé dans Chrome 81, je peux toujours activer un tel lien en le tabulant et en tapant la touche retour.Lien Bootstrap désactivé
Bouton Bootstrap désactivé mais il ressemble à un lien
la source
Vous pouvez définir l'
href
attribut surjavascript:void(0)
la source
J'ai utilisé:
Et ce n'était pas suffisant; dans certains navigateurs, le lien était toujours affiché, clignotant.
J'ai dû ajouter:
la source
a[disabled]:active { pointer-events: none !important; }
c'est mieux.Si vous souhaitez vous limiter à HTML / CSS sur un formulaire, une autre option consiste à utiliser un bouton. Stylisez-le et définissez l'
disabled
attribut.Par exemple http://jsfiddle.net/cFTxH/1/
la source
Si vous souhaitez que ce soit uniquement CSS, la logique de désactivation doit être définie par CSS.
Pour déplacer la logique dans les définitions CSS, vous devrez utiliser des sélecteurs d'attributs. Voici quelques exemples :
Désactivez le lien qui a une href exacte:
=
Vous pouvez choisir de désactiver les liens qui contiennent une valeur href spécifique comme ceci:
Désactivez un lien contenant un morceau de chemin:
*=
Ici, tout lien contenant
/keyword/
dans path sera désactivéDésactivez un lien qui commence par:
^=
l'
[attribute^=value]
opérateur cible un attribut qui commence par une valeur spécifique. Vous permet de supprimer les sites Web et les chemins d'accès racine.Vous pouvez même l'utiliser pour désactiver les liens non https. Par exemple :
Désactivez un lien qui se termine par:
$=
L'
[attribute$=value]
opérateur cible un attribut qui se termine par une valeur spécifique. Il peut être utile de supprimer les extensions de fichier.Ou tout autre attribut
Css peut cibler n'importe quel attribut HTML. Peut - être
rel
,target
,data-custom
et ainsi de suite ...Combinaison de sélecteurs d'attributs
Vous pouvez enchaîner plusieurs règles. Disons que vous souhaitez désactiver tous les liens externes, mais pas ceux qui pointent vers votre site Web:
Ou désactivez les liens vers les fichiers pdf d'un site Web spécifique:
Prise en charge du navigateur
Les sélecteurs d'attributs sont pris en charge depuis IE7.
:not()
sélecteur depuis IE9.la source
Une façon de le faire avec CSS, serait de définir un CSS sur un habillage
div
que vous définissez pour disparaître et quelque chose d'autre prend sa place.Par exemple:
Avec un CSS comme
Pour désactiver réellement le,
a
vous devrez remplacer son événement de clic ouhref
, comme décrit par d'autres.PS: Juste pour clarifier, je considérerais cela comme une solution assez désordonnée, et pour le référencement ce n'est pas le meilleur non plus, mais je pense que c'est le meilleur avec purement CSS.
la source
Essaye ça:
la source
Ce n'est pas la seule façon de désactiver un lien , mais une bonne façon CSS qui fonctionne dans IE10 + et tous les nouveaux navigateurs:
la source
J'ai cherché sur Internet et a trouvé pas mieux que cela . Fondamentalement, pour désactiver la fonctionnalité de clic de bouton, ajoutez simplement un style CSS à l'aide de jQuery comme ceci:
Ensuite, pour le réactiver, procédez comme suit
Vérifié sur Firefox et IE 11, cela a fonctionné.
la source
vous pouvez utiliser ce css:
la source
Merci à tous ceux qui ont publié des solutions, j'ai combiné plusieurs approches pour fournir des
disabled
fonctionnalités plus avancées . Voici un résumé , et le code est ci-dessous.Voici la classe coffescript:
la source
CSS
ne concerne pasJS
ou autre chose!Vous pouvez également dimensionner un autre élément pour qu'il couvre les liens (en utilisant le bon z-index): cela "mangera" les clics.
(Nous avons découvert cela par accident parce que nous avions un problème avec des liens soudainement inactifs en raison d'une conception "réactive" qui faisait que H2 les couvrait lorsque la fenêtre du navigateur était de taille mobile.)
la source
Démo ici
Essayez celui-ci
la source
CSS
ne concerne pasJS
ou autre chose!Une autre astuce consiste à placer un élément invisible au-dessus. Cela désactivera également les effets de survol
la source
Il est possible de le faire en CSS
Voir sur:
Veuillez noter que le
text-decoration: none;
etcolor: black;
n'est pas nécessaire, mais il fait ressembler davantage le lien au texte brut.la source
pointer-events:none
désactivera le lien:la source
la source