Y a-t-il un `pointer-events: hoverOnly` ou similaire dans CSS?


100

Je viens de jouer avec la pointer-eventspropriété en CSS.

J'ai un divque je veux être invisible à tous les événements de souris, sauf pour :hover.

Ainsi, toutes les commandes de clic passent par le divà celui en dessous, mais le div peut indiquer si la souris est au-dessus ou pas encore.

Quelqu'un peut-il me dire si cela peut être fait?

HTML:

<div class="layer" style="z-index:20; pointer-events:none;">Top layer</div>
<div class="layer" style="z-index:10;">Bottom layer</div>

CSS:

.layer {
    position:absolute;
    top:0px;
    left:0px;
    height:400px;
    width:400px;
}

2
Juste une note, pointer-eventspas bien pris en charge dans IE .
Vucko

2
on dirait que vous avez besoin de javascript
Pete

D'accord avec Pete, je sais que cela demande spécifiquement du CSS, mais j'ai eu le même problème et la solution la plus simple pour moi était simplement de demander à l'enfant d'initier un clic au parent avec javascript stackoverflow.com/questions/35872534/…
Jerry Sha

Réponses:


12

Je ne pense pas qu'il soit possible d'atteindre vos objectifs uniquement en CSS. Cependant, comme d'autres contributeurs l'ont mentionné, c'est assez facile à faire dans JQuery. Voici comment je l'ai fait:

HTML

<div id="toplayer" class="layer" style="z-index:20; pointer-events:none; background-color: white; display: none;">Top layer</div><div id="bottomlayer" class="layer" style="z-index:10;">Bottom layer</div>

CSS (inchangé)

.layer {
    position:absolute;
    top:0px;
    left:0px;
    height:400px;
    width:400px;
}

JQuery

$(document).ready(function(){
    $("#bottomlayer").hover(
        function() {
            $("#toplayer").css("display", "block");
        },
        function() {
            $("#toplayer").css("display", "none");
        }
    );
});

Voici le JSFiddle: http://www.jsfiddle.net/ReZ9M


106

Survolez uniquement. C'est très facile. Pas de JS ... Empêche également l'action par défaut du lien.

a:hover {
	color: red;
}
a:active {
	pointer-events: none;
}
<a href="www.google.com">Link here</a>

Edit: pris en charge dans IE 11 et au-dessus http://caniuse.com/#search=pointer-events


23
cela `` fonctionne '' - mais cela ne permet pas de cliquer sur un élément ci-dessous (du moins pas lorsque cet élément est une vidéo YouTube) - ce qui est probablement la seule raison pour laquelle quiconque aurait besoin de ce comportement en premier lieu
Simon_Weaver

1
cela ne nécessite-t-il pas un clic sur l'élément pour désactiver d'autres événements de pointeur?
Mindwin

3
c'est
beutifull

2
@PriyanshuJain que pensez-vous qu'il se passera si l'utilisateur clique sur le bouton?
Свободен Роб

1
intelligent 💐 (c'est tout ce que j'ai besoin de dire)
Davious

24

"Voler" la réponse de Xanco mais sans ce jQuery laid et laid.

Snippet : Notez que les DIV sont dans l'ordre inverse

.layer {
  position: absolute;
  top: 0px;
  left: 0px;
  height: 400px;
  width: 400px;
}

#bottomlayer {
  z-index: 10
}

#toplayer {
  z-index: 20;
  pointer-events: none;
  background-color: white;
  display: none
}

#bottomlayer:hover~#toplayer {
  display: block
}
<div id="bottomlayer" class="layer">Bottom layer</div>
<div id="toplayer" class="layer">Top layer</div>


2
désolé, j'utilise quand même le moche jquery. mais ayez un vote positif pour une solution CSS uniquement!
Jimmery

c'est génial - juste pour info, malheureusement, cela ne fonctionne pas correctement si la couche inférieure contient une iframe: jsfiddle.net/ReZ9M/82
Simon_Weaver

1
Comment cela résout-il la question? L'OP a demandé des commandes de clic pour passer par l'élément initialement visible. Dans votre solution, ils ne le font pas, remarquez comment le texte "Top Layer" ne peut pas être mis en évidence ...
Trever Thompson

6

Vous pouvez également détecter le survol sur différents éléments et appliquer des styles à son enfant, ou en utilisant d'autres sélecteurs css comme les enfants adjacents, etc.

Cela dépend cependant de votre cas.

Au survol de l'élément parent. J'ai fait ça:

.child {
    pointer-events: none;
    background-color: white;
}

.parent:hover > .child {
    background-color: black;
}

1

J'utilise le :hoverpseudo-élément d'un parent / conteneur de taille égale pour simuler un survol sur mon div de superposition, puis définissez la superposition pointer-eventssur nonepour transmettre les clics aux éléments ci-dessous.


0

Solution CSS pure à votre demande (la propriété opacity est là juste pour illustrer le besoin des transitions):

.hoverOnly:hover {
    pointer-events: none;
    opacity: 0.1;
    transition-delay: 0s;
}
.hoverOnly {
    transition: ,5s all;
    opacity: 0.75;
    transition-delay: 2s;
}

Ce qu'il fait:

Lorsque la souris entre dans la boîte, elle déclenche l' :hoverétat. Cependant, dans cet état, les événements de pointeur sont désactivés.

Mais si vous ne définissez pas les minuteries des transitions, le div annulera l'état de survol lorsque la souris se déplace; l'état de survol clignotera pendant que la souris se déplace à l'intérieur de l'élément. Vous pouvez le percevoir en utilisant le code ci-dessus avec les propriétés d'opacité.

La définition d'un délai pour la transition hors de l'état de survol le résout. La 2svaleur peut être modifiée en fonction de vos besoins.

Crédits aux transitions tweak: patad sur cette réponse .


L'élément reste bloqué dans l'état "survol" lorsque j'ai essayé cette solution.
Flimm

0

Juste du css pur , n'a pas besoin de jquery :

div:hover {pointer-events: none}
div {pointer-events: auto}

Salut - merci beaucoup pour cela - pouvez-vous ajouter une démo à votre réponse (comme un extrait de code ou un lien vers ceci dans codepen ou jsfiddle?) - et savez-vous quel type de compatibilité cela a? est-ce une nouvelle fonctionnalité CSS3? Si cela fonctionne, je vais certainement vous donner une coche :)
Jimmery

désolé, je ne peux pas créer une démo. Mais dans ma logique, cela fonctionne définitivement sur tous les navigateurs (je ne sais pas, parce que je n'ai pas de ie). Et, il supporte de css1 :)
Bariq Dharmawan

caniuse.com/#feat=pointer-events - ne fonctionnera dans aucun IE sauf 11 ... si vous créez une démo fonctionnelle de ce que vous entendez ici codepen.io je vais le tester pour vous et si cela fonctionne, je le ferai vous attribuer la bonne réponse - désolé, je ne peux pas attribuer cela au code théorique - seulement une démo de travail
Jimmery

@brillout pouvez-vous ajouter un extrait? Bcz ça marche pour moi
Bariq Dharmawan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.