Quero fazer um pequeno aplicativo de pintura usando tela. Então, preciso encontrar a posição do mouse na tela.
javascript
Ben Shelock
fonte
fonte
Respostas:
Para pessoas que usam JQuery:
Às vezes, quando você aninha elementos, um deles com o evento associado, pode ser confuso entender o que o navegador vê como pai. Aqui, você pode especificar qual pai.
Você toma a posição do mouse e subtrai-a da posição de deslocamento do elemento pai.
Se você estiver tentando obter a posição do mouse em uma página dentro de um painel de rolagem:
Ou a posição relativa à página:
Observe a seguinte otimização de desempenho:
Dessa maneira, o JQuery não precisa procurar
#element
por cada linha.Atualizar
Há uma versão mais recente, somente para JavaScript, abaixo, de @anytimecoder abaixo, para navegadores que suportam getBoundingClientRect () .
fonte
var y = (evt.pageY - $('#element').offset().left) + $(window).scrollTop();
avar y = (evt.pageY - $('#element').offset().top) + $(window).scrollTop();
Como não encontrei uma resposta sem jQuery que pudesse copiar / colar, eis a solução que usei:
JSFiddle do exemplo completo
fonte
e.currentTarget
, não o e.target. Caso contrário, os elementos filhos vão afetá-loA seguir, calcula a relação da posição do mouse com o elemento da tela:
Neste exemplo,
this
refere-se aoexample
elemento ee
é oonmousemove
eventofonte
var example = document.getElementById('example'); example.onmousemove = function(e) { var X = e.pageX - this.offsetLeft; var Y = e.pageY - this.offsetTop; }
this
parae.currentTarget
, que fornecerá a posição em relação ao elemento ao qual você adicionou o ouvinte de evento.Não há resposta em javascript puro que retorne coordenadas relativas quando o elemento de referência estiver aninhado dentro de outros que possam estar com posicionamento absoluto. Aqui está uma solução para este cenário:
fonte
html
elemento de compensaçãowhile(reference !== undefined)
porwhile(reference)
. No Chrome, pelo menos, o offsetParent não acaba sendoundefined
, masnull
. Apenas verificar sereference
é verdade garantirá que funcione com ambosundefined
enull
.offsetParent
propriedade, o que acaba sendo muito útil também em outras situações!scrollLeft
escrollTop
compensar descendentes rolados.Uma boa descrição da dificuldade desse problema pode ser encontrada aqui: http://www.quirksmode.org/js/events_properties.html#position
Usando a técnica descrita lá, você pode encontrar a posição do mouse no documento. Então você acabou de verificar para ver se ele está dentro da caixa delimitadora do seu elemento, onde pode encontrar chamando
element.getBoundingClientRect()
que irá retornar um objeto com as seguintes propriedades:{ bottom, height, left, right, top, width }
. A partir daí, é trivial descobrir se o mesmo aconteceu dentro do seu elemento ou não.fonte
Tentei todas essas soluções e, devido à minha configuração especial com um contêiner transformado em matriz (biblioteca panzoom), nenhum funcionou. Isso retorna o valor correto, mesmo se ampliado e panorâmico:
Mas somente se não houver elementos filhos no caminho. Isso pode ser contornado, tornando-os 'invisíveis' para o evento, usando CSS:
fonte
Me deparei com essa pergunta, mas, para fazê-lo funcionar no meu caso (usando dragover em um elemento DOM (não sendo canvas no meu caso)), descobri que você só precisa usar
offsetX
eoffsetY
no evento dragover-mouse .fonte
Marquei a resposta de Mark van Wyk com +1, pois ela me levou na direção certa, mas não a resolveu completamente para mim. Eu ainda tinha um deslocamento na pintura de elementos contidos em outro elemento.
A seguir resolvi isso para mim:
Em outras palavras - eu simplesmente empilhei todas as compensações de todos os elementos aninhados
fonte
Nenhuma das respostas acima é satisfatória IMO, então aqui está o que eu uso:
E se você precisar conhecer a atual posição de rolagem Y da página:
fonte
Para aqueles que desenvolvem sites regulares ou PWAs (Progressive Web Apps) para dispositivos móveis e / ou laptops / monitores com telas sensíveis ao toque, você chegou aqui porque pode estar acostumado a eventos de mouse e é novo na experiência às vezes dolorosa do Touch eventos ... yay!
Existem apenas três regras:
mousemove
outouchmove
eventos.mousedown
outouchstart
eventos.Escusado será dizer que as coisas são mais complicadas com os
touch
eventos porque podem haver mais de um e são mais flexíveis (complicadas) que os eventos do mouse. Eu só vou cobrir um único toque aqui. Sim, estou sendo preguiçoso, mas é o tipo de toque mais comum, então existe.Prefere usar o Vue.js ? Eu faço! Então seu HTML ficaria assim:
fonte
você pode obtê-lo
fonte
Retirado deste tutorial , com correções feitas graças ao comentário principal:
Use em uma tela da seguinte maneira:
fonte
Percebo que estou um pouco atrasado, mas isso funciona com javascript PURE e ainda fornece as coordenadas do ponteiro dentro do elemento se o elemento for maior que a viewport e o usuário tiver rolado.
A primeira coisa que fazemos é obter a localização do elemento HTML (a área de conteúdo) em relação à viewport atual. Se a página tiver barras de rolagem e estiver rolada, o número retornado pela
getBoundingClientRect().left
tag html será negativo. Em seguida, usamos esse número para calcular a distância entre o elemento e a esquerda da área de conteúdo. Comelement_offset_x = element.getBoundingClientRect().left......;
Conhecendo a distância do elemento da área de conteúdo.
event.clientX
nos dá a distância do ponteiro da janela de visualização. É importante entender que a viewport e a área de conteúdo são duas entidades diferentes; a viewport pode se mover se a página for rolada. Portanto, o clientX retornará o mesmo número, mesmo que a página seja rolada.Para compensar isso, precisamos adicionar a posição x do ponteiro (em relação à viewport), à posição x da viewport (em relação à área de conteúdo). A posição X da viewport é encontrada com
window.pageXOffset.
fonte
Com base na solução do @ Spider, minha versão não JQuery é a seguinte:
Isso funciona tanto com rolagem quanto com zoom (nesse caso, às vezes, ele retorna flutuantes).
fonte
As coordenadas do mouse dentro de uma tela podem ser obtidas graças a event.offsetX e event.offsetY. Aqui está um pequeno trecho para provar meu argumento:
fonte
HTMLElement.offsetLeft
A
HTMLElement.offsetLeft
propriedade somente leitura retorna o número de pixels que o canto superior esquerdo do elemento atual é deslocado para a esquerda dentro doHTMLElement.offsetParent
nó.Para elementos de bloco,
offsetTop
,offsetLeft
,offsetWidth
, eoffsetHeight
descrevem a caixa fronteira de um elemento em relação aooffsetParent
.No entanto, para os elementos de nível em linha (tal como
span
) que pode envolver a partir de uma linha para a seguinte,offsetTop
eoffsetLeft
descrevem as posições da primeira caixa da fronteira (usoElement.getClientRects()
para obter a sua largura e altura), enquantooffsetWidth
eoffsetHeight
descrever as dimensões da caixa de fronteira delimitadora (useElement.getBoundingClientRect()
para obter sua posição). Portanto, uma caixa com a esquerda, superior, largura e altura deoffsetLeft
,offsetTop
,offsetWidth
eoffsetHeight
não será uma caixa delimitadora para um período com o texto envolvido.HTMLElement.offsetTop
A
HTMLElement.offsetTop
propriedade somente leitura retorna a distância do elemento atual em relação à parte superior dooffsetParent
nó.MouseEvent.pageX
A
pageX
propriedade somente leitura retorna a coordenada X (horizontal) em pixels do evento em relação ao documento inteiro. Essa propriedade leva em consideração qualquer rolagem horizontal da página.MouseEvent.pageY
A
MouseEvent.pageY
propriedade somente leitura retorna a coordenada Y (vertical) em pixels do evento em relação ao documento inteiro. Essa propriedade leva em consideração qualquer rolagem vertical da página.Para mais explicações, consulte a Mozilla Developer Network:
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
fonte
page
eoffset
seria muito útil para mim. Obrigado por considerar esta solicitação!Eu implementei uma outra solução que eu acho muito simples, então pensei em compartilhar com vocês.
Portanto, o problema para mim era que a div arrastada saltaria para 0,0 para o cursor do mouse. Então, eu precisava capturar a posição do mouse no div para ajustar a nova posição do div.
Eu li as divs PageX e PageY e defino a parte superior e esquerda de acordo com isso e, em seguida, para obter os valores para ajustar as coordenadas para manter o cursor na posição inicial na div, uso um ouvinte onDragStart e armazeno o e.nativeEvent .layerX e e.nativeEvent.layerY que somente no acionador inicial fornecem a posição do mouse na div arrastável.
Código de exemplo:
Espero que isso ajude alguém que passou pelos mesmos problemas pelos quais passei :)
fonte
isso funciona ok!
fonte
Você precisa conhecer a estrutura da sua página, porque se sua tela é filha de uma div que, por sua vez, é filha de outra div ... então a história fica mais complicada. Aqui está o meu código para uma tela que está dentro de 2 níveis de div s:
});
fonte
A resposta original disse para colocá-lo em um iframe. A melhor solução é usar os eventos offsetX e offsetY em uma tela com o preenchimento definido como 0px.
fonte
Aqui está o que eu tenho.
fonte
Você pode usar
getBoudingClientRect()
orelative
pai.fonte