Получение координат пикселей экрана прямоугольного элемента

#javascript #svg

#javascript #svg

Вопрос:

Я пытаюсь получить координаты пикселей экрана прямоугольника в SVG с помощью Java script. После щелчка по прямоугольнику я могу определить его ширину, высоту, положение по x и y с помощью getBBox().

Но эти позиции являются исходными позициями. Мне нужно положение экрана.

Например, если я манипулирую viewBox всего SVG, эти координаты getBBox больше не совпадают с пикселями экрана. Существует ли функция или способ получения координат с учетом текущего окна просмотра и размера пикселя элемента svg?

Ответ №1:

Демонстрация:http://phrogz.net/SVG/screen_location_for_element.xhtml

 var svg = document.querySelector('svg');
var pt  = svg.createSVGPoint();
function screenCoordsForRect(rect){
  var corners = {};
  var matrix  = rect.getScreenCTM();
  pt.x = rect.x.animVal.value;
  pt.y = rect.y.animVal.value;
  corners.nw = pt.matrixTransform(matrix);
  pt.x  = rect.width.animVal.value;
  corners.ne = pt.matrixTransform(matrix);
  pt.y  = rect.height.animVal.value;
  corners.se = pt.matrixTransform(matrix);
  pt.x -= rect.width.animVal.value;
  corners.sw = pt.matrixTransform(matrix);
  return corners;
}
  

Квадраты пурпурного цвета являются разделителями с абсолютным расположением в HTML-элементе, использующими координаты экранного пространства. Когда вы перетаскиваете прямоугольники или изменяете их размер, вызывается эта функция, которая перемещает угловые деления по четырем углам (строки 116-126). Обратите внимание, что это работает, даже если прямоугольники находятся в произвольном вложенном преобразовании (например, синий прямоугольник) и SVG масштабируется (измените размер окна вашего браузера).

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

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

1. Отличный ответ! Просто и по существу. Я бы с удовольствием добавил больше точек, если бы мог, настолько это полезно.

2. Извините, что возвращаю этот вопрос к жизни, но в настоящее время я пытаюсь получить экранные координаты элемента svg, и мне было любопытно, можно ли получить координаты X / Y из примера выше

3. @k.ken Вот что дает вам код able. Объект JavaScript с четырьмя свойствами, каждое из которых является точкой SVG с координатами x, y.

4. Спасибо за ответ. Координаты не относятся к svg, верно? Просто координаты экрана? Мой вопрос был направлен на получение единственной точки (середины) для прямоугольника, зная его угловые координаты. Быстрый расчет заключается в том, чтобы получить его, используя точки координат nw и se. Это возвращает среднюю координату. Еще раз спасибо за ответ и спасибо за публикацию этого ответа

5. В настоящее время вы можете просто использовать element.getBoundingClientRect()

Ответ №2:

Вы также можете проверить существование elm.getScreenBBox() метода, который делает то, на что это похоже. Это определено в SVG Tiny 1.2.

Смотрите файлы здесь, которые включают резервную реализацию getScreenBBox , которая должна работать во всех браузерах.

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

1. Спасибо, Эрик, за это дополнительное решение

2. Ссылка на публикацию в блоге больше не работает — «Моя Опера» закрыта.