11 Stimmen

Mausposition mit Javascript im Canvas ermitteln

Ich lerne gerade Jquery und HTML5 Canvas. Alles, was ich tun möchte, ist eine einfache html5 Zeichnung Beispiel. Wenn die Maus bewegen, zeichne ich rote Quadrate unter meiner Maus.

Mein Code ist einfach, aber ich habe ein Problem, die Position des Mauszeigers innerhalb der Leinwand zu erhalten.

Im Moment verwende ich x=event.offsetX; um die Mausposition zu erhalten. Dies funktioniert sehr gut in Chrome, aber wenn es zu Firefox kommt, funktioniert es nicht. Ich änderte den Code zu x=event.layerX. aber es scheint, dass layerX die Position meiner Maus relativ zur Webseite ist, nicht die Position der Leinwand. weil ich immer einen Versatz sehe.

Ich habe zwei Fragen, erstens, was ist das Richtige zu tun, um die richtige Mausposition unter Firefox zu erhalten. zweitens, wie kann ich einen Code schreiben, der für IE, Firefox, Chrome, Safari und Opera funktioniert?

Hier ist mein Code:

 <!doctype html />
<html><head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
  $(document).ready(
 function(){

var flip = document.getElementById('flip');
    var context = flip.getContext('2d');   
context.fillStyle = "rgb(255,255,255)";   
context.fillRect(0, 0, 500, 500);

      $("a").click(function(event){alert("Thanks for visiting!");});
   $("#flip").mousemove(function(event){
      var x, y;

    x = event.layerX;
    y = event.layerY;

    //alert("mouse pos"+event.layerX );
    var flip = document.getElementById('flip');
    var context = flip.getContext('2d');   
context.fillStyle = "rgb(255,0,0)";   
context.fillRect(x, y, 5, 5);
    }
   );
  }
  );    
  </script>
  </head>  <body bgcolor="#000000"> <a href="http://jquery.com/">jQuery</a><canvas id="flip" width="500" height="500">
  This text is displayed if your browser does not support HTML5 Canvas.</canvas> </body></html>

4 Stimmen

<!doctype html /> ist ungültig und ruft den Quirks-Modus auf, der das Verhalten vieler DOM-Sachen ändert! <!doctype html> ist die richtige DTD.

16voto

AxFab Punkte 1107

Ich sehe viele Fragen zu diesem Thema und alle schlagen vor, das DOM zu durchsuchen oder offsetX und offsetY zu verwenden, die nicht immer richtig eingestellt sind.

Sie sollten die Funktion: canvas.getBoundingClientRect() aus der Canvas-API verwenden.

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

  canvas.addEventListener('mousemove', function(evt) {
    var mousePos = getMousePos(canvas, evt);
    console.log('Mouse position: ' + mousePos.x + ',' + mousePos.y);
  }, false);

1 Stimmen

Das ist eine nette Lösung, aber sie funktioniert nicht, wenn die Leinwand mit Rändern oder Auffüllungen gestylt ist...

1 Stimmen

GetBoundingClientRect() geben border-box Rechteck, aber das ist die einzige Lösung, die ich gefunden, dass Griff Position Styling und Scrollen die gleiche Weise. Mit dieser Lösung müssen Sie einige hässliche Code wie verwenden: parseInt(canvas.style.borderLeftWidth.substring(-2) Mein Rat: Fügen Sie Polsterung und Rahmen auf einem übergeordneten div.

11voto

Caio Punkte 3070

enter image description here

<!DOCTYPE html>

<html>
    <head>
        <meta charset = "utf-8">

        <script>
            Element.prototype.leftTopScreen = function () {
                var x = this.offsetLeft;
                var y = this.offsetTop;

                var element = this.offsetParent;

                while (element !== null) {
                    x = parseInt (x) + parseInt (element.offsetLeft);
                    y = parseInt (y) + parseInt (element.offsetTop);

                    element = element.offsetParent;
                }

                return new Array (x, y);
            }

            document.addEventListener ("DOMContentLoaded", function () {
                var flip = document.getElementById ("flip");

                var xy = flip.leftTopScreen ();

                var context = flip.getContext ("2d");

                context.fillStyle = "rgb(255,255,255)";   
                context.fillRect (0, 0, 500, 500);

                flip.addEventListener ("mousemove", function (event) {
                    var x = event.clientX;
                    var y = event.clientY;

                    context.fillStyle = "rgb(255, 0, 0)";  
                    context.fillRect (x - xy[0], y - xy[1], 5, 5);
                });
            });    
        </script>

        <style>
            #flip {
                border: 1px solid black;
                display: inline-block;

            }

            body {
                text-align: center;
            }
        </style>
    </head>

    <body>
        <canvas id = "flip" width = "500" height = "500">This text is displayed if your browser does not support HTML5 Canvas.</canvas>
    </body>
</html>

Um die Kompatibilität müssen Sie sich keine Sorgen machen, nur der IE (vor 9) unterstützt Canvas nicht von Haus aus.

1 Stimmen

Diese Antwort löst das Problem, aber sie erweitert das DOM unklugerweise und erfindet das Rad neu.

4 Stimmen

<!doctype html /> ist ungültig und ruft den Quirks-Modus auf, der das Verhalten vieler DOM-Sachen ändert! <!doctype html> ist die richtige DTD.

0 Stimmen

Ihre leftTopOffset-Funktion bricht ab, wenn das Fenster nicht nach oben gescrollt wird.

2voto

Olical Punkte 36037

Sie benötigen eine benutzerdefinierte Funktion, um herauszufinden, wo sich das Element befindet, und dann, wo sich die Maus innerhalb dieses Elements befindet. Hier ein Beispiel . Es verwendet diese Funktion von quirks Modus und meine JavaScript-Bibliothek, die nicht schwierig sein sollte, in jQuery zu übersetzen.

function findPos(obj) {
    var curleft = curtop = 0;

    if (obj.offsetParent) {
        do {
            curleft += obj.offsetLeft;
            curtop += obj.offsetTop;
        } while (obj = obj.offsetParent);

        return [curleft, curtop];
    }
}

エディテージ

Dies wird im IE nicht funktionieren, da dieser pageX nicht unterstützt. Sie müssen das Ereignisobjekt durch eine Funktion wie ce um dies zu korrigieren. Aber wie 2x2p1p sagte, wird Canvas von keinem Internet Explorer unter Version 9 unterstützt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X