Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 鼠标指针坐标和画布坐标不匹配_Javascript_Html_Canvas_Html5 Canvas - Fatal编程技术网

Javascript 鼠标指针坐标和画布坐标不匹配

Javascript 鼠标指针坐标和画布坐标不匹配,javascript,html,canvas,html5-canvas,Javascript,Html,Canvas,Html5 Canvas,我试图用画布画一条线。画线时,我的鼠标指针坐标和画布坐标不匹配。若我在画布顶部拖动鼠标,它会在底部画一条线。有人能认出我做错了什么吗。我试过下面的例子 小提琴: var canvas,ctx,flag=false,prevX=0,currX=0,prevY=0,currY=0,dot_flag=false; var x=“黑色”,y=2; 函数init(){ canvas=document.getElementById('drawCanvas'); ctx=canvas.getContext(

我试图用画布画一条线。画线时,我的鼠标指针坐标和画布坐标不匹配。若我在画布顶部拖动鼠标,它会在底部画一条线。有人能认出我做错了什么吗。我试过下面的例子

小提琴:

var canvas,ctx,flag=false,prevX=0,currX=0,prevY=0,currY=0,dot_flag=false;
var x=“黑色”,y=2;
函数init(){
canvas=document.getElementById('drawCanvas');
ctx=canvas.getContext(“2d”);
w=ctx.clientWidth;
h=ctx.clientHeight;
canvas.addEventListener(“mousemove”,函数(e){
findxy('move',e)
},假);
canvas.addEventListener(“鼠标向下”,函数(e){
findxy('down',e)
},假);
canvas.addEventListener(“mouseup”,函数(e){
findxy('up',e)
},假);
canvas.addEventListener(“mouseout”,函数(e){
findxy('out',e)
},假);
}
函数绘图(){
ctx.beginPath();
ctx.moveTo(prevX,prevY);
ctx.lineTo(咖喱,咖喱);
ctx.strokeStyle=x;
ctx.lineWidth=y;
ctx.stroke();
ctx.closePath();
}
函数findxy(res,e){
如果(res=='down'){
prevX=currX;
prevY=咖喱;
currX=e.clientX-canvas.offsetLeft;
currY=e.clientY-canvas.offsetTop;
flag=true;
dot_flag=true;
if(dot_标志){
ctx.beginPath();
ctx.fillStyle=x;
ctx.fillRect(currX,currY,2,2);
ctx.closePath();
dot_标志=假;
}
}
如果(res==“向上”| res==“向外”){
flag=false;
}
如果(res=='move'){
国际单项体育联合会(旗){
prevX=currX;
prevY=咖喱;
currX=e.clientX-canvas.offsetLeft;
currY=e.clientY-canvas.offsetTop;
draw();
}
}
}
init()

鼠标位置很好。这里的问题是如何分配画布的
宽度
高度
,主要是因为您通过CSS将其设置为一种样式(可以“拉伸”画布),而不是
宽度
高度
属性(有关更多信息,请参阅)。要修复此问题,请将
宽度/高度设置为画布的HTML属性

例如:

var canvas,ctx,flag=false,prevX=0,currX=0,prevY=0,currY=0,dot_flag=false;
var x=“黑色”,y=2;
函数init(){
canvas=document.getElementById('drawCanvas');
canvas.setAttribute('width',canvas.parentNode.offsetWidth);
canvas.setAttribute('height',canvas.parentNode.offsetHeight);
ctx=canvas.getContext(“2d”);
w=ctx.clientWidth;
h=ctx.clientHeight;
canvas.addEventListener(“mousemove”,函数(e){
findxy('move',e)
},假);
canvas.addEventListener(“鼠标向下”,函数(e){
findxy('down',e)
},假);
canvas.addEventListener(“mouseup”,函数(e){
findxy('up',e)
},假);
canvas.addEventListener(“mouseout”,函数(e){
findxy('out',e)
},假);
}
函数绘图(){
ctx.beginPath();
ctx.moveTo(prevX,prevY);
ctx.lineTo(咖喱,咖喱);
ctx.strokeStyle=x;
ctx.lineWidth=y;
ctx.stroke();
ctx.closePath();
}
函数findxy(res,e){
如果(res=='down'){
prevX=currX;
prevY=咖喱;
var-cRect=canvas.getBoundingClientRect();
currX=e.clientX-cRect.offsetLeft;
咖喱=e.clientY-corct.offsetTop;
flag=true;
dot_flag=true;
if(dot_标志){
ctx.beginPath();
ctx.fillStyle=x;
ctx.fillRect(currX,currY,2,2);
ctx.closePath();
dot_标志=假;
}
}
如果(res==“向上”| res==“向外”){
flag=false;
}
如果(res=='move'){
国际单项体育联合会(旗){
prevX=currX;
prevY=咖喱;
currX=e.clientX-canvas.offsetLeft;
currY=e.clientY-canvas.offsetTop;
draw();
}
}
}
init()

鼠标位置很好。这里的问题是如何分配画布的
宽度
高度
,主要是因为您通过CSS将其设置为一种样式(可以“拉伸”画布),而不是
宽度
高度
属性(有关更多信息,请参阅)。要修复此问题,请将
宽度/高度设置为画布的HTML属性

例如:

var canvas,ctx,flag=false,prevX=0,currX=0,prevY=0,currY=0,dot_flag=false;
var x=“黑色”,y=2;
函数init(){
canvas=document.getElementById('drawCanvas');
canvas.setAttribute('width',canvas.parentNode.offsetWidth);
canvas.setAttribute('height',canvas.parentNode.offsetHeight);
ctx=canvas.getContext(“2d”);
w=ctx.clientWidth;
h=ctx.clientHeight;
canvas.addEventListener(“mousemove”,函数(e){
findxy('move',e)
},假);
canvas.addEventListener(“鼠标向下”,fu)