Как определить, пересекается ли точка с фигурой частично в поле зрения

Решение, которое мне нужно: определить, попадает ли точка в красную область ниже.

Как определить, пересекается ли точка с фигурой частично в поле зрения

Теперь трудность здесь в том, что красная область - это не изображение, а на самом деле div, который был повернут в нужное положение.

Как определить, пересекается ли точка с фигурой частично в поле зрения

Используя JavaScript, как я могу определить, попадает ли точка в эту область? И в идеале эффективно, так как эту проверку, возможно, придется вызывать часто и на медленных устройствах.

Детали CSS: на нем есть position: absolute, он повернут 45 degrees и позиционирован с помощью left: -135 и top:0.

Мой текущий подход состоял в том, чтобы попытаться выполнить некоторые вычисления, чтобы определить, где X пересекается с окном просмотра, что затем даст мне Y (и я могу вычислить оттуда), но мне не повезло. Использование getBoundingClientRect() для элемента возвращает квадрат вокруг формы, но не самой формы.

Как это может быть сделано? Вот небольшой пример (я хочу определить, пересекается ли верхний левый угол элемента intersecting с красным треугольником):

body {
    background: #ffd0ff;
    padding: 12px;
    margin: 0;
}

.sash {
    position: absolute;
    width: 270px;
    height: 80px;
    top: 0;
    left: -135px;
    background-color: #e10a0a;
    opacity: 0.5;
    transform: rotate(-45deg);
}

.intersection {
    background: rgba(0, 255, 0, 0.5);
    padding: 12px;
    display: inline-block;
}
<div class = "sash"></div>
<span class = "intersection">
    Some intersecting div
</span>

Итак, у вас есть розовая область, куда может двигаться красная область, верно? И где-то в этой розовой области у вас есть точка, где вы должны проверить, находится ли она в красной области? Если да, то что, если область находится внутри красной области, но за пределами розовой области (поскольку красная область частично находится за пределами розовой области)?

Aaron3219 21.06.2019 10:35

@Aaron3219 Aaron3219 Я обновил JSFiddle лучшим примером (я хочу определить, пересекается ли верхний левый угол элемента intersection с красным треугольником)

Duncan Ogle 21.06.2019 10:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать метод document.elementFromPoint(x, y), например:

function isPointInElement(x, y, selector) {

  let element = document.querySelector(selector);
  let elementFromPoint = document.elementFromPoint(x, y);
  return element == elementFromPoint;
}

function isIntersecting(selector1, selector2) {

  let element1 = document.querySelector(selector1);
  let element1Coords = element1.getBoundingClientRect();
  return isPointInElement(element1Coords.top, element1Coords.left, selector2);
}

let isIntersectionInRedArea = isIntersecting('.intersection', 'div.sash');
console.info(`.intersection and div.sash are ${ isIntersectionInRedArea ? '' : 'not '}intersecting.`);


let isNonIntersectionInRedArea = isIntersecting('.non-intersection', 'div.sash');
console.info(`.non-intersection and div.sash are ${ isNonIntersectionInRedArea ? '' : 'not '}intersecting.`);
body {
  background: #ffd0ff;
  padding: 12px;
  margin: 0;
}

.sash {
  position: absolute;
  width: 270px;
  height: 80px;
  top: 0;
  left: -135px;
  background-color: #e10a0a;
  opacity: 0.5;
  transform: rotate(-45deg);
}

.intersection {
  background: rgba(0, 255, 0, 0.5);
  padding: 12px;
  display: inline-block;
}

.non-intersection {
  background: rgba(0, 0, 255, 0.5);
  padding: 12px;
  display: inline-block;
}
<div class = "sash"></div>
<span class = "intersection">
    Some intersecting div
</span>
<span class = "non-intersection">
    Non intersecting div
</span>

Игнорируйте мой предыдущий комментарий, это хорошее решение и работает для моего варианта использования. Хотя я не буду привязывать его к событию click, использование document.elementFromPoint с getBoundingClientRect() позволяет мне достичь того, что мне нужно. Спасибо!

Duncan Ogle 21.06.2019 10:44

@DuncanOgle Добавлен пример, в котором также используется getBoundingClientRect().

mehmetseckin 21.06.2019 10:46

Другие вопросы по теме