Fare olaylarını kesinlikle konumlandırılmış öğeden geçirme


307

Üstünde kesinlikle konumlandırılmış başka bir öğe bulunan bir öğe üzerinde fare olayları yakalamaya çalışıyorum.

Şu anda, kesinlikle konumlandırılmış öğedeki olaylar ona çarptı ve ebeveynine doğru patladı, ancak bu fare olaylarına "şeffaf" olmasını ve onları arkasında ne varsa iletmesini istiyorum. Bunu nasıl uygulamalıyım?

Yanıtlar:


488
pointer-events: none;

Olayların uygulandığı öğeden "geçmesini" sağlayan ve olayın "aşağıdaki" öğesinde gerçekleşmesini sağlayan bir CSS özelliğidir.

Ayrıntılar için bakınız: https://developer.mozilla.org/en/css/pointer-events

IE 11'e kadar desteklenmez; diğer tüm satıcılar oldukça uzun bir süredir destekliyorlar (küresel destek 12 / ' 16'da ~% 92 idi): http://caniuse.com/#feat=pointer-events (yorumlarda bağlantıyı sağladığı için @ s4y sayesinde) .


3
Teşekkürler! Bu, modern (ve IE olmayan) tarayıcılar için mükemmel bir çözümdür. Bu soru gönderildiğinde, pointer-eventsvar olduğunu düşünmüyorum ! Kabul edilen cevabı bir noktada bu soruya çevirebilirim.
s4y

16
Woah, bu sadece saatlerimi kurtardı.
Dan Abramov

2
Kabul edilen cevabı daha yeni değiştirdim. Destek pointer-events hala süper değil , ama daha iyi oluyor. Daha uyumlu bir seçenek için @ JedSchmidt yanıtıyla gidin.
s4y

1
Teşekkürler, bunun gerçekte var olduğunu asla bilmiyordum. Beni saatlerce kurtardı
Mohammed A. Al Jama

2
Ancak, yalnızca scroll olayı gibi bir olayın geçmesine izin vermek istiyorsanız, ancak üst öğenin yine de diğer tüm olaylara yanıt vermesini istiyorsanız. İşaretçi olaylarını yok olarak ayarlamak, üst öğedeki tüm olayları öldürür.
AndroidDev

50

İhtiyacınız olan tek şey fareyle aşağıdaysa, yöntemle şunları yapabilirsiniz document.elementFromPoint:

  1. fareyle üzerine gelindiğinde üst tabakanın çıkarılması,
  2. öğeyi altına almak için xve ykoordinatlarını olaydan document.elementFromPointyönteme geçirme ve ardından
  3. üst katmanı geri yükleme.

9
Burada daha garip bir
Nathan

2
Harika, bu yöntemin bile var olduğunu bilmiyordum! Ayrıca, en üstteki öğeyi almak için bir while döngüsü kullanarak imlecin altındaki tüm öğeleri almak ve daha sonra bir sonraki öğeyi bulmak için gizlemek için oldukça kolay bir şekilde kullanılabilir . Sürümümü
jpeltoniemi

2
Bu geçici çözümün sorunu, sayfayı yakınlaştırmayla çalışmadığıdır. XY koordinatlarına yakınlaştırılmış mobil aygıtlar veya masaüstü tarayıcıları için artık hiçbir şey ifade edilmez ve yakınlaştırmayı hesaplamanın net bir yolu yoktur. tutam zumlama için aslında imkansız olduğuna inanıyorum.
İmkansız

39

Ayrıca bilmek güzel ...
İşaretçi olayları bir üst öğe (muhtemelen saydam div) için devre dışı bırakılabilir ve yine de alt öğeler için etkinleştirilebilir. Herhangi bir katmanın alt öğelerini tıklatabileceğiniz birden çok çakışan div katmanıyla çalışıyorsanız bu yardımcı olur. Bunun için tüm ebeveynlik div'leri get pointer-events: noneve click-children,pointer-events: all

.parent {
    pointer-events:none;        
}
.child {
    pointer-events:all;
}

<div class="some-container">
   <ul class="layer-0 parent">
     <li class="click-me child"></li>
     <li class="click-me child"></li>
   </ul>

   <ul class="layer-1 parent">
     <li class="click-me-also child"></li>
     <li class="click-me-also child"></li>
   </ul>
</div>

5
Harika, keşfetmenin pointer-events:nonezirvesinden ve çocuk düğümlerini etkilemenin yakında gerçekleşmesinden hemen sonra, günü kurtarıyorsunuz :)
Juan Cortés

;) Bundan çok memnunum
Allisone

Sadece .parent * { pointer-events:all; }çocuklar için kaynatılabilir mi?
Dmitry

"Pointer-events: auto;" olmalıdır. "Tümü" değeri yalnızca SVG'ler için geçerlidir. Bkz developer.mozilla.org/en-US/docs/Web/CSS/pointer-events
mattavatar

7

Etkinliği almamanızın nedeni, kesinlikle konumlandırılmış öğenin "tıklatmak" istediğiniz öğenin alt öğesi olmamasıdır (mavi div). Düşünebileceğim en temiz yol, mutlak öğeyi tıklamak istediğiniz öğenin alt öğesi olarak koymaktır, ancak bunu yapamayacağınızı veya bu soruyu buraya göndermeyeceğinizi varsayıyorum :)

Başka bir seçenek, mutlak öğe için bir tıklama olay işleyicisi kaydetmek ve her ikisinin de yanıp sönmesine neden olan mavi div için tıklama işleyicisini çağırmak olacaktır.

Olayların DOM'da patlaması nedeniyle sizin için daha basit bir cevap olduğundan emin değilim, ancak başka birinin bilmediğim hileleri olup olmadığını merak ediyorum!


Yanıtınız için teşekkürler Loktar. Ne yazık ki, gerçek sayfada, kesinlikle konumlandırılmış öğenin altında ne olduğunu bilemeyeceğim ve birden fazla olası hedef olabilir. Aklıma gelen tek çözüm fare koordinatlarını alıp kesişip kesişmediklerini görmek için olası hedeflerle karşılaştırmak. Bu sadece düz kötü olurdu.
s4y

4

Etkinlikleri bir div'den diğerine manuel olarak yönlendiren bir javascript sürümü vardır.

Temizledim ve bir jQuery eklentisi haline getirdim.

İşte Github deposu: https://github.com/BaronVonSmeaton/jquery.forwardevents

Ne yazık ki, onu kullandığım amaç - Google Haritalar'ın üzerine bir maske yerleştirmek tıklama ve sürükleme olaylarını yakalamadı ve fare imleci, IE ve Opera altında maskeyi gizlemeye karar verdiğim kullanıcı deneyimini yeterince düşüren - işaretçi olaylarını desteklemeyen iki tarayıcı.


1

Fare olaylarına ihtiyaç duyan öğeleri biliyorsanız ve kaplamanız şeffafsa, bunların z-dizinini kaplamadan daha yüksek bir şeye ayarlayabilirsiniz. Tüm olaylar elbette bu durumda tüm tarayıcılarda çalışmalıdır.

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.