6

当我使用以下 Javascript 代码时

function init() {
    var gameCanvas = document.getElementById("gameCanvas");
    document.getElementById("canvasWidth").innerHTML = gameCanvas.width;

    gameCanvas.addEventListener("mousemove", handleMouseEvent);
}


function handleMouseEvent(mouseEvent) {
    document.getElementById("mouseX").innerHTML = mouseEvent.offsetX;;
}

用这个 html

<body>
    <div id="mainScreen">
        <div id="topScreen">
        <h1 id="canvasWidth">Score:</h1>
        <h1 id="mouseX">0</h1>
        </div>
        <div id="gameScreen">
            <canvas id="gameCanvas" onclick="init()">               
            </canvas>
        </div>
    </div>
</body>

画布宽度显示为 300,而留在画布中的 mouseX 远远超过 300。我已经为它链接了一个屏幕截图。它在 Chrome 中运行良好,但在 Internet Explorer 和 Windows 商店应用程序中不起作用。

截图:http ://dc365.4shared.com/download/ajE0f2XQ?tsid=20130615-014658-676a63ae

指针在右边缘附近的某个地方,但它没有出现在屏幕截图中,这就是我标记它的原因。顶部的第一个数字是画布宽度,第二个数字显示指针 offsetX。

为什么会发生这种情况,如何纠正?


更新(添加 CSS 代码)

CSS代码

#mainScreen {
    display: -ms-grid;
    -ms-grid-columns: 30px 1fr 30px;
    -ms-grid-rows: 30px 100px 20px 1fr 30px;
    height:inherit;
}

#topScreen {
    display: -ms-grid;
    -ms-grid-column: 2;
    -ms-grid-row: 2;
    -ms-grid-columns: 30px 150px 30px 60px 100px 1fr 30px;
    -ms-grid-rows: 20px 1fr 20px;
}

#canvasWidth {
    display: -ms-grid;
    -ms-grid-row: 2;
    -ms-grid-column: 2;
}

#mouseX {
    display: -ms-grid;
    -ms-grid-column: 4;
    -ms-grid-row: 2;
}

#gameScreen {
    display: -ms-grid;
    -ms-grid-column: 2;
    -ms-grid-row: 4;
    -ms-grid-rows:1fr;
    -ms-grid-columns: 1fr;
    height:inherit;
    width:inherit;
}
#gameCanvas {
    height:inherit;
    width:inherit;
    background-color:white;
    -ms-grid-column: 1;
    -ms-grid-row: 1;
}
4

1 回答 1

6

查看 offsetX、layerX、pageX、clientX、screenX 属性之间的区别 这可能很有用 MouseEventsProperties .... 不同的浏览器支持不同的属性 了解它们后,您将了解如何使用这些属性,以便您的应用程序适用于所有平台

好的,这是我在 chrome、safari、firefox 甚至 iPad 等触控设备上编写和测试的代码(一个非常简化的版本)。代码将事件对象作为参数,它将返回具有相对于画布的 X 和 Y 的坐标对象。希望这会有所帮助...

containerX = document.getElementById('container').offsetLeft;
containerY = document.getElementById('container').offsetTop;
//here container is the id of my canvas basically the above two lines are global 
// in my code 

function getX_Y(evt){
var coord={
    X: null,
    Y: null
}
var isTouchSupported = 'ontouchstart' in window;
if(isTouchSupported){                     // for touch devices
    coord.X = evt.clientX-containerX;
    coord.Y = evt.clientY-containerY;
    return coord;
}

else if(evt.offsetX || evt.offsetX == 0){    //for webkit browser like safari and chrome
    coord.X = evt.offsetX;
    coord.Y = evt.offsetY;
    return coord;
}

else if(evt.layerX || evt.layerX == 0){      // for mozilla firefox
    coord.X = evt.layerX;
    coord.Y = evt.layerY;
    return coord;
}
}
于 2013-06-14T12:04:07.860 回答