Абсолютно позиционированное наложение пропускает событие наведения, несмотря на `pointer-event: none` в CSS

#html #css

#HTML #css

Вопрос:

В приведенном ниже примере, хотя .overlay полностью покрывает .positioner и .overlay имеет pointer-events: none , .positioner все равно реагирует на наведение. Я ожидал, что .overlay события курсора не будут проходить.

 .positioner {
  width: 100px;
  height: 100px;
  position: relative;
  background: #FAD7A0;
}

.positioner:hover {
  background: #85C1E9;
}

.overlay {
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  background: rgba(0, 0, 1, 0.5);
  pointer-events: none;
}  
 <div class="positioner">
  <div class="overlay"></div>  
</div>  

Ответ №1:

Дело в том, что при наведении курсора .overlay вы также наводите курсор на его родительский элемент, то есть .positioner , поскольку они расположены друг над другом. Если вы переместитесь .overlay ниже .positioner , это не вызовет эффекта наведения на своего родителя:

 .positioner {
  width: 100px;
  height: 100px;
  position: relative;
  background: #FAD7A0;
}

.positioner:hover {
  background: #85C1E9;
}

.overlay {
  position: absolute;
  width: 100px;
  height: 100px;
  top: 100px;
  background: rgba(0, 0, 1, 0.5);
  pointer-events: none;
}  
 <div class="positioner">
  <div class="overlay"></div>  
</div>  

Комментарии:

1. pointer-events: none; применяется только к .overlay , а не к его родительскому элементу. Вам нужно будет переместить его .positioner , чтобы заставить его работать и над ним. Вы можете проверить документы в MDN web docs

Ответ №2:

Вы помещаете наложение внутри позиционера (как дочерний элемент).

Мне непонятно, хотите ли вы покрыть весь элемент позиционера с помощью наложения или только его содержимое. В последнем случае, я полагаю, вам не следует помещать hover псевдокласс в сам позиционер.

Поэтому я предполагаю, что вы хотите скрыть сам позиционер с помощью наложения, чтобы он hover не запускался. В этом случае я бы ожидал, что наложение будет размещено перед позиционером. Для этого наложение должно быть, по крайней мере, родным братом позиционера в DOM.

При тестировании я обнаружил, что использование pointer-events работает не так, как я ожидал. Но, предполагая, что наложение должно работать нормально и без него, я просто удалил его.

Это мой конечный результат:

 var input = document.querySelector("input");
var overlay = document.querySelector(".overlay");

input.addEventListener("change", function() {
  if (input.checked) {
    overlay.style.display = null;
  }
  else {
    overlay.style.display = "none";
  }
})  
 .container, .positioner {
  width: 100px;
  height: 100px;
  position: relative;
}

.positioner {
  background: #FAD7A0;
}

.positioner:hover {
  background: #85C1E9;
}

.overlay {
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  background: rgba(0, 0, 1, 0.5);
}  
 <input type="checkbox" checked><label>Overlay active</label>

<div class="container">
  <div class="positioner"></div>
  <div class="overlay"></div>  
</div>  

Примечание: я не уверен, что rgba функция вызывается с правильными параметрами. Если вы хотите, чтобы оно было полупрозрачным синим, вы могли бы использовать rgba(0, 0, 255, 0.5) . Прямо сейчас он полупрозрачный черный с небольшим количеством синего.