Quiero hacer una pequeña aplicación de pintura usando lienzo. Entonces necesito encontrar la posición del mouse en el lienzo.
javascript
Ben Shelock
fuente
fuente
Respuestas:
Para las personas que usan JQuery:
A veces, cuando tiene elementos anidados, uno de ellos con el evento adjunto, puede ser confuso comprender lo que su navegador ve como padre. Aquí, puede especificar qué padre.
Toma la posición del mouse y luego la resta de la posición de desplazamiento del elemento principal.
Si está intentando obtener la posición del mouse en una página dentro de un panel de desplazamiento:
O la posición relativa a la página:
Tenga en cuenta la siguiente optimización del rendimiento:
De esta manera, JQuery no tiene que buscar
#element
cada línea.Actualizar
A continuación, hay una versión más reciente, solo JavaScript, de @anytimecoder a continuación para los navegadores que admiten getBoundingClientRect () .
fuente
var y = (evt.pageY - $('#element').offset().left) + $(window).scrollTop();
avar y = (evt.pageY - $('#element').offset().top) + $(window).scrollTop();
Como no encontré una respuesta sin jQuery que pudiera copiar / pegar, aquí está la solución que utilicé:
JSFiddle de ejemplo completo
fuente
e.currentTarget
, no e.target. De lo contrario, elementos secundarios que afectaránA continuación se calcula la relación de posición del mouse con el elemento del lienzo:
En este ejemplo, se
this
refiere alexample
elemento ye
es elonmousemove
evento.fuente
var example = document.getElementById('example'); example.onmousemove = function(e) { var X = e.pageX - this.offsetLeft; var Y = e.pageY - this.offsetTop; }
this
ae.currentTarget
, eso le dará la posición relativa al elemento al que agregó el detector de eventos.No hay respuesta en javascript puro que devuelva coordenadas relativas cuando el elemento de referencia está anidado dentro de otros que pueden estar con posicionamiento absoluto. Aquí hay una solución para este escenario:
fuente
html
desplazamiento del elementowhile(reference !== undefined)
conwhile(reference)
. Al menos en Chrome, el offsetParent no termina siendoundefined
, peronull
. Solo verificar sireference
es verdadero asegurará que funcione con ambosundefined
ynull
.offsetParent
propiedad, ¡que resulta ser muy útil en otras situaciones!scrollLeft
yscrollTop
compensar a los descendientes desplazados.Una buena reseña de la dificultad de este problema se puede encontrar aquí: http://www.quirksmode.org/js/events_properties.html#position
Usando la técnica que se describe allí, puede encontrar la posición de los ratones en el documento. A continuación, sólo comprobar para ver si está dentro del cuadro delimitador del elemento, que se puede encontrar por llamada
element.getBoundingClientRect()
que devolverá un objeto con las siguientes propiedades:{ bottom, height, left, right, top, width }
. A partir de ahí, es trivial averiguar si incluso sucedió dentro de su elemento o no.fuente
Probé todas estas soluciones y, debido a mi configuración especial con un contenedor transformado por matriz (biblioteca panzoom), ninguna funcionó. Esto devuelve el valor correcto, incluso si se amplía y se panoramiza:
Pero solo si no hay elementos secundarios en el camino. Esto se puede evitar al hacerlos 'invisibles' para el evento, usando CSS:
fuente
Me encontré con esta pregunta, pero para que funcione para mi caso (usando dragover en un elemento DOM (no siendo lienzo en mi caso)), descubrí que solo tienes que usar
offsetX
yoffsetY
en el evento dragover-mouse .fuente
I +1 'La respuesta de Mark van Wyk, ya que me llevó en la dirección correcta, pero no lo resolvió por mí. Todavía tenía un desplazamiento en la pintura en elementos contenidos dentro de otro elemento.
Siguiendo me lo resolvió:
En otras palabras, simplemente apilé todos los desplazamientos de todos los elementos anidados
fuente
Ninguna de las respuestas anteriores es IMO satisfactoria, así que esto es lo que uso:
Y si alguna vez necesita saber la posición actual de desplazamiento Y de la página:
fuente
Para aquellos de ustedes que desarrollan sitios web regulares o PWAs (Progressive Web Apps) para dispositivos móviles y / o computadoras portátiles / monitores con pantallas táctiles, entonces han aterrizado aquí porque pueden estar acostumbrados a los eventos del mouse y son nuevos en la experiencia a veces dolorosa de Touch eventos ... yay!
Solo hay 3 reglas:
mousemove
otouchmove
eventos.mousedown
otouchstart
eventos.No hace falta decir que las cosas son más complicadas con los
touch
eventos porque puede haber más de uno y son más flexibles (complicados) que los eventos del mouse. Solo voy a cubrir un solo toque aquí. Sí, estoy siendo flojo, pero es el tipo de toque más común, así que ahí.¿Prefieres usar Vue.js ? ¡Hago! Entonces su HTML se vería así:
fuente
puedes conseguirlo
fuente
Tomado de este tutorial , con correcciones hechas gracias al comentario superior:
Usar en un lienzo de la siguiente manera:
fuente
Me doy cuenta de que llego un poco tarde, pero esto funciona con JavaScript PURE, e incluso le da las coordenadas del puntero dentro del elemento si el elemento es más grande que la ventana gráfica y el usuario se ha desplazado.
Lo primero que hacemos es obtener la ubicación del elemento HTML (el área de contenido) en relación con la ventana gráfica actual. Si la página tiene barras de desplazamiento y se desplaza, el número devuelto por
getBoundingClientRect().left
la etiqueta html será negativo. Luego usamos este número para calcular la distancia entre el elemento y la izquierda del área de contenido. Conelement_offset_x = element.getBoundingClientRect().left......;
Conocer la distancia del elemento desde el área de contenido.
event.clientX
nos da la distancia del puntero desde la ventana gráfica. Es importante comprender que la ventana gráfica y el área de contenido son dos entidades diferentes, la ventana gráfica puede moverse si se desplaza la página. Por lo tanto, clientX devolverá el MISMO número incluso si se desplaza la página.Para compensar esto, necesitamos agregar la posición x del puntero (en relación con la ventana gráfica), a la posición x de la ventana gráfica (en relación con el área de contenido). La posición X de la ventana gráfica se encuentra con
window.pageXOffset.
fuente
Basado en la solución de @ Spider, mi versión no JQuery es esta:
Esto funciona tanto con desplazamiento como con zoom (en cuyo caso a veces devuelve flotantes).
fuente
Las coordenadas del mouse dentro de un lienzo se pueden obtener gracias a event.offsetX y event.offsetY. Aquí hay un pequeño fragmento para probar mi punto:
fuente
HTMLElement.offsetLeft
La
HTMLElement.offsetLeft
propiedad de solo lectura devuelve el número de píxeles que la esquina superior izquierda del elemento actual está desplazada a la izquierda dentro delHTMLElement.offsetParent
nodo.Para los elementos a nivel de bloque,
offsetTop
,offsetLeft
,offsetWidth
, yoffsetHeight
describir el cuadro de borde de un elemento con respecto a laoffsetParent
.Sin embargo, para elementos de nivel en línea (como
span
) que pueden ajustarse de una línea a la siguiente,offsetTop
yoffsetLeft
describir las posiciones del primer cuadro de borde (usarElement.getClientRects()
para obtener su ancho y alto), mientras queoffsetWidth
yoffsetHeight
describir las dimensiones del cuadro de borde delimitador (useElement.getBoundingClientRect()
para obtener su posición). Por lo tanto, una caja con la izquierda, superior, anchura y altura deoffsetLeft
,offsetTop
,offsetWidth
yoffsetHeight
no será un cuadro delimitador por una duración con el texto envuelto.HTMLElement.offsetTop
La
HTMLElement.offsetTop
propiedad de solo lectura devuelve la distancia del elemento actual en relación con la parte superior deloffsetParent
nodo.MouseEvent.pageX
La
pageX
propiedad de solo lectura devuelve la coordenada X (horizontal) en píxeles del evento en relación con todo el documento. Esta propiedad tiene en cuenta cualquier desplazamiento horizontal de la página.MouseEvent.pageY
La
MouseEvent.pageY
propiedad de solo lectura devuelve la coordenada Y (vertical) en píxeles del evento en relación con todo el documento. Esta propiedad tiene en cuenta cualquier desplazamiento vertical de la página.Para obtener más información, consulte la red de desarrolladores de Mozilla:
https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/pageX https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/pageY https: // developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetLeft https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetTop
fuente
page
yoffset
sería muy útil para mí. ¡Gracias por considerar esta solicitud!Implementé otra solución que creo que es muy simple, así que pensé en compartirla con ustedes.
Entonces, el problema para mí fue que el div arrastrado saltaría a 0,0 para el cursor del mouse. Así que necesitaba capturar la posición de los ratones en el div para ajustar la nueva posición del divs.
Leo los divs PageX y PageY y establezco la parte superior e izquierda de acuerdo con eso y luego para obtener los valores para ajustar las coordenadas para mantener el cursor en la posición inicial en el div, uso un escucha onDragStart y almaceno el e.nativeEvent .layerX y e.nativeEvent.layerY que solo en el disparador inicial le da la posición de los ratones dentro del div arrastrable.
Código de ejemplo:
Espero que esto ayude a alguien que pasó por los mismos problemas que yo pasé :)
fuente
esto funciona bien!
fuente
Tienes que conocer la estructura de tu página, porque si tu lienzo es hijo de un div que a su vez es hijo de otro div ... entonces la historia se vuelve más complicada. Aquí está mi código para un lienzo que está dentro de 2 niveles de div s:
});
fuente
La respuesta original decía ponerlo en un iframe. La mejor solución es usar los eventos offsetX y offsetY en un lienzo que tenga el relleno establecido en 0px.
fuente
Esto es lo que tengo.
fuente
Puedes usar
getBoudingClientRect()
elrelative
padre.fuente