Qual é a maneira mais simples de adicionar um manipulador de eventos click a um elemento da tela que retornará as coordenadas xey do clique (em relação ao elemento da tela)?
Nenhuma compatibilidade de navegador herdada é necessária, o Safari, o Opera e o Firefox farão.
javascript
canvas
Tom
fonte
fonte
Respostas:
Edit 2018: Esta resposta é bastante antiga e usa verificações para navegadores antigos que não são mais necessários, pois as propriedades
clientX
eclientY
funcionam em todos os navegadores atuais. Convém consultar o Patriques Answer para obter uma solução mais simples e mais recente.Resposta original:
Conforme descrito em um artigo que encontrei na época, mas não existe mais:
Funcionou perfeitamente bem para mim.
fonte
Se você gosta de simplicidade, mas ainda deseja funcionalidade entre navegadores, achei que essa solução funcionou melhor para mim. Esta é uma simplificação da solução da @ Aldekein, mas sem o jQuery .
fonte
getBoundingClientRect
retorna posições em relação à porta de visualização? Então meu palpite estava errado. Eu nunca o testei, pois isso nunca foi um problema para mim e, por gentileza, quis avisar outros leitores sobre um potencial problema que vi, mas obrigado por seu esclarecimento.var canvas = document.getElementById('canvasID'); canvas.addEventListener("mousedown", function (e) { getCursorPosition(canvas, e);});
Atualização (5/5/16): a resposta de patriques deve ser usada, pois é mais simples e mais confiável.
Como a tela nem sempre é estilizada em relação à página inteira,
canvas.offsetLeft/Top
ela nem sempre retorna o que você precisa. Ele retornará o número de pixels compensados em relação ao elemento offsetParent, que pode ser algo como umdiv
elemento que contém a tela com umposition: relative
estilo aplicado. Para explicar isso, você precisa percorrer a cadeia deoffsetParent
s, começando com o próprio elemento da tela. Este código funciona perfeitamente para mim, testado no Firefox e Safari, mas deve funcionar para todos.A última linha facilita as coisas para obter as coordenadas do mouse em relação a um elemento da tela. Tudo o que é necessário para obter as coordenadas úteis é
fonte
event.offsetX
eevent.offsetY
atributos, então modifiquei sua solução adicionandoif (event.offsetX !== undefined && event.offsetY !== undefined) { return {x:event.offsetX, y:event.offsetY}; }
. parece que funciona.event.offsetX
eevent.offsetY
também funciona no IE9. Para o Firefox (testado com v13), você pode usarevent.layerX
eevent.layerY
.canvasX = event.pageX - totalOffsetX - document.body.scrollLeft; canvasY = event.pageY - totalOffsetY - document.body.scrollTop;
O navegador moderno agora lida com isso para você. Chrome, IE9 e Firefox suportam o offsetX / Y assim, passando o evento pelo manipulador de cliques.
A maioria dos navegadores modernos também suporta layerX / Y, no entanto, Chrome e IE usam layerX / Y para o deslocamento absoluto do clique na página, incluindo margem, preenchimento, etc. No Firefox, layerX / Y e offsetX / Y são equivalentes, mas o deslocamento não existe anteriormente. Portanto, para compatibilidade com navegadores um pouco mais antigos, você pode usar:
fonte
De acordo com o novo Quirksmode, os métodos
clientX
eclientY
são suportados em todos os principais navegadores. Então, aqui vai - o código bom e funcional que funciona em uma div de rolagem em uma página com barras de rolagem:Isso também requer jQuery para
$(canvas).offset()
.fonte
Fiz uma demonstração completa que funciona em todos os navegadores com o código fonte completo da solução deste problema: Coordenadas de um mouse, clique em Canvas em Javascript . Para experimentar a demonstração, copie o código e cole-o em um editor de texto. Em seguida, salve-o como example.html e, finalmente, abra o arquivo com um navegador.
fonte
Aqui está uma pequena modificação na resposta de Ryan Artecona para telas com uma largura variável (%):
fonte
Seja cauteloso ao fazer a conversão de coordenadas; existem vários valores não relacionados ao navegador retornados em um evento de clique. Usar o clientX e o clientY por si só não será suficiente se a janela do navegador for rolada (verificada no Firefox 3.5 e Chrome 3.0).
Este artigo do modo quirks fornece uma função mais correta que pode usar pageX ou pageY ou uma combinação de clientX com document.body.scrollLeft e clientY com document.body.scrollTop para calcular a coordenada do clique em relação à origem do documento.
UPDATE: Além disso, offsetLeft e offsetTop são relativos ao tamanho acolchoado do elemento, não ao tamanho interior. Uma tela com o estilo padding: aplicado não reportará a parte superior esquerda de sua região de conteúdo como offsetLeft. Existem várias soluções para esse problema; o mais simples pode ser limpar todos os estilos de borda, preenchimento etc. na própria tela e aplicá-los a uma caixa que contém a tela.
fonte
Não sei ao certo qual é o objetivo de todas essas respostas que passam pelos elementos dos pais e fazem todo tipo de coisa estranha .
O
HTMLElement.getBoundingClientRect
método foi desenvolvido para lidar com a posição real da tela de qualquer elemento. Isso inclui rolagem; portanto, coisas do tiposcrollTop
não são necessárias:Imagem normal
A abordagem mais simples já foi publicada aqui. Isso está correto desde que nenhuma regra CSS selvagem esteja envolvida.
Manuseio de lona esticada / imagem
Quando a largura do pixel da imagem não corresponder à largura do CSS, será necessário aplicar uma proporção nos valores do pixel:
Contanto que a tela não tenha borda, ela funciona para imagens esticadas (jsFiddle) .
Manipulação de bordas CSS
Se a tela tem uma borda grossa, as coisas ficam um pouco complicadas . Você literalmente precisará subtrair a borda do retângulo delimitador. Isso pode ser feito usando .getComputedStyle . Esta resposta descreve o processo .
A função cresce um pouco:
Não consigo pensar em nada que confunda essa função final. Veja você mesmo no JsFiddle .
Notas
Se você não gosta de modificar os
prototype
s nativos , basta alterar a função e chamá-la por(canvas, event)
(e substituir qualquerthis
porcanvas
).fonte
Aqui está um tutorial muito bom
http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/
espero que isto ajude!
fonte
width
/height
substituído, mas ainda uma das melhores soluções.Usando jQuery em 2016, para obter coordenadas de clique em relação à tela, eu faço:
Isso funciona, pois o offset da tela () e o jqEvent.pageX / Y são relativos ao documento, independentemente da posição de rolagem.
Observe que, se sua tela for dimensionada, essas coordenadas não serão as mesmas que as coordenadas lógicas da tela . Para obtê-los, você também faria:
fonte
Portanto, este é um tópico simples, mas um pouco mais complicado do que parece.
Primeiro, geralmente existem questões conflitantes aqui
Como obter coordenadas relativas do elemento do mouse
Como obter coordenadas de mouse de pixel de tela para a API de tela 2D ou WebGL
então, respostas
Como obter coordenadas relativas do elemento do mouse
Se o elemento é ou não uma tela que obtém as coordenadas relativas do mouse é o mesmo para todos os elementos.
Existem 2 respostas simples para a pergunta "Como obter coordenadas relativas do mouse na tela"
Resposta simples nº 1: uso
offsetX
eoffsetY
Esta resposta funciona no Chrome, Firefox e Safari. Ao contrário de todos os outros valores de eventos
offsetX
eoffsetY
transforma take CSS em conta.O maior problema
offsetX
e, aoffsetY
partir de 2019/05, eles não existem em eventos de toque e, portanto, não podem ser usados com o iOS Safari. Eles existem nos Eventos de ponteiro que existem no Chrome e Firefox, mas não no Safari, embora aparentemente o Safari esteja trabalhando nele .Outra questão é que os eventos devem estar na própria tela. Se você colocá-los em algum outro elemento ou na janela, não será possível escolher a tela posteriormente como seu ponto de referência.
Resposta simples nº 2
clientX
, usoclientY
ecanvas.getBoundingClientRect
Se você não se importa com as transformações CSS, a próxima resposta mais simples é chamar
canvas. getBoundingClientRect()
e subtrair a esquerda declientX
etop
declientY
como emIsso funcionará desde que não haja transformações CSS. Também funciona com eventos de toque e, portanto, com o Safari iOS
Como obter coordenadas de mouse de pixel de tela para a API de tela 2D
Para isso, precisamos pegar os valores que obtivemos acima e converter do tamanho em que a tela é exibida para o número de pixels na própria tela
com
canvas.getBoundingClientRect
eclientX
eclientY
ou com
offsetX
eoffsetY
Nota: Em todos os casos, não adicione preenchimento ou bordas à tela. Fazer isso complicará bastante o código. Em vez de desejar uma borda ou preenchimento, coloque a tela em outro elemento e adicione o preenchimento e / ou borda ao elemento externo.
Exemplo de trabalho usando
event.offsetX
,event.offsetY
Mostrar snippet de código
Exemplo de trabalho usando
canvas.getBoundingClientRect
eevent.clientX
eevent.clientY
Mostrar snippet de código
fonte
Eu recomendo este link - http://miloq.blogspot.in/2011/05/coordinates-mouse-click-canvas.html
fonte
x = new Number()
? O código abaixo que reatribui, ox
que significa que o Número alocado é imediatamente descartadoNo Prototype, use cumulativeOffset () para fazer a somatória recursiva conforme mencionado por Ryan Artecona acima.
http://www.prototypejs.org/api/element/cumulativeoffset
fonte
Você poderia apenas fazer:
Isso fornecerá a posição exata do ponteiro do mouse.
fonte
Veja a demonstração em http://jsbin.com/ApuJOSA/1/edit?html,output .
fonte
Aqui estão algumas modificações da solução de Ryan Artecona acima.
fonte
Primeiro, como já foi dito, você precisa de uma função para obter a posição do elemento da tela . Aqui está um método um pouco mais elegante do que alguns dos outros desta página (IMHO). Você pode passar qualquer elemento e obter sua posição no documento:
Agora calcule a posição atual do cursor em relação a isso:
Observe que eu separei a
findPos
função genérica do código de manipulação de eventos. ( Como deveria ser . Devemos tentar manter nossas funções em uma tarefa cada.)Os valores de
offsetLeft
eoffsetTop
são relativos aoffsetParent
, que podem ser algumdiv
nó do wrapper (ou qualquer outra coisa, nesse caso). Quando não há um elemento agrupando,canvas
eles são relativos aobody
, portanto, não há deslocamento para subtrair. É por isso que precisamos determinar a posição da tela antes que possamos fazer qualquer outra coisa.Similary
e.pageX
ee.pageY
forneça a posição do cursor em relação ao documento. É por isso que subtraímos o deslocamento da tela desses valores para chegar à posição verdadeira.Uma alternativa para elementos posicionados é usar diretamente os valores de
e.layerX
ee.layerY
. Isso é menos confiável que o método acima por dois motivos:fonte
ThreeJS r77
Depois de tentar muitas soluções. Isso funcionou para mim. Pode ajudar alguém, portanto, postando. Entendi daqui
fonte
Aqui está uma solução simplificada (isso não funciona com bordas / rolagem):
fonte
Eu estava criando um aplicativo com uma tela sobre um pdf, que envolvia muitos redimensionamentos de tela, como Aumentar e diminuir o zoom do pdf e, por sua vez, a cada aumento / redução do PDF que eu tinha que redimensionar a tela para adaptar o No tamanho do pdf, passei por muitas respostas no stackOverflow e não encontrei uma solução perfeita que acabaria resolvendo o problema.
Eu estava usando rxjs e angular 6 e não encontrei nenhuma resposta específica para a versão mais recente.
Aqui está o trecho de código inteiro que seria útil para qualquer pessoa que utilize o rxjs para desenhar sobre a tela.
E aqui está o trecho que corrige, as coordenadas do mouse em relação ao tamanho da tela, independentemente de como você aumenta ou diminui o zoom na tela.
fonte
Ei, isso está no dojo, apenas porque é o que eu já tinha o código para um projeto.
Deve ser bastante óbvio como convertê-lo novamente em JavaScript sem dojo vanilla.
Espero que ajude.
fonte