Какой самый простой способ добавить обработчик события click к элементу canvas, который будет возвращать координаты x и y клика (относительно элемента canvas)?
Совместимость с устаревшими браузерами не требуется, Safari, Opera и Firefox подойдут.
javascript
canvas
Том
источник
источник
Ответы:
Edit 2018: Ответ на этот вопрос довольно старый , и он использует для проверки старых браузеров, которые не нужно больше, как
clientX
иclientY
свойства работают во всех современных браузерах. Возможно, вы захотите проверить ответ Patriques для более простого, более свежего решения.Оригинальный ответ:
Как описано в статье, которую я нашел тогда, но больше не существует:
Работал отлично для меня.
источник
Если вам нравится простота, но все же нужна кросс-браузерная функциональность, я нашел, что это решение подойдет мне лучше всего Это упрощение решения @ Aldekein, но без jQuery .
источник
getBoundingClientRect
возвращает позиции относительно порта просмотра? Тогда мое предположение было неверным. Я никогда не проверял это, так как это никогда не было проблемой для меня, и я любезно хотел бы предупредить других читателей о потенциальной проблеме, которую я видел, но спасибо за ваше разъяснение.var canvas = document.getElementById('canvasID'); canvas.addEventListener("mousedown", function (e) { getCursorPosition(canvas, e);});
Обновление (5/5/16): вместо этого следует использовать ответ патриков , так как он проще и надежнее.
Поскольку холст не всегда стилизован относительно всей страницы,
canvas.offsetLeft/Top
он не всегда возвращает то, что вам нужно. Он вернет количество пикселей, на которые он смещен, относительно его элемента offsetParent, который может быть чем-то вродеdiv
элемента, содержащего холст с примененнымposition: relative
стилем. Для этого вам нужно пройтись по цепочкеoffsetParent
s, начиная с самого элемента canvas. Этот код отлично работает для меня, протестирован в Firefox и Safari, но должен работать для всех.Последняя строка упрощает получение координат мыши относительно элемента canvas. Все, что нужно для получения полезных координат, это
источник
event.offsetX
иevent.offsetY
атрибуты, поэтому я изменил свое решение, добавивif (event.offsetX !== undefined && event.offsetY !== undefined) { return {x:event.offsetX, y:event.offsetY}; }
. Похоже, это работает.event.offsetX
иevent.offsetY
также работает в IE9. Для Firefox (протестировано с v / v13) вы можете использоватьevent.layerX
иevent.layerY
.canvasX = event.pageX - totalOffsetX - document.body.scrollLeft; canvasY = event.pageY - totalOffsetY - document.body.scrollTop;
Современный браузер теперь справится с этим для вас. Chrome, IE9 и Firefox поддерживают смещение X / Y следующим образом, передавая событие из обработчика щелчка.
Большинство современных браузеров также поддерживают layerX / Y, однако Chrome и IE используют layerX / Y для абсолютного смещения клика по странице, включая поля, отступы и т. Д. В Firefox layerX / Y и offsetX / Y эквивалентны, но смещение не было ранее не существовало. Итак, для совместимости с чуть более старыми браузерами вы можете использовать:
источник
Согласно свежему Quirksmode
clientX
иclientY
методы поддерживаются во всех основных браузерах. Итак, вот и все - хороший рабочий код, который работает в элементе прокрутки на странице с полосами прокрутки:Это также требует JQuery для
$(canvas).offset()
.источник
Я сделал полную демонстрацию, которая работает в каждом браузере с полным исходным кодом решения этой проблемы: координаты щелчка мышью по Canvas в Javascript . Чтобы попробовать демо, скопируйте код и вставьте его в текстовый редактор. Затем сохраните его как example.html и, наконец, откройте файл в браузере.
источник
Вот небольшая модификация ответа Райана Артеконы для холстов с переменной (%) шириной:
источник
Будьте осторожны при выполнении преобразования координат; в событии щелчка возвращено несколько значений, не относящихся к браузеру. Использование clientX и clientY одного недостаточно, если прокручивается окно браузера (проверено в Firefox 3.5 и Chrome 3.0).
Этот причудливый режим статья о предоставляет более правильную функцию, которая может использовать pageX или pageY или комбинацию clientX с document.body.scrollLeft и clientY с document.body.scrollTop для вычисления координаты щелчка относительно источника документа.
ОБНОВЛЕНИЕ: Кроме того, offsetLeft и offsetTop относятся к дополнительному размеру элемента, а не к внутреннему размеру. Холст с примененным padding: style не будет отображать верхний левый угол своей области содержимого как offsetLeft. Существуют различные решения этой проблемы; самым простым может быть очистить все стили границ, отступов и т. д. на самом холсте и вместо этого применить их к блоку, содержащему холст.
источник
Я не уверен, какой смысл всех этих ответов перебирают родительские элементы и делают всякие странные вещи .
HTMLElement.getBoundingClientRect
Метод предназначен для для обработки фактического положения экрана любого элемента. Это включает прокрутку, поэтому такие вещиscrollTop
не нужны:Нормальное изображение
Самый простой подход уже был опубликован здесь. Это правильно до тех пор, пока нет дикого CSS задействованы правила.
Обработка растянутого холста / изображения
Если ширина пикселя изображения не совпадает с шириной CSS, вам нужно применить некоторое отношение к значениям пикселей:
Пока холст не имеет границы, он работает для растянутых изображений (jsFiddle) .
Обработка границ CSS
Если холст имеет толстую границу, все становится немного сложнее . Вам буквально нужно вычесть границу из ограничивающего прямоугольника. Это можно сделать с помощью .getComputedStyle . Этот ответ описывает процесс .
Затем функция немного растет:
Я не могу думать ни о чем, что могло бы спутать эту последнюю функцию. Посмотрите на себя в JsFiddle .
Ноты
Если вам не нравится изменять нативные
prototype
s, просто измените функцию и вызовите ее(canvas, event)
(и замените любуюthis
наcanvas
).источник
Вот очень хороший учебник
http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/
надеюсь это поможет!
источник
width
/height
переопределение, но все еще является одним из лучших решений.Используя jQuery в 2016 году, чтобы получить координаты кликов относительно холста, я делаю:
Это работает, так как и canvas offset (), и jqEvent.pageX / Y относятся к документу независимо от положения прокрутки.
Обратите внимание, что если ваш холст масштабируется, то эти координаты не совпадают с логическими координатами холста . Чтобы получить их, вы также должны сделать:
источник
Так что это простая, но немного более сложная тема, чем кажется.
Во-первых, здесь обычно возникают спорные вопросы.
Как получить элемент относительно координат мыши
Как получить координаты пиксельной мыши Canvas для 2D Canvas API или WebGL
итак, ответы
Как получить элемент относительно координат мыши
Является ли элемент холстом, получая элемент относительно координат мыши, одинаково для всех элементов.
На вопрос «Как получить относительные координаты мыши для холста» есть 2 простых ответа.
Простой ответ № 1 использовать
offsetX
иoffsetY
Этот ответ работает в Chrome, Firefox и Safari. В отличие от всех других значений событий
offsetX
иoffsetY
принимает во внимание CSS-преобразования.Самая большая проблема с
offsetX
иoffsetY
в 2019/05 они не существуют на сенсорных событиях и поэтому не могут быть использованы с iOS Safari. Они существуют в Pointer Events, которые существуют в Chrome и Firefox, но не в Safari, хотя, очевидно, Safari работает над этим .Еще одна проблема - события должны быть на самом холсте. Если вы поместите их в какой-то другой элемент или окно, вы не сможете позже выбрать холст, который будет вашим ориентиром.
Простой ответ № 2 использовать
clientX
,clientY
иcanvas.getBoundingClientRect
Если вас не волнуют преобразования CSS, следующий простейший ответ - вызвать
canvas. getBoundingClientRect()
и вычесть левое изclientX
иtop
из,clientY
как вЭто будет работать до тех пор, пока нет CSS-преобразований. Он также работает с сенсорными событиями и будет работать с Safari iOS
Как получить координаты пиксельной мыши для 2D Canvas API
Для этого нам нужно взять значения, которые мы получили выше, и преобразовать размер отображаемого холста в количество пикселей в самом холсте.
с
canvas.getBoundingClientRect
иclientX
иclientY
или с
offsetX
иoffsetY
Примечание: Во всех случаях не добавляйте отступы или границы на холст. Это значительно усложнит код. Вместо того, чтобы вы хотели создать рамку или отступ, окружите холст каким-либо другим элементом и добавьте отступ и или рамку к внешнему элементу.
Рабочий пример с использованием
event.offsetX
,event.offsetY
Показать фрагмент кода
Рабочий пример с использованием
canvas.getBoundingClientRect
иevent.clientX
иevent.clientY
Показать фрагмент кода
источник
Я рекомендую эту ссылку - http://miloq.blogspot.in/2011/05/coordinates-mouse-click-canvas.html.
источник
x = new Number()
? Приведенный ниже код переназначает,x
что означает, что выделенное число сразу же отбрасываетсяВ Prototype используйте cumulativeOffset (), чтобы выполнить рекурсивное суммирование, как упомянуто Райаном Артеконой выше.
http://www.prototypejs.org/api/element/cumulativeoffset
источник
Вы могли бы просто сделать:
Это даст вам точное положение указателя мыши.
источник
Смотрите демонстрацию на http://jsbin.com/ApuJOSA/1/edit?html,output .
источник
Вот некоторые модификации вышеупомянутого решения Райана Артеконы.
источник
Во-первых, как уже говорили другие, вам нужна функция, чтобы получить положение элемента canvas . Вот метод, который немного более элегантен, чем некоторые другие на этой странице (IMHO). Вы можете передать ему любой элемент и получить его положение в документе:
Теперь вычислите текущую позицию курсора относительно этого:
Обратите внимание, что я отделил универсальную
findPos
функцию от кода обработки событий. ( Так и должно быть . Мы должны стараться, чтобы наши функции выполнялись по одной задаче.)Значения
offsetLeft
иoffsetTop
относительноoffsetParent
, которые могут быть каким-тоdiv
узлом- оберткой (или что-то еще, в этом отношении). Когда нет элементов, обертывающихcanvas
их, они относительноbody
, поэтому нет смещения для вычитания. Вот почему нам нужно определить положение холста, прежде чем мы сможем сделать что-то еще.Похоже,
e.pageX
иe.pageY
задайте положение курсора относительно документа. Вот почему мы вычитаем смещение холста из этих значений, чтобы получить истинную позицию.Альтернативой для позиционируемых элементов является непосредственное использование значений
e.layerX
иe.layerY
. Это менее надежно, чем описанный выше метод, по двум причинам:источник
ThreeJS r77
Попробовав много решений. Это сработало для меня. Может помочь кому-то еще, следовательно, размещения. Получил это отсюда
источник
Вот упрощенное решение (это не работает с границами / прокруткой):
источник
Я создавал приложение, имеющее холст поверх PDF, которое включало в себя множество изменений размера холста, таких как увеличение и уменьшение размера PDF, и, в свою очередь, при каждом увеличении / уменьшении PDF мне приходилось изменять размер холста, чтобы адаптировать его. размер pdf, я просмотрел множество ответов в stackOverflow и не нашел идеального решения, которое в конечном итоге решит проблему.
Я использовал rxjs и angular 6 и не нашел ответа, относящегося к самой новой версии.
Вот весь фрагмент кода, который был бы полезен для тех, кто использует rxjs для рисования поверх холста.
А вот фрагмент, который фиксирует координаты мыши относительно размера холста, независимо от того, как вы увеличиваете / уменьшаете холст.
источник
Привет, это в додзё, просто потому, что у меня уже есть код для проекта.
Должно быть достаточно очевидно, как преобразовать его обратно в не-додзё ванильный JavaScript.
Надеюсь, это поможет.
источник