Как я могу получить значения пикселей или windows x / y позиции для стиля в соответствии с этими координатами? - PullRequest
1 голос
/ 15 февраля 2020

Как я могу заставить элемент изменить его стиль в соответствии с положением моей мыши в этом элементе во время наведения?

Например:

Если я наведу курсор на мой мыши в верхней левой части (возможно, 20% сверху и 20% слева) элемента div, я хотел бы применить стиль A к этому элементу div, но если я наведусь на нижнюю правую часть (возможно, 20% снизу и 20 % справа) от div Я хотел бы вместо этого применить стиль B.

Основной вопрос:

Как мне получить эти

  • 20% сверху и 20% слева
  • 20% снизу и 20% справа

координаты для использования с div: hover selector?

1 Ответ

0 голосов
/ 15 февраля 2020

Для приведенных ниже решений допустим, что у нас есть элемент шириной 400 пикселей и высотой 300 пикселей.

<div class="element"></div>
.element {
  height: 300px;
  width: 400px;
  background: #333;
}

Решение 1: только с CSS

Решая приведенный вами пример, мы должны заключить div в элемент контейнера с двумя интервалами перед div в качестве вспомогательных элементов.

<div class="container">
  <span class="left-top-20"></span>
  <span class="right-bottom-20"></span>
  <div class="element"></div>
</div>

Затем мы размещаем элементы <span> в углах. Для этого мы устанавливаем position: relative для контейнера и position: absolute для свойств span и top, right, bottom и left.
Наконец, наведение диапазонов повлияет на стиль .element с использованием общего селектора братьев и сестер ~;

.container {
  display: inline-block;
  position: relative;
}
.container span {
  width: 20%;
  height: 20%;
  position: absolute;
}
.left-top-20 {
  left: 0;
  top: 0;
}
.right-bottom-20 {
  right: 0;
  bottom: 0;
}
.left-top-20:hover ~ .element {
  background-color: red;
}
.right-bottom-20:hover ~ .element {
  background-color: green;
}
.element {
  height: 300px;
  width: 400px;
  background: #333;
}

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

Решение 2: с JavaScript

Для этого решения вам не нужны контейнер или вспомогательные элементы. Сначала вы добавляете прослушиватель для наведения элемента, прослушиватель событий mousemove. Каждый раз, когда мышь перемещается внутри элемента, его высота и ширина будут сохраняться, а также положение мыши внутри него.
Наконец, будет выполнено условие и вычисление, чтобы проверить, находится ли позиция там, где вы этого хотите. быть добавлением классов для стилизации div или их удалением.

.element {
  height: 300px;
  width: 400px;
  background: #333;
}
.red {
  background: red;
}
.green {
  background: green;
}
document.querySelector('.element').addEventListener('mousemove', function(e) {

  var elementWidth = this.offsetWidth;
  var elementHeight = this.offsetHeight;
  var positionHorizontal = e.offsetX;
  var positionVertical = e.offsetY;

  if (positionHorizontal <= elementWidth * 0.2 && positionVertical <= elementHeight * 0.2) {
    this.classList.add('red');
  } else if (positionHorizontal >= (elementWidth - (elementWidth * 0.2)) && positionVertical >= (elementHeight - (elementHeight * 0.2))) {
    this.classList.add('green');
  } else {
    this.classList.remove('red', 'green');
  }

});

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

document.querySelector('.element').addEventListener('mouseleave', function(e) {
  this.classList.remove('red', 'green');
});

Недостатком этого подхода является то, что он имеет худшую производительность, чем первое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...