2

現在、html でキャンバス タグを使用する方法を学習しようとしていますが、ドキュメントに css を適用するときにマウス イベントの処理に問題があります。

キャンバスを含むdivを移動してページの中央に配置すると、問題が発生します。キャンバスの最初のポインは0ではありません。中央に配置され、何らかの理由で0,0が画面の先頭ではなく、画面の先頭になるためです。イベントリスナーをキャンバスに直接追加しているため、奇妙に感じました。

コードは次のとおりです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>

<style type="text/css">
body {
    font: 100%/1.4 Verdana, Arial, Helvetica, sans-serif;
    background: #42413C;
    margin: 0;
    padding: 0;
    color: #000;
}
#divId {
    width: 800px;
    height: 600px;
    text-align:center;
    margin: 20px auto;
    background-color:#0099FF;
}
</style>

<script>
window.onload = function () {

    var canvas = document.getElementById('canvasId');   
    var c = canvas.getContext('2d');
    alert("lol");
    canvas.addEventListener('mousedown', hmd, false);

    function hmd(e) {
        alert ("x: " + e.clientX + "     y: " + e.clientY); 
    }

}
</script>
</head>

<body>

<div id="divId">

<canvas height="300" width="800" id="canvasId" />

</div>

</body>
</html>

そのため、div が原因で問題が発生したことをどこかで読みましたが、css をキャンバス タグに直接指定しようとしても機能しませんでした。そのため、基本的に必要なことは、そのキャンバスを中央に配置するか、画面の任意の場所に配置することです。ただし、最初のピクセルは 0,0 です。自動的にセンタリングされるため、ソリューションを追加するのは難しいため、オフセットを計算できるようにするにはユーザーの解像度を知る必要があるため、探しているのはcssなどで簡単に行う方法です。

4

2 に答える 2

1

に対して相対的な座標を取得するには、次のcanvasようにします。

function hmd(e) {
    var rx = e.pageX, ry = e.pageY;
    rx -= canvas.offsetLeft;
    ry -= canvas.offsetTop;
    alert ("x: " + rx + "     y: " + ry); 
}

canvasこれは、変数定義がグローバルであることを前提としています。

編集:別の方法:

function hmd(e) {
    var rx, ry;
    if(e.offsetX) {
        rx = e.offsetX;
        ry = e.offsetY;
    }
    else if(e.layerX) {
        rx = e.layerX;
        ry = e.layerY;
    }
}
于 2012-09-30T19:13:58.580 に答える
0

これが私の最近の実験に使用しているものです。ボーダー、パディング、HTML 要素をオフセットする position:fixed 要素など、ほぼすべてで動作します。また、すべてのタッチ デバイスで動作し、ブラウザーがズームされている場合でも動作します。

http://jsfiddle.net/simonsarris/te8GQ/5/

var stylePaddingLeft = parseInt(document.defaultView.getComputedStyle(can, undefined)['paddingLeft'], 10) || 0;
var stylePaddingTop = parseInt(document.defaultView.getComputedStyle(can, undefined)['paddingTop'], 10) || 0;
var styleBorderLeft = parseInt(document.defaultView.getComputedStyle(can, undefined)['borderLeftWidth'], 10) || 0;
var styleBorderTop = parseInt(document.defaultView.getComputedStyle(can, undefined)['borderTopWidth'], 10) || 0;
var html = document.body.parentNode;
var htmlTop = html.offsetTop;
var htmlLeft = html.offsetLeft;

function getMouse(e) {
    var element = can,
        offsetX = 0,
        offsetY = 0,
        mx, my;

    // Compute the total offset
    if (element.offsetParent !== undefined) {
        do {
            offsetX += element.offsetLeft;
            offsetY += element.offsetTop;
        } while ((element = element.offsetParent));
    }

    // Add padding and border style widths to offset
    // Also add the <html> offsets in case there's a position:fixed bar
    offsetX += stylePaddingLeft + styleBorderLeft + htmlLeft;
    offsetY += stylePaddingTop + styleBorderTop + htmlTop;

    mx = e.pageX - offsetX;
    my = e.pageY - offsetY;

    // We return a simple javascript object (a hash) with x and y defined
    return {
        x: mx,
        y: my
    };
}
于 2012-09-30T20:25:22.740 に答える