Heim > Web-Frontend > js-Tutorial > Wie erhalte ich die tatsächliche Mausposition auf einer HTML5-Leinwand?

Wie erhalte ich die tatsächliche Mausposition auf einer HTML5-Leinwand?

Barbara Streisand
Freigeben: 2024-12-05 11:25:15
Original
513 Leute haben es durchsucht

How to Get the Real Mouse Position on an HTML5 Canvas?

Echte Mausposition im Canvas

Um innerhalb eines HTML5-Canvas mit dem Mauszeiger zu zeichnen, ist es oft zwingend erforderlich, dass der Canvas am Ursprung (0,0) positioniert ist ) innerhalb des übergeordneten Containers. Wenn die Leinwandposition jedoch vom Ursprung weg angepasst wird, kann es beim Zeichnen zu Abweichungen kommen.

Das einfache 1:1-Szenario

Wenn die Abmessungen des Leinwandelements perfekt mit der Bitmap-Größe übereinstimmen (1 :1-Verhältnis), verwenden Sie das folgende Snippet, um Mauspositionen zu erfassen:

function getMousePos(canvas, evt) {
  var rect = canvas.getBoundingClientRect();
  return {
    x: evt.clientX - rect.left,
    y: evt.clientY - rect.top
  };
}
Nach dem Login kopieren

Integrieren Sie diese Methode in Ihr Event, indem Sie das Event bereitstellen und Leinwand als Argumente. Es gibt ein Objekt zurück, das die x- und y-Mauspositionen detailliert angibt. Subtrahieren Sie die Canvas-Position, um sie am Element selbst auszurichten.

var canvas = document.getElementById("imgCanvas");
var context = canvas.getContext("2d");

function draw(evt) {
  var pos = getMousePos(canvas, evt);

  context.fillStyle = "#000000";
  context.fillRect(pos.x, pos.y, 4, 4);
}
Nach dem Login kopieren

Element und Bitmap unterschiedlicher Größe

Wenn sich Canvas und Bitmap in der Größe unterscheiden, z. B. aufgrund der CSS-Skalierung oder eines unterschiedlichen Pixelaspekts Passen Sie die Berechnungen wie folgt an:

function getMousePos(canvas, evt) {
  var rect = canvas.getBoundingClientRect(), // abs. size of element
    scaleX = canvas.width / rect.width, // relationship bitmap vs. element for x
    scaleY = canvas.height / rect.height; // relationship bitmap vs. element for y

  return {
    x: (evt.clientX - rect.left) * scaleX, // scale mouse coordinates after adjusting for element relativity
    y: (evt.clientY - rect.top) * scaleY // scale mouse coordinates after adjusting for element relativity
  };
}
Nach dem Login kopieren

Angewandte Kontexttransformationen

Wenn die Wenn der Canvas-Kontext Transformationen wie Drehung oder Skalierung erfahren hat, berechnen Sie die Umkehrung der aktuellen Matrix, um diese zu berücksichtigen. Neuere Browser bieten Zugriff auf die aktuelle Transformation über die Eigenschaft currentTransform, während Firefox über mozCurrentTransformInverted eine invertierte Matrix bietet.

Wenn eine benutzerdefinierte Matrixberechnung erforderlich ist, implementieren Sie Ihre eigene Lösung oder nutzen Sie vorhandene Bibliotheken wie die unter: [ Benutzerdefinierte Matrixlösung](https://github.com/bebraw/calcGeometryFromPointOnTransformedCanvas)

Wenden Sie die Umkehrung an Matrix zu den Mauskoordinaten, nachdem die Relativität der Elemente angepasst wurde, um sie an der richtigen Mausposition auszurichten.

var pos = getMousePos(canvas, e); // get adjusted coordinates as described above
var imatrix = matrix.inverse(); // obtain the inverse matrix somehow
pos = imatrix.applyToPoint(pos.x, pos.y); // apply inverse matrix to adjusted coordinate

context.fillStyle = "#000000";
context.fillRect(pos.x - 1, pos.y - 1, 2, 2);
Nach dem Login kopieren

Alternativ, wenn die Verwendung von currentTransform möglich ist:

var pos = getMousePos(canvas, e); // get adjusted coordinates as described above
var matrix = ctx.currentTransform; // W3C (future)
var imatrix = matrix.invertSelf(); // invert

// apply to point:
var x = pos.x * imatrix.a + pos.y * imatrix.c + imatrix.e;
var y = pos.x * imatrix.b + pos.y * imatrix.d + imatrix.f;
Nach dem Login kopieren

Für weitere Vereinfachungen sollten Sie die Verwendung in Betracht ziehen eine umfassende Bibliothek, die alle diese Schritte abwickelt, wie zum Beispiel die kostenlose, vom MIT lizenzierte, die im letzten Codeblock erwähnt wurde.

Das obige ist der detaillierte Inhalt vonWie erhalte ich die tatsächliche Mausposition auf einer HTML5-Leinwand?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage