Czy istnieje „pointer-events: hoverOnly” lub podobny w CSS?

104

Właśnie bawiłem się pointer-eventswłaściwościami w CSS.

Mam div, że chcę być niewidoczny dla wszystkich zdarzeń myszy, z wyjątkiem :hover.

Tak więc wszystkie polecenia kliknięcia przechodzą przez to divdo tego poniżej, ale div może raportować, czy mysz jest nad nim, czy nie.

Czy ktoś może mi powiedzieć, czy można to zrobić?

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;
}
Jimmery
źródło
2
Tylko uwaga, pointer-eventsnie jest dobrze obsługiwany w IE .
Vucko,
2
brzmi, jakbyś potrzebował javascript
Pete
Zgadzam się z Pete'em, wiem, że to konkretnie prośba o css, ale miałem ten sam problem i najłatwiejszym rozwiązaniem dla mnie było po prostu zainicjowanie przez dziecko kliknięcia do rodzica za pomocą stackoverflow.com/questions/35872534/…
Jerry Sha

Odpowiedzi:

12

Nie sądzę, aby można było osiągnąć swoje cele w samym CSS. Jednak, jak wspomnieli inni współautorzy, jest to łatwe do zrobienia w JQuery. Oto jak to zrobiłem:

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 (bez zmian)

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

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

Xanco
źródło
107

Tylko najechanie. To bardzo łatwe. Brak JS ... Zapobiegaj również domyślnej akcji linków.

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

Edycja: obsługiwane w IE 11 i nowszych http://caniuse.com/#search=pointer-events

Свободен Роб
źródło
23
to
``
1
czy to nie wymaga kliknięcia elementu, aby wyłączyć dalsze zdarzenia wskaźnikowe?
Mindwin
3
to jest beutifull
user2860957
2
@PriyanshuJain, co myślisz, że się stanie, jeśli użytkownik kliknie przycisk?
Свободен Роб
1
sprytny 💐 (to wszystko, co muszę powiedzieć)
Davious
24

„Kradnąca” odpowiedź Xanco, ale bez tego brzydkiego, brzydkiego jQuery.

Snippet : Notice DIVs są w odwrotnej kolejności

.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>

Niet the Dark Absol
źródło
2
przepraszam, i tak używam brzydkiego jquery. ale poproś o rozwiązanie tylko dla CSS!
Jimmery
to jest świetne - tylko do Twojej wiadomości niestety nie działa poprawnie, jeśli dolna warstwa zawiera iframe: jsfiddle.net/ReZ9M/82
Simon_Weaver
1
Jak to rozwiązuje problem? OP poprosił o polecenia kliknięcia, aby przejść przez początkowo widoczny element. W twoim rozwiązaniu nie zauważają, jak tekst „Top Layer” nie może być podświetlony ...
Trever Thompson
6

Możesz także wykryć najechanie kursorem na inny element i zastosować style do jego elementu podrzędnego lub użyć innych selektorów css, takich jak sąsiednie elementy podrzędne itp.

Zależy to jednak od twojego przypadku.

Po najechaniu na element nadrzędny. Ja to zrobiłem:

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

.parent:hover > .child {
    background-color: black;
}
maciejmatu
źródło
1

Używam :hoverpseudo-element równej wielkości dominującej / pojemnik do symulacji Najedź mojego nakładki div, a następnie ustawić nakładki pointer-events, aby noneprzejść przez kliknięć do elementów poniżej.

Jeremy Sabath
źródło
0

Czyste rozwiązanie CSS dla twojego żądania (właściwość opacity służy tylko do zilustrowania potrzeby przejść):

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

Co to robi:

Kiedy mysz wchodzi do pola, wyzwala :hoverstan. Jednak w tym stanie zdarzenia wskaźnikowe są wyłączone.

Ale jeśli nie ustawisz timerów przejść, element div anuluje stan aktywowania, gdy porusza się mysz; stan najechania będzie migotał, gdy mysz porusza się wewnątrz elementu. Możesz to zauważyć, używając powyższego kodu z właściwościami krycia.

Ustawienie opóźnienia wyjścia ze stanu aktywowania rozwiązuje ten problem. 2sWartość może być manipulowane do własnych potrzeb.

Podziękowania za ulepszenie przejść: patad na tę odpowiedź .

Mindwin
źródło
Po wypróbowaniu tego rozwiązania element po prostu utknął w stanie „najechania”.
Flimm
0

Po prostu czysty css , nie potrzebuje jQuery :

div:hover {pointer-events: none}
div {pointer-events: auto}
Bariq Dharmawan
źródło
Cześć - wielkie dzięki za to - czy możesz dodać demo do swojej odpowiedzi (np. Fragment kodu lub link do tego w codepen lub jsfiddle?) - i czy wiesz, jaki to ma rodzaj zgodności? czy to nowa funkcja CSS3? Jeśli to zadziała, na pewno dam ci haczyka :)
Jimmery
przepraszam, nie mogę stworzyć demo. Ale w mojej logice to zdecydowanie działa w każdej przeglądarce (nie wiem o tym, bo nie mam ie). I to wsparcie od css1 :)
Bariq Dharmawan
caniuse.com/#feat=pointer-events - nie będzie działać w żadnym IE z wyjątkiem 11 ... jeśli stworzysz działające demo tego, co masz na myśli, codepen.io przetestuję to dla ciebie i jeśli zadziała, będę przyznać ci poprawną odpowiedź - przepraszam, nie mogę tego przyznać kodowi teoretycznemu - tylko działające demo
Jimmery
@brillout czy możesz dodać fragment? Bcz to dla mnie praca
Bariq Dharmawan