C'è un `pointer-events: hoverOnly` o simile in CSS?


104

Stavo solo giocando con la pointer-eventsproprietà in CSS.

Ho un divche desidero essere invisibile a tutti gli eventi del mouse, ad eccezione di :hover.

Quindi tutti i comandi di clic passano da quello diva quello sottostante, ma il div può segnalare se il mouse è sopra o meno.

Qualcuno può dirmi se questo può essere fatto?

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
Solo una nota, pointer-eventsnon ben supportata in IE .
Vucko

2
sembra che tu abbia bisogno di javascript
Pete

D'accordo con Pete, so che questo è specificamente la richiesta di CSS, ma ho avuto lo stesso problema e la soluzione più semplice per me è stata quella di chiedere al bambino di avviare un clic sul genitore con javascript stackoverflow.com/questions/35872534/…
Jerry Sha

Risposte:


12

Non credo sia possibile raggiungere i tuoi obiettivi solo con i CSS. Tuttavia, come hanno già detto altri contributori, è abbastanza facile da fare in JQuery. Ecco come l'ho fatto:

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

.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");
        }
    );
});

Ecco JSFiddle: http://www.jsfiddle.net/ReZ9M


107

Solo al passaggio del mouse. È molto facile. No JS ... Impedisci anche l'azione predefinita del collegamento.

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

Modifica: supportato in IE 11 e versioni successive http://caniuse.com/#search=pointer-events


23
questo "funziona" - tuttavia non consente il clic su un elemento sottostante (almeno non quando quell'elemento è un video di YouTube) - che è probabilmente l'unico motivo per cui qualcuno avrebbe bisogno di quel comportamento in primo luogo
Simon_Weaver,

1
questo non richiede un clic sull'elemento per disabilitare ulteriori eventi del puntatore?
Mindwin

3
questo è beutifull
user2860957

2
@PriyanshuJain cosa pensi che succederà se l'utente fa clic sul pulsante?
Свободен Роб

1
intelligente 💐 (è tutto quello che mi serve dire)
Davious

24

"Rubare" la risposta di Xanco ma senza quel brutto, brutto jQuery.

Snippet : avviso DIV sono in ordine inverso

.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
scusa, sto usando comunque il brutto jquery. ma hai un voto positivo per una soluzione solo CSS!
Jimmery

questo è fantastico - solo per tua informazione purtroppo non funziona correttamente se il livello inferiore contiene un iframe: jsfiddle.net/ReZ9M/82
Simon_Weaver

1
Come risolve la domanda? L'OP ha chiesto comandi di clic per passare attraverso l'elemento inizialmente visibile. Nella tua soluzione non lo fanno, nota come il testo "Top Layer" non può essere evidenziato ...
Trever Thompson

6

Puoi anche rilevare il passaggio del mouse su un elemento diverso e applicare gli stili al suo figlio o usare altri selettori CSS come figli adiacenti, ecc.

Dipende dal tuo caso però.

Al passaggio del mouse sull'elemento padre. L'ho fatto:

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

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

1

Uso lo :hoverpseudo-elemento di un genitore / contenitore di dimensioni uguali per simulare un passaggio del mouse sul mio div overlay, quindi imposto l'overlay pointer-eventssu noneper passare i clic agli elementi sottostanti.


0

Soluzione CSS pura alla tua richiesta (la proprietà opacity è lì solo per illustrare la necessità delle transizioni):

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

Cosa fa:

Quando il mouse entra nella casella, attiva il :hover stato. Tuttavia, in quello stato, gli eventi del puntatore sono disabilitati.

Ma se non imposti i timer delle transizioni, il div annullerà lo stato di hover quando il mouse si sposta; lo stato al passaggio del mouse lampeggerà mentre il mouse si muove all'interno dell'elemento. Puoi percepirlo usando il codice sopra con le proprietà di opacità.

L'impostazione di un ritardo alla transizione dallo stato di hover lo risolve. Il 2svalore può essere modificato in base alle proprie esigenze.

Crediti al tweak delle transizioni: patad su questa risposta .


L'elemento si blocca nello stato "hover" quando ho provato questa soluzione.
Flimm

0

Solo css puro , non necessita di jquery :

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

Ciao - molte grazie per questo - puoi aggiungere una demo alla tua risposta (come uno snippet di codice o un collegamento a questo in codepen o jsfiddle?) - E sai che tipo di compatibilità ha? è una nuova funzionalità CSS3? Se funziona ti darò sicuramente un segno di spunta :)
Jimmery

scusa non posso creare una demo. Ma nella mia logica, funziona decisamente con tutti i browser (non so ie, perché non ho ie). E supporta da css1 :)
Bariq Dharmawan

caniuse.com/#feat=pointer-events - non funzionerà in nessun IE tranne 11 ... se crei una demo funzionante di ciò che intendi qui codepen.io lo testerò per te e se funziona, lo farò premiarti con la risposta corretta - scusa, non posso assegnarlo a codice teorico - solo una demo funzionante
Jimmery

@brillout puoi aggiungere uno snippet? Bcz per me sta lavorando
Bariq Dharmawan
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.