CSS'de bir "pointer-events: hoverOnly" veya benzeri var mı?


104

pointer-eventsCSS'de mülkle oynuyordum .

Bir var divben tüm fare olaylarına görünmez olmak istiyorum, için hariç :hover.

Bu nedenle, tüm tıklama komutları divaltındakine gider , ancak div, farenin üzerinde olup olmadığını bildirebilir.

Bunun yapılıp yapılamayacağını bana kimse söyleyebilir mi?

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
IE'depointer-events iyi desteklenmeyen bir not .
Vucko

2
javascript'e ihtiyacınız varmış gibi geliyor
Pete

Pete ile aynı fikirdeyim, bunun özellikle css istediğini biliyorum, ancak aynı sorunu yaşadım ve benim için en kolay çözüm, çocuğun javascript stackoverflow.com/questions/35872534/…
Jerry Sha

Yanıtlar:


12

Hedeflerinize tek başına CSS'de ulaşmanın mümkün olduğunu sanmıyorum. Ancak, diğer katkıda bulunanların da belirttiği gibi, JQuery'de yapmak yeterince kolaydır. İşte bunu nasıl yaptım:

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 (değişmedi)

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

İşte JSFiddle: http://www.jsfiddle.net/ReZ9M


108

Yalnızca fareyle üzerine gelin. Bu çok kolay. JS yok ... Bağlantı varsayılan eylemini de engelleyin.

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

Düzenleme: IE 11 ve üzerinde http://caniuse.com/#search=pointer-events desteklenir


23
Bu çalışmalarını 'yapar - muhtemelen tek nedeni herkes ilk etapta bu davranışı gerekir olduğunu - ancak bu (en azından bu öğenin bir YouTube videosu olduğunda değil) altında bir elemana tıklama izin vermez
Simon_Weaver

1
bu, daha fazla işaretçi olayını devre dışı bırakmak için öğeye tıklama gerektirmez mi?
Mindwin

3
beutifull
user2860957

2
@PriyanshuJain Kullanıcı düğmeye tıklarsa ne olacağını düşünüyorsunuz?
Свободен Роб

1
zeki 💐 (tüm söylemem gereken bu)
Davious

24

Xanco'nun cevabını "çalmak" ama o çirkin, çirkin jQuery olmadan.

Snippet : DIV'lerin ters sırada olduğuna dikkat edin

.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
üzgünüm, yine de çirkin jquery kullanıyorum. ancak yalnızca CSS çözümü için olumlu oy var!
Jimmery

Bu harika - alt tabaka bir iframe içeriyorsa sadece Bilginize maalesef düzgün çalışmazsa: jsfiddle.net/ReZ9M/82
Simon_Weaver

1
Bu, soruyu nasıl çözer? OP, başlangıçta görünen öğeden geçmek için tıklama komutlarını istedi. Çözümünüzde "Üst Katman" metninin nasıl vurgulanamayacağına dikkat etmiyorlar ...
Trever Thompson

6

Ayrıca farklı öğedeki fareyle üzerine gelmeyi algılayabilir ve alt öğeye stiller uygulayabilir veya bitişik alt öğeler gibi diğer css seçicilerini kullanabilirsiniz.

Yine de durumunuza bağlı.

Üst öğede üzerine gelin. Bunu ben yaptım:

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

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

1

Kullandığım :hoverzaman paylaşımı div üzerinde vurgulu taklit etmek için bir eşit büyüklükte üst / kabın sözde eleman, o zaman paylaşımı en ayarlamak pointer-eventsiçin noneaşağıdaki elemanlara tıklama geçmesine.


0

Talebinize saf CSS çözümü (opaklık özelliği sadece geçiş ihtiyacını göstermek için mevcuttur):

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

Bu ne yapar:

Fare kutuya girdiğinde, :hover durumu . Ancak bu durumda işaretçi olayları devre dışı bırakılır.

Ancak geçiş zamanlayıcılarını ayarlamazsanız, div fare hareket ettiğinde üzerine gelme durumunu iptal edecektir; fareyle öğenin içinde hareket ederken üzerine gelme durumu titreyecektir. Bunu opaklık özellikleriyle yukarıdaki kodu kullanarak anlayabilirsiniz.

Fareyle üzerine gelme durumundan geçiş için bir gecikme ayarlamak sorunu düzeltir. 2sDeğeri ihtiyaçlarınıza göre tweaked olabilir.

Geçişlere verilen krediler ayarlandı : bu cevapta patad .


Bu çözümü denediğimde öğe "vurgulu" durumunda kalıyor.
Flimm

0

Sadece saf css , jquery'ye ihtiyaç duymaz :

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

Merhaba - bunun için çok teşekkürler - cevabınıza bir demo ekleyebilir misiniz (kod parçacığı veya buna codepen veya jsfiddle'daki bir bağlantı gibi) - ve bunun ne tür bir uyumluluğa sahip olduğunu biliyor musunuz? yeni bir CSS3 özelliği mi? Bu işe yararsa size kesinlikle bir onay vereceğim :)
Jimmery

üzgünüm demo oluşturamıyorum. Ama mantığıma göre, kesinlikle tüm tarayıcılarda çalışıyor (yani bilmiyorum, çünkü ie'ye sahip değilim). Ve css1'den destekleniyor :)
Bariq Dharmawan

caniuse.com/#feat=pointer-events - 11 dışında herhangi bir IE'de çalışmaz ... burada ne demek istediğinize dair çalışan bir demo oluşturursanız codepen.io sizin için test edeceğim ve işe yararsa, yapacağım size doğru cevabı veriyorum - üzgünüm, bunu teorik koda
veremiyorum

@brillout pasaj ekleyebilir misin? Bcz benim için çalışıyor
Bariq Dharmawan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.