Apa cara paling sederhana untuk menambahkan event handler klik ke elemen kanvas yang akan mengembalikan koordinat x dan y klik (relatif terhadap elemen kanvas)?
Tidak diperlukan kompatibilitas browser lama, Safari, Opera, dan Firefox akan melakukannya.
javascript
canvas
Tom
sumber
sumber
Jawaban:
Sunting 2018: Jawaban ini cukup lama dan menggunakan pemeriksaan untuk browser lama yang tidak diperlukan lagi, karena
clientX
danclientY
properti bekerja di semua browser saat ini. Anda mungkin ingin memeriksa Patriques Answer untuk solusi yang lebih sederhana dan lebih baru.Jawaban Asli:
Seperti yang dijelaskan dalam artikel yang saya temukan saat itu tetapi tidak ada lagi:
Bekerja dengan sangat baik untuk saya.
sumber
Jika Anda suka kesederhanaan tetapi tetap menginginkan fungsionalitas lintas-browser, saya menemukan solusi ini paling cocok untuk saya. Ini adalah penyederhanaan dari solusi @ Aldekein tetapi tanpa jQuery .
sumber
getBoundingClientRect
mengembalikan posisi relatif ke port tampilan? Kemudian tebakan saya salah. Saya tidak pernah mengujinya karena ini tidak pernah menjadi masalah bagi saya, dan saya ingin memperingatkan pembaca lain tentang potensi masalah yang saya lihat, tetapi terima kasih atas klarifikasi Anda.var canvas = document.getElementById('canvasID'); canvas.addEventListener("mousedown", function (e) { getCursorPosition(canvas, e);});
Memperbarui (5/5/16): Jawaban patriques harus digunakan sebagai gantinya, karena lebih sederhana dan lebih dapat diandalkan.
Karena kanvas tidak selalu ditata relatif terhadap seluruh halaman, kanvas
canvas.offsetLeft/Top
tidak selalu mengembalikan apa yang Anda butuhkan. Ini akan mengembalikan jumlah piksel yang diimbangi relatif terhadap elemen offsetParentnya, yang bisa berupadiv
elemen yang mengandung kanvas denganposition: relative
gaya yang diterapkan. Untuk menjelaskan ini, Anda perlu mengulang melalui rantaioffsetParent
s, dimulai dengan elemen kanvas itu sendiri. Kode ini berfungsi dengan baik untuk saya, diuji di Firefox dan Safari tetapi harus bekerja untuk semua.Baris terakhir memudahkan untuk mendapatkan koordinat mouse relatif terhadap elemen kanvas. Yang diperlukan untuk mendapatkan koordinat yang bermanfaat adalah
sumber
event.offsetX
danevent.offsetY
atribut, jadi saya memodifikasi solusi Anda dengan menambahkanif (event.offsetX !== undefined && event.offsetY !== undefined) { return {x:event.offsetX, y:event.offsetY}; }
. Sepertinya itu berfungsi.event.offsetX
danevent.offsetY
yang juga berfungsi di IE9. Untuk Firefox (diuji dengan v13), Anda dapat menggunakanevent.layerX
danevent.layerY
.canvasX = event.pageX - totalOffsetX - document.body.scrollLeft; canvasY = event.pageY - totalOffsetY - document.body.scrollTop;
Peramban modern sekarang menangani ini untuk Anda. Chrome, IE9, dan Firefox mendukung offsetX / Y seperti ini, melewati acara dari pengendali klik.
Sebagian besar browser modern juga mendukung layerX / Y, namun Chrome dan IE menggunakan layerX / Y untuk offset absolut dari klik pada halaman termasuk margin, padding, dll. Di Firefox, layerX / Y dan offsetX / Y adalah setara, tetapi offset tidak sebelumnya sudah ada. Jadi, untuk kompatibilitas dengan browser yang sedikit lebih tua, Anda dapat menggunakan:
sumber
Menurut segar Quirksmode yang
clientX
danclientY
metode yang didukung di semua browser utama. Jadi, begini - kode yang bagus dan berfungsi yang bekerja dalam scrolling div pada halaman dengan scrollbar:Ini juga memerlukan jQuery untuk
$(canvas).offset()
.sumber
Saya membuat demostrasi penuh yang berfungsi di setiap browser dengan kode sumber lengkap dari solusi masalah ini: Koordinat klik mouse pada Canvas dalam Javascript . Untuk mencoba demo, salin kode dan tempel ke editor teks. Kemudian simpan sebagai example.html dan, akhirnya, buka file dengan browser.
sumber
Berikut ini adalah modifikasi kecil untuk jawaban Ryan Artecona untuk kanvas dengan lebar variabel (%):
sumber
Berhati-hatilah saat melakukan konversi koordinat; ada beberapa nilai non-lintas-browser yang dikembalikan dalam acara klik. Menggunakan clientX dan clientY saja tidak cukup jika jendela browser digulir (diverifikasi di Firefox 3.5 dan Chrome 3.0).
Artikel mode quirks ini menyediakan fungsi yang lebih benar yang dapat menggunakan pageX atau pageY atau kombinasi clientX dengan document.body.scrollLeft dan clientY dengan document.body.scrollTop untuk menghitung koordinat klik relatif terhadap asal dokumen.
UPDATE: Selain itu, offsetLeft dan offsetTop relatif terhadap ukuran elemen yang empuk, bukan ukuran interior. Kanvas dengan padding: style yang diterapkan tidak akan melaporkan kiri atas wilayah kontennya sebagai offsetLeft. Ada berbagai solusi untuk masalah ini; yang paling sederhana mungkin untuk menghapus semua gaya border, padding, dll. pada kanvas itu sendiri dan sebaliknya menerapkannya ke kotak yang berisi kanvas.
sumber
Saya tidak yakin apa gunanya semua jawaban ini yang berulang melalui elemen induk dan melakukan semua jenis hal aneh .
The
HTMLElement.getBoundingClientRect
Metode ini dirancang untuk menangani posisi layar yang sebenarnya dari setiap elemen. Ini termasuk menggulir, jadi hal-hal sepertiscrollTop
tidak diperlukan:Gambar normal
The pendekatan yang sangat sederhana sudah diposting di sini. Ini benar selama tidak ada aturan CSS liar yang terlibat.
Menangani kanvas / gambar yang diregangkan
Saat lebar piksel gambar tidak cocok dengan lebar CSSnya, Anda harus menerapkan beberapa rasio pada nilai piksel:
Selama kanvas tidak memiliki batas, ia berfungsi untuk gambar yang diregangkan (jsFiddle) .
Menangani batas CSS
Jika kanvas memiliki batas tebal, hal-hal menjadi sedikit rumit . Anda benar-benar harus mengurangi batas dari persegi panjang pembatas. Ini dapat dilakukan dengan menggunakan .getComputedStyle . Jawaban ini menjelaskan prosesnya .
Fungsi kemudian tumbuh sedikit:
Saya tidak bisa memikirkan apa pun yang akan membingungkan fungsi akhir ini. Lihat dirimu di JsFiddle .
Catatan
Jika Anda tidak suka memodifikasi asli
prototype
, cukup ubah fungsinya dan panggil dengan(canvas, event)
(dan gantithis
dengancanvas
).sumber
Ini adalah tutorial yang sangat bagus
http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/
semoga ini membantu!
sumber
width
/height
override tetapi masih merupakan salah satu solusi terbaik.Menggunakan jQuery pada tahun 2016, untuk mendapatkan koordinat klik relatif terhadap kanvas, saya lakukan:
Ini berfungsi karena kanvas offset () dan jqEvent.pageX / Y relatif terhadap dokumen apa pun posisi gulirnya.
Perhatikan bahwa jika kanvas Anda diskalakan maka koordinat ini tidak sama dengan koordinat logis kanvas . Untuk mendapatkannya, Anda juga harus:
sumber
Jadi ini adalah topik yang sederhana namun sedikit lebih rumit dari yang terlihat.
Pertama, biasanya ada pertanyaan yang disatukan di sini
Cara mendapatkan koordinat relatif elemen mouse
Cara mendapatkan koordinat kanvas pixel mouse untuk 2D Canvas API atau WebGL
jadi, jawablah
Cara mendapatkan koordinat relatif elemen mouse
Apakah elemen adalah kanvas yang mendapatkan elemen koordinat mouse relatif sama untuk semua elemen.
Ada 2 jawaban sederhana untuk pertanyaan "Cara mendapatkan koordinat kanvas relatif mouse"
Jawaban sederhana penggunaan # 1
offsetX
danoffsetY
Jawaban ini berfungsi di Chrome, Firefox, dan Safari. Tidak seperti semua nilai acara lainnya
offsetX
danoffsetY
memperhitungkan transformasi CSS.Masalah terbesar dengan
offsetX
danoffsetY
pada 2019/05 mereka tidak ada pada acara sentuh sehingga tidak dapat digunakan dengan iOS Safari. Mereka memang ada di Acara Pointer yang ada di Chrome dan Firefox tetapi tidak Safari meskipun Safari tampaknya bekerja di sana .Masalah lainnya adalah acara harus di kanvas itu sendiri. Jika Anda meletakkannya di beberapa elemen lain atau jendela, Anda tidak dapat kemudian memilih kanvas untuk menjadi referensi Anda.
Jawaban sederhana # 2 gunakan
clientX
,clientY
dancanvas.getBoundingClientRect
Jika Anda tidak peduli dengan transformasi CSS, jawaban paling sederhana berikutnya adalah memanggil
canvas. getBoundingClientRect()
dan mengurangi yang tersisa dariclientX
dantop
dariclientY
seperti padaIni akan berfungsi selama tidak ada transformasi CSS. Ini juga berfungsi dengan acara sentuh dan begitu juga bekerja dengan Safari iOS
Cara mendapatkan koordinat kanvas pixel mouse untuk 2D Canvas API
Untuk ini kita perlu mengambil nilai yang kita dapatkan di atas dan mengkonversi dari ukuran kanvas yang ditampilkan ke jumlah piksel di kanvas itu sendiri
dengan
canvas.getBoundingClientRect
danclientX
danclientY
atau dengan
offsetX
danoffsetY
Catatan: Dalam semua kasus, jangan menambahkan bantalan atau batas pada kanvas. Melakukan hal itu akan sangat menyulitkan kode. Alih-alih Anda ingin perbatasan atau bantalan mengelilingi kanvas di beberapa elemen lain dan menambahkan bantalan dan atau perbatasan ke elemen luar.
Contoh kerja menggunakan
event.offsetX
,event.offsetY
Tampilkan cuplikan kode
Contoh kerja menggunakan
canvas.getBoundingClientRect
danevent.clientX
danevent.clientY
Tampilkan cuplikan kode
sumber
Saya merekomendasikan tautan ini - http://miloq.blogspot.in/2011/05/coordinates-mouse-click-canvas.html
sumber
x = new Number()
? Kode di bawah ini yang menetapkan ulangx
yang berarti Nomor yang dialokasikan segera dibuangDalam Prototipe, gunakan kumulativeOffset () untuk melakukan penjumlahan rekursif seperti yang disebutkan oleh Ryan Artecona di atas.
http://www.prototypejs.org/api/element/cumulativeoffset
sumber
Anda bisa melakukannya:
Ini akan memberi Anda posisi tepat dari penunjuk mouse.
sumber
Lihat demo di http://jsbin.com/ApuJOSA/1/edit?html,output .
sumber
Berikut adalah beberapa modifikasi dari solusi Ryan Artecona di atas.
sumber
Pertama, seperti yang dikatakan orang lain, Anda perlu fungsi untuk mendapatkan posisi elemen kanvas . Berikut adalah metode yang sedikit lebih elegan daripada beberapa yang lain di halaman ini (IMHO). Anda bisa memberikannya elemen apa saja dan mendapatkan posisinya di dokumen:
Sekarang hitung posisi kursor saat ini relatif terhadap itu:
Perhatikan bahwa saya telah memisahkan
findPos
fungsi generik dari kode penanganan peristiwa. ( Seperti seharusnya . Kita masing-masing harus mencoba menjaga fungsi kita untuk satu tugas.)Nilai-nilai
offsetLeft
danoffsetTop
relatif terhadapoffsetParent
, yang bisa berupa beberapadiv
simpul pembungkus (atau apa pun, dalam hal ini). Ketika tidak ada elemen yang membungkuscanvas
mereka relatif terhadapbody
, jadi tidak ada offset untuk mengurangi. Inilah sebabnya mengapa kita perlu menentukan posisi kanvas sebelum kita dapat melakukan hal lain.Mirip,
e.pageX
dane.pageY
berikan posisi kursor relatif terhadap dokumen. Itu sebabnya kami mengurangi offset kanvas dari nilai-nilai itu untuk sampai pada posisi sebenarnya.Alternatif untuk elemen yang diposisikan adalah secara langsung menggunakan nilai-nilai
e.layerX
dane.layerY
. Ini kurang dapat diandalkan daripada metode di atas karena dua alasan:sumber
ThreeJS r77
Setelah mencoba banyak solusi. Ini berhasil untuk saya. Mungkin bisa membantu orang lain memposting. Dapat dari sini
sumber
Berikut adalah solusi yang disederhanakan (ini tidak bekerja dengan batas / pengguliran):
sumber
Saya sedang membuat aplikasi yang memiliki kanvas di atas pdf, yang melibatkan banyak ukuran kanvas seperti Memperbesar pdf-in dan out, dan pada gilirannya pada setiap zoom-in / out dari PDF saya harus mengubah ukuran kanvas untuk menyesuaikan ukuran pdf, saya melewati banyak jawaban di stackOverflow, dan tidak menemukan solusi sempurna yang pada akhirnya akan menyelesaikan masalah.
Saya menggunakan rxjs dan angular 6, dan tidak menemukan jawaban khusus untuk versi terbaru.
Berikut ini seluruh potongan kode yang akan membantu, bagi siapa pun yang memanfaatkan rxjs untuk menggambar di atas kanvas.
Dan di sini adalah potongan yang memperbaiki, koordinat mouse relatif terhadap ukuran kanvas, terlepas dari bagaimana Anda memperbesar / memperkecil kanvas.
sumber
Hei, ini di dojo, hanya karena itu yang sudah saya punya kode untuk sebuah proyek.
Seharusnya cukup jelas bagaimana mengubahnya kembali ke JavaScript non dojo vanilla.
Semoga itu bisa membantu.
sumber