Jaki jest najprostszy sposób dodania modułu obsługi zdarzenia kliknięcia do elementu canvas, który zwróci współrzędne xiy kliknięcia (względem elementu canvas)?
Nie jest wymagana starsza kompatybilność przeglądarki, wystarczy Safari, Opera i Firefox.
javascript
canvas
Tomek
źródło
źródło
Odpowiedzi:
Edycja 2018: Ta odpowiedź jest dość stara i wykorzystuje sprawdzanie starych przeglądarek, które nie są już potrzebne, ponieważ
clientX
iclientY
właściwości działają we wszystkich obecnych przeglądarkach. Możesz sprawdzić Patriques Answer, aby uzyskać prostsze, nowsze rozwiązanie.Oryginalna odpowiedź:
Jak opisano w artykule, który wtedy znalazłem, ale już nie istnieje:
Działa dla mnie idealnie.
źródło
Jeśli podoba Ci się prostota, ale nadal chcesz korzystać z wielu przeglądarek, to rozwiązanie okazało się dla mnie najlepsze. Jest to uproszczenie rozwiązania @ Aldekein, ale bez jQuery .
źródło
getBoundingClientRect
zwraca pozycje względem portu widoku? Więc moje przypuszczenie było błędne. Nigdy tego nie testowałem, ponieważ nigdy nie stanowiło to dla mnie problemu i uprzejmie chciałem ostrzec innych czytelników przed potencjalnym problemem, który widziałem, ale dziękuję za wyjaśnienie.var canvas = document.getElementById('canvasID'); canvas.addEventListener("mousedown", function (e) { getCursorPosition(canvas, e);});
Aktualizacja (5/5/16): zamiast tego należy użyć odpowiedzi patriques , ponieważ jest ona zarówno prostsza, jak i bardziej niezawodna.
Ponieważ płótno nie zawsze jest stylizowane względem całej strony,
canvas.offsetLeft/Top
nie zawsze zwraca to, czego potrzebujesz. Zwróci liczbę pikseli, które są przesunięte względem elementu offsetParent, który może być czymś w rodzajudiv
elementu zawierającego płótno zposition: relative
zastosowanym stylem. Aby to uwzględnić, należy zapętlić łańcuchoffsetParent
s, zaczynając od samego elementu canvas. Ten kod działa dla mnie idealnie, przetestowany w Firefox i Safari, ale powinien działać dla wszystkich.Ostatni wiersz ułatwia uzyskanie współrzędnych myszy względem elementu canvas. Aby uzyskać przydatne współrzędne, wystarczy
źródło
event.offsetX
ievent.offsetY
atrybuty, więc zmodyfikowałem Twoje rozwiązanie, dodającif (event.offsetX !== undefined && event.offsetY !== undefined) { return {x:event.offsetX, y:event.offsetY}; }
. wygląda na to, że to działa.event.offsetX
ievent.offsetY
który działa również w IE9. W przeglądarce Firefox (testowanej w / v13) możesz używaćevent.layerX
ievent.layerY
.canvasX = event.pageX - totalOffsetX - document.body.scrollLeft; canvasY = event.pageY - totalOffsetY - document.body.scrollTop;
Nowoczesna przeglądarka obsługuje teraz to za Ciebie. Chrome, IE9 i Firefox obsługują offsetX / Y w ten sposób, przekazując zdarzenie z modułu obsługi kliknięć.
Większość współczesnych przeglądarek obsługuje także warstwy X / Y, jednak Chrome i IE używają warstwy X / Y do bezwzględnego przesunięcia kliknięcia strony, w tym marginesu, wypełnienia itp. W przeglądarce Firefox warstwy X / Y i offset X / Y są równoważne, ale przesunięcie nie wcześniej nie istniały. Aby zapewnić zgodność z nieco starszymi przeglądarkami, możesz użyć:
źródło
Według świeżego Quirks Mode
clientX
iclientY
metody są obsługiwane we wszystkich głównych przeglądarkach. No i proszę - dobry, działający kod, który działa w przewijanym div na stronie z paskami przewijania:Wymaga to również jQuery dla
$(canvas).offset()
.źródło
Wykonałem pełną demonstrację, która działa w każdej przeglądarce, z pełnym kodem źródłowym rozwiązania tego problemu: współrzędne kliknięcia myszą Canvas w Javascript . Aby wypróbować wersję demonstracyjną, skopiuj kod i wklej go do edytora tekstu. Następnie zapisz go jako example.html, a na koniec otwórz plik za pomocą przeglądarki.
źródło
Oto niewielka modyfikacja odpowiedzi Ryana Artecony na płótna o zmiennej (%) szerokości:
źródło
Zachowaj ostrożność podczas konwersji współrzędnych; w zdarzeniu kliknięcia zwracanych jest wiele wartości niepochodzących z różnych przeglądarek. Używanie samych clientX i clientY nie jest wystarczające, jeśli okno przeglądarki jest przewijane (zweryfikowane w Firefox 3.5 i Chrome 3.0).
W tym artykule o dziwactwach podano bardziej poprawną funkcję, która może używać pageX lub pageY lub kombinacji clientX z document.body.scrollLeft i clientY z document.body.scrollTop do obliczenia współrzędnej kliknięcia względem początku dokumentu.
AKTUALIZACJA: Dodatkowo offsetLeft i offsetTop odnoszą się do wielkości wypełnienia elementu, a nie do rozmiaru wnętrza. Kanwa z zastosowanym dopełnieniem: styl nie będzie raportować lewego górnego rogu swojego obszaru zawartości jako offsetLeft. Istnieją różne rozwiązania tego problemu; najprostszym może być usunięcie wszystkich stylów obramowania, wypełnienia itp. z samego płótna i zastosowanie ich do pudełka zawierającego płótno.
źródło
Nie jestem pewien, jaki jest sens tych wszystkich odpowiedzi, które przechodzą przez elementy nadrzędne i robią różnego rodzaju dziwne rzeczy .
HTMLElement.getBoundingClientRect
Sposób jest przeznaczony do obsługiwać rzeczywiste położenie ekranu w elemencie. Obejmuje to przewijanie, więc takie rzeczyscrollTop
nie są potrzebne:Normalny obraz
Bardzo najprostsze podejście zostało już wysłane tutaj. Jest to poprawne, o ile nie są zaangażowane żadne dzikie reguły CSS .
Obsługa rozciągniętego płótna / obrazu
Gdy szerokość piksela obrazu nie jest dopasowana do szerokości CSS, musisz zastosować pewien stosunek wartości pikseli:
Tak długo, jak płótno nie ma granicy, działa na rozciągnięte obrazy (jsFiddle) .
Obsługa granic CSS
Jeśli płótno ma grubą ramkę, sprawy stają się mało skomplikowane . Musisz dosłownie odjąć ramkę od prostokąta ograniczającego. Można to zrobić za pomocą .getComputedStyle . Ta odpowiedź opisuje proces .
Funkcja następnie trochę rośnie:
Nie mogę wymyślić niczego, co mogłoby pomylić tę ostateczną funkcję. Zobacz siebie w JsFiddle .
Notatki
Jeśli nie lubisz modyfikować natywnych
prototype
, po prostu zmień funkcję i wywołaj ją za pomocą(canvas, event)
(i zastąp dowolnąthis
zcanvas
).źródło
Oto bardzo fajny samouczek
http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/
mam nadzieję że to pomoże!
źródło
width
/height
przesłonięcie, ale nadal jest jednym z najlepszych rozwiązań.Korzystając z jQuery w 2016 roku, aby uzyskać współrzędne kliknięcia względem obszaru roboczego, wykonuję:
Działa to, ponieważ zarówno canvas offset (), jak i jqEvent.pageX / Y są względem dokumentu niezależnie od położenia przewijania.
Zauważ, że jeśli twoje płótno jest skalowane, wówczas te współrzędne nie są takie same jak współrzędne logiczne płótna . Aby je uzyskać, wykonaj także :
źródło
Jest to więc zarówno prosty, ale nieco bardziej skomplikowany temat, niż się wydaje.
Po pierwsze, najczęściej są tu pytania skonfliktowane
Jak uzyskać względne współrzędne myszy elementu
Jak uzyskać współrzędne myszy Canvas Canvas dla API 2D Canvas lub WebGL
więc odpowiedzi
Jak uzyskać względne współrzędne myszy elementu
Niezależnie od tego, czy element jest płótnem otrzymującym element, względne współrzędne myszy są takie same dla wszystkich elementów.
Istnieją 2 proste odpowiedzi na pytanie „Jak uzyskać względne współrzędne myszy względem obszaru roboczego”
Prosta odpowiedź nr 1 użycie
offsetX
ioffsetY
Ta odpowiedź działa w Chrome, Firefox i Safari. W przeciwieństwie do wszystkich innych wartości zdarzeń
offsetX
ioffsetY
uwzględniają transformacje CSS.Największym problemem
offsetX
ioffsetY
jest od 2019/05, że nie istnieją one na zdarzeniach dotykowych, więc nie można ich używać z iOS Safari. Istnieją one w Zdarzeniach Wskaźnikowych, które istnieją w Chrome i Firefox, ale nie w Safari, chociaż najwyraźniej Safari na tym działa .Inną kwestią jest to, że wydarzenia muszą znajdować się na samym płótnie. Jeśli umieścisz je na jakimś innym elemencie lub oknie, nie będziesz mógł później wybrać płótna jako punktu odniesienia.
Prosta odpowiedź nr 2
clientX
,clientY
icanvas.getBoundingClientRect
Jeśli nie obchodzi Cię transformacja CSS, następną najprostszą odpowiedzią jest wywołanie
canvas. getBoundingClientRect()
i odjęcie lewej odclientX
itop
odclientY
jak wBędzie to działać, dopóki nie będzie transformacji CSS. Działa również ze zdarzeniami dotykowymi, więc będzie działać z Safari iOS
Jak uzyskać współrzędne myszy Canvas Canvas dla interfejsu API 2D Canvas
W tym celu musimy wziąć wartości, które otrzymaliśmy powyżej, i przekonwertować z rozmiaru wyświetlanego płótna na liczbę pikseli w samym płótnie
z
canvas.getBoundingClientRect
iclientX
aclientY
lub z
offsetX
ioffsetY
Uwaga: we wszystkich przypadkach nie dodawaj do kanwy wypełnienia ani obramowań. Może to znacznie skomplikować kod. Zamiast tego chcesz, aby obramowanie lub wypełnienie otaczały płótno w jakimś innym elemencie i dodaj wypełnienie i / lub granicę do elementu zewnętrznego.
Przykład roboczy przy użyciu
event.offsetX
,event.offsetY
Pokaż fragment kodu
Przykład pracuje używając
canvas.getBoundingClientRect
ievent.clientX
aevent.clientY
Pokaż fragment kodu
źródło
Polecam ten link - http://miloq.blogspot.in/2011/05/coordinates-mouse-click-canvas.html
źródło
x = new Number()
? Poniższy kod ponownie przypisuje,x
co oznacza, że przydzielony numer jest natychmiast odrzucanyW Prototypie użyj cumulativeOffset (), aby wykonać rekurencyjne sumowanie, jak wspomniano powyżej Ryan Artecona.
http://www.prototypejs.org/api/element/cumulativeoffset
źródło
Możesz po prostu zrobić:
To da ci dokładne położenie wskaźnika myszy.
źródło
Zobacz demo na http://jsbin.com/ApuJOSA/1/edit?html,output .
źródło
Oto kilka modyfikacji powyższego rozwiązania Ryana Artecony.
źródło
Po pierwsze, jak powiedzieli inni, potrzebujesz funkcji, aby uzyskać pozycję elementu canvas . Oto metoda, która jest nieco bardziej elegancka niż niektóre inne na tej stronie (IMHO). Możesz przekazać dowolny element i uzyskać jego pozycję w dokumencie:
Teraz obliczyć bieżącą pozycję kursora względem tego:
Zauważ, że oddzieliłem funkcję ogólną
findPos
od kodu obsługi zdarzeń. ( Tak jak powinno być . Powinniśmy starać się, aby nasze funkcje spełniały jedno zadanie).Wartości
offsetLeft
ioffsetTop
są względemoffsetParent
, które mogą być jakimśdiv
węzłem otoki (lub cokolwiek innego, jeśli o to chodzi). Kiedy nie ma zawijania elementów,canvas
są one względem siebiebody
, więc nie ma przesunięcia do odjęcia. Dlatego musimy ustalić pozycję płótna, zanim będziemy mogli zrobić cokolwiek innego.Podobnie
e.pageX
ie.pageY
podaj pozycję kursora względem dokumentu. Dlatego odejmujemy przesunięcie obszaru roboczego od tych wartości, aby dojść do prawdziwej pozycji.Alternatywa dla pozycjonowanego elementów jest bezpośrednie użycie wartości
e.layerX
ie.layerY
. Jest to mniej niezawodne niż powyższa metoda z dwóch powodów:źródło
ThreeJS r77
Po wypróbowaniu wielu rozwiązań. To zadziałało dla mnie. Może więc pomóc komuś innemu w tym zakresie. Mam to stąd
źródło
Oto uproszczone rozwiązanie (nie działa z ramkami / przewijaniem):
źródło
Tworzyłem aplikację mającą obszar roboczy nad plikiem pdf, który wymagał wielu zmian rozmiaru obszaru roboczego, takich jak powiększanie i pomniejszanie formatu pdf, a następnie przy każdym powiększaniu / zmniejszaniu formatu PDF musiałem zmieniać rozmiar obszaru roboczego, aby dostosować rozmiar pliku pdf, przejrzałem wiele odpowiedzi w stackOverflow i nie znalazłem idealnego rozwiązania, które ostatecznie rozwiąże problem.
Używałem rxjs i kątowego 6, i nie znaleziono żadnej odpowiedzi wprowadzonych w najnowszej wersji.
Oto cały fragment kodu, który byłby pomocny dla każdego, kto wykorzystuje rxjs do rysowania na płótnie.
A oto fragment, który naprawia, współrzędne myszy w stosunku do rozmiaru płótna, niezależnie od tego, jak powiększasz / zmniejszasz płótno.
źródło
Hej, to jest w dojo, tylko dlatego, że mam już kod do projektu.
Powinno być dość oczywiste, jak przekonwertować go z powrotem na JavaScript JavaScript bez dojo.
Mam nadzieję, że to pomaga.
źródło