Apakah ada `pointer-events: hoverOnly` atau serupa di CSS?

109

Baru saja bermain-main dengan pointer-eventsproperti di CSS.

Saya memiliki divyang saya ingin tidak terlihat ke semua acara mouse, kecuali :hover.

Jadi semua perintah klik menuju divke yang di bawahnya, tetapi div dapat melaporkan apakah mouse di atasnya atau tidak.

Adakah yang bisa memberi tahu saya jika ini bisa dilakukan?

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
sumber
2
Sekadar catatan, di IEpointer-events tidak didukung dengan baik .
Vucko
2
terdengar seperti Anda membutuhkan javascript
Pete
Setuju dengan Pete, saya tahu ini secara khusus meminta css, tetapi memiliki masalah yang sama dan solusi termudah bagi saya adalah meminta anak memulai klik ke induknya dengan javascript stackoverflow.com/questions/35872534/…
Jerry Sha

Jawaban:

12

Saya tidak berpikir itu mungkin untuk mencapai tujuan Anda dalam CSS saja. Namun, seperti yang telah disebutkan oleh kontributor lain, ini cukup mudah dilakukan di JQuery. Inilah cara saya melakukannya:

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 (tidak berubah)

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

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

Xanco
sumber
113

Arahkan kursor saja. Ini sangat mudah. Tidak ada JS ... Cegah juga tindakan default tautan.

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

Edit: didukung di IE 11 dan di atasnya http://caniuse.com/#search=pointer-events

Свободен Роб
sumber
23
ini memang 'berfungsi' - namun tidak mengizinkan klik ke elemen di bawah (setidaknya tidak jika elemen itu adalah video YouTube) - yang mungkin merupakan satu-satunya alasan siapa pun memerlukan perilaku itu sejak awal
Simon_Weaver
1
bukankah ini memerlukan klik pada elemen untuk menonaktifkan peristiwa penunjuk lebih lanjut?
Mindwin
3
ini beutifull
pengguna2860957
2
@PriyanshuJain menurut Anda apa yang akan terjadi jika pengguna mengklik tombol?
Свободен Роб
1
pintar 💐 (hanya itu yang perlu saya katakan)
Davious
24

"Mencuri" jawaban Xanco tetapi tanpa jQuery yang jelek dan jelek itu.

Snippet : Perhatikan bahwa DIV berada dalam urutan terbalik

.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
sumber
2
maaf, saya tetap menggunakan jquery jelek. tetapi dapatkan suara positif untuk solusi khusus CSS!
Jimmery
ini besar - hanya FYI sayangnya itu tidak bekerja dengan benar jika lapisan bawah berisi iframe: jsfiddle.net/ReZ9M/82
Simon_Weaver
1
Bagaimana cara ini menyelesaikan pertanyaan? OP meminta perintah klik untuk melewati elemen yang awalnya terlihat. Dalam solusi Anda, mereka tidak melakukannya, perhatikan bagaimana teks "Lapisan Atas" tidak dapat disorot ...
Trever Thompson
7

Anda juga dapat mendeteksi hover pada elemen yang berbeda dan menerapkan gaya ke anaknya, atau menggunakan pemilih css lain seperti anak yang berdekatan, dll.

Itu tergantung pada kasus Anda.

Pada hover elemen induk. Saya melakukan ini:

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

.parent:hover > .child {
    background-color: black;
}
maciejmatu.dll
sumber
1

Saya menggunakan :hoverpseudo-unsur yang setara berukuran orangtua / wadah untuk mensimulasikan hover lebih div overlay saya, kemudian mengatur overlay ini pointer-eventsuntuk nonemelewati klik ke elemen di bawah ini.

Jeremy Sabath
sumber
0

Solusi CSS murni untuk permintaan Anda (properti opacity ada di sana hanya untuk menggambarkan kebutuhan transisi):

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

Apa fungsinya:

Saat mouse memasuki kotak, itu memicu :hoverstatus. Namun, dalam keadaan itu, peristiwa-penunjuk dinonaktifkan.

Tetapi jika Anda tidak menyetel timer transisi, div akan membatalkan status hover saat mouse bergerak; status hover akan berkedip saat mouse bergerak di dalam elemen. Anda dapat melihat ini dengan menggunakan kode di atas dengan properti opacity.

Menetapkan penundaan untuk transisi keluar dari status hover akan memperbaikinya. Itu2s nilai dapat tweak sesuai dengan kebutuhan Anda.

Kredit untuk transisi tweak: patad atas jawaban ini .

Mindwin
sumber
Elemen tersebut hanya macet di status "hover" ketika saya mencoba solusi ini.
Flimm
0

Hanya css murni , tidak perlu jquery :

div:hover {pointer-events: none}
div {pointer-events: auto}
Bariq Dharmawan
sumber
Hai - terima kasih banyak untuk ini - dapatkah Anda menambahkan demo ke jawaban Anda (seperti cuplikan kode atau tautan ke ini di codepen atau jsfiddle?) - dan apakah Anda tahu kompatibilitas seperti apa yang dimilikinya? apakah ini fitur CSS3 baru? Jika ini berhasil, saya pasti akan memberi Anda tanda centang :)
Jimmery
maaf saya tidak bisa membuat demo. Tapi dalam logika saya, ini pasti bekerja di semua browser (saya tidak tahu tentang, karena saya tidak punya ie). Dan, ini support dari css1 :)
Bariq Dharmawan
caniuse.com/#feat=pointer-events - tidak akan berfungsi di IE mana pun kecuali 11 ... jika Anda membuat demo yang berfungsi dari apa yang Anda maksud di sini codepen.io saya akan mengujinya untuk Anda dan jika berhasil, saya akan memberi Anda jawaban yang benar - maaf, saya tidak dapat memberikan ini ke kode teoritis - hanya demo yang berfungsi
Jimmery
@brillout dapatkah Anda menambahkan potongan? Bcz itu berhasil untuk saya
Bariq Dharmawan