Передавать события мыши через абсолютно позиционированный элемент - PullRequest
273 голосов
/ 18 июня 2009

Я пытаюсь захватить события мыши на элементе с другим абсолютно позиционированным элементом поверх него.

Прямо сейчас, события на абсолютно позиционированном элементе попадают на него и всплывают до его родителя, но я хочу, чтобы он был "прозрачным" для этих событий мыши и направлял их на то, что позади него. Как мне это реализовать?

Ответы [ 6 ]

437 голосов
/ 22 июня 2011
pointer-events: none;

Это свойство CSS, которое заставляет события «проходить» через элемент, к которому оно применяется, и заставляет событие происходить в элементе «ниже».

Подробнее см .: https://developer.mozilla.org/en/css/pointer-events

Не поддерживается до IE 11; все другие поставщики поддерживают его довольно давно (глобальная поддержка составила ~ 92% в 12 / '16): http://caniuse.com/#feat=pointer-events (спасибо @ s4y за предоставленную ссылку в комментариях).

47 голосов
/ 18 июня 2009

Если все, что вам нужно, это mousedown, вы можете обойтись с помощью метода document.elementFromPoint:

  1. Снятие верхнего слоя в mousedown,
  2. передает координаты x и y из события в метод document.elementFromPoint, чтобы получить элемент под ним, а затем
  3. восстановление верхнего слоя.
35 голосов
/ 07 ноября 2014

Также приятно знать ...
События-указатели могут быть отключены для родительского элемента (возможно, прозрачного div) и, в то же время, включены для дочерних элементов. Это полезно, если вы работаете с несколькими перекрывающимися слоями div, где вы хотите иметь возможность щелкать дочерние элементы любого слоя. Для этого все div-ы для родителей получают pointer-events: none, а 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>
7 голосов
/ 18 июня 2009

Причина, по которой вы не получаете событие, заключается в том, что абсолютно позиционированный элемент не является дочерним элементом элемента, который вы хотите «щелкнуть» (синий div). Самый чистый способ, который я могу придумать, - это поместить абсолютный элемент как дочерний элемент того, на который вы нажали, но я предполагаю, что вы не можете этого сделать, иначе вы бы не разместили этот вопрос здесь:)

Другой вариант - зарегистрировать обработчик события щелчка для абсолютного элемента и вызвать обработчик щелчка для синего элемента div, в результате чего они оба будут мигать.

Из-за того, как через DOM всплывают события, я не уверен, что для вас есть более простой ответ, но мне очень любопытно, есть ли у кого-нибудь еще какие-то хитрости, о которых я не знаю!

3 голосов
/ 27 марта 2013

Доступна версия JavaScript, которая вручную перенаправляет события из одного div в другой.

Я очистил его и превратил в плагин jQuery.

Вот хранилище Github: https://github.com/BaronVonSmeaton/jquery.forwardevents

К сожалению, цель, для которой я его использовал - наложение маски на Google Карты не захватывало события нажатия и перетаскивания, и курсор мыши не менялся, что настолько ухудшало впечатление пользователя, что я просто решил скрыть маску под IE и Opera - два браузера, которые не поддерживают события указателя.

1 голос
/ 25 февраля 2012

Если вы знаете элементы, для которых нужны события мыши, и если ваше наложение прозрачно, вы можете просто установить для их z-index значение, превышающее наложение. Все события должны, конечно, работать в этом случае во всех браузерах.

...