Ajouter une propriété de curseur CSS lors de l'utilisation de "pointer-events: none"

95

J'essaie de désactiver un lien spécifique et d'appliquer le style de curseur, mais cette commande CSS cursor: text;n'aura aucun effet. Le curseur est toujours par défaut. J'utilise la dernière version de Firefox.

CSS:

pointer-events: none !important;
cursor: text;
color: Blue;
Dragut
la source
@PHPglue Deux choses: w3fools.com et ça ne marche vraiment pas, même quand c'est juste cet élément de la page: jsfiddle.net/brh9r8h6
melancia

Réponses:

121

L' utilisation pointer-events: noneva désactiver toutes les interactions de la souris avec cet élément. Si vous souhaitez modifier la cursorpropriété, vous devez appliquer les modifications à l'élément parent. Vous pouvez envelopper le lien avec un élément et y ajouter la cursorpropriété.

Exemple ici

HTML

<span class="wrapper">
    <a href="#">Some Link</a>
</span>

CSS

.wrapper {
    position: relative;
    cursor: text;  /* This is used */
}
.wrapper a {
    pointer-events: none;
}

Il y a cependant quelques incohérences dans le navigateur. Pour que cela fonctionne dans IE11, il semble que vous ayez besoin d'un pseudo élément. Le pseudo élément permet également de sélectionner le texte dans FF. Curieusement, vous pouvez sélectionner le texte dans Chrome sans lui.

Exemple mis à jour

.wrapper:after {
    content: '';
    position: absolute;
    width: 100%; height: 100%;
    top: 0; left: 0;
}
Josh Crozier
la source
votre code fonctionne à moins que je supprime ses balises parentes, mais il est dans <div><li> <span> et dans ce cas, il s'agit toujours du curseur par défaut
Dragut
@ user3721912 Voulez-vous donner un exemple? Ce serait utile.
Josh Crozier
oui c'est exactement ce que je veux dire, je veux dire que ma balise span reste non seule, elle a des parents <div> <li>, elle est entourée de balises <div> <li>
Dragut
23

C'est assez long depuis la question originale, mais c'est ma solution sans élément d'encapsulation et curseur sans événement de pointeur:

<!-- Add tabindex="-1" so that element cannot be reached by keyboard -->
<a href="url" class="disabled" tabindex="-1" onfocus="this.blur()">Disabled link</a>

CSS:

/* Adding cursor just works: */
.disabled {
    cursor: not-allowed;
}

/* Makes link non-clickable: */
.disabled:active {
    pointer-events: none;
}

Exemple de CodePen

ÉDITER:

  • Chrome a commencé à mettre l'accent sur le clic sur les éléments avec l'attribut tabindex (même avec tabindex = "- 1"). La solution la plus rapide consiste à définir l' onfocus="this.blur()"élément flou.
  • Vous devez empêcher la mise au point de l'élément, sinon il pourrait être activé par la touche Entrée
Petr Odut
la source
Fonctionne bien! Intelligent. Merci
Joe Dooley
Réponse sous-estimée! Merci!
trpx
Propre, simple et le plus important, juste comme il faut! Merci!
Dazag
13

En spécifiant, pointer-events:nonevous déclarez activement qu'il n'y a pas d'interaction avec la souris entre l'élément et le curseur. Par conséquent, il ne peut pas non plus avoir de curseur - il est invisible pour tous les comportements de la souris.

Preuve à trouver ici .

Niels Keurentjes
la source
encore une fois, mauvaise logique pour justifier cela. Supposons que vous souhaitiez une interaction avec la souris, mais que vous l'implémentiez vous-même en JavaScript. Ou bien, vous n'utilisez pas JavaScript, mais vous souhaitez styliser quelque chose comme le redimensionnement de la zone de texte, en ajoutant le curseur <-> en bas à droite, mais vous ne voulez pas que cela bloque la fonctionnalité de redimensionnement sous-jacente, vous créez donc des événements de pointeur: none ;, mais cela supprime le curseur. Logique épouvantable. Je ne vois pas en quoi c'est une réponse à la question.
George
4

Supprimer pointer-events: none !important;. Désactivez le lien en utilisant JavaScript:

anchorElement.onclick = function(){
  return false;
}

Si vous ne savez pas que JavaScript anchorElementest le nœud ou l'élément lui-même. Le moyen le plus courant d'obtenir un élément consiste à utiliser l' idattribut HTML . Disons que nous avons:

<a id='whatever' href='#'>Text Here</a>

Votre code pourrait être:

document.getElementById('whatever').onclick = function(){
  return false;
}

Il existe plusieurs autres façons d'obtenir des nœuds.

StackSlave
la source
cela semble logique mais je suis pauvre en JavaScript. Ce serait bien si vous montriez un exemple d'utilisation
Dragut
0

Mon cas d'utilisation était un élément déplaçable qui ne pouvait avoir aucun événement de pointeur ni aucun élément parent avec un événement de pointeur.

Je l'ai résolu en appliquant conditionnellement un style global forçant un curseur de saisie uniquement lors du glissement. (J'utilise React et styled-components, mais la même logique peut être appliquée sur vanilla js).

const SetDraggingCursor = createGlobalStyle`
  * {
    cursor: grabbing !important;
  }
`;

// ...

{isDragging && <SetDraggingCursor />}
Lucas Janon
la source
0

vous pouvez créer un autre div et le positionner exactement sur votre dernier div et créer un css comme celui-ci:

.example{
    background-color: rgba(255, 255, 255, 0); //opacity:0
    z-index: 1;
    cursor: not-allowed;
}
Pouorix
la source
0

Plutôt que de wrapper, cela peut également être fait avec du CSS pur de l'intérieur. (J'utilise cela avec un composant Web matériel, donc le code devient un peu plus complexe.)

button:disabled {
    > * {
        cursor: not-allowed;
        pointer-events: initial;
    }

    &::before {
        background-color: #fff0;
    }

    &::after {
        background-color: #fff0;
    }
}
<button>
    <svg .../>
</button>

J'ai aussi essayé ::beforeet ::afteravec button:disableddirectement, mais je ne pouvais tout simplement pas y arriver ...

Polv
la source