gpt4 book ai didi

javascript - 在屏幕调整大小时响应式地更改 Canvas 尺寸,而不会丢失光标位置跟踪

转载 作者:行者123 更新时间:2023-12-03 00:24:47 30 4
gpt4 key购买 nike

我有一个 Canvas (#myCanvas_one),里面有光标位置跟踪。光标后面的行是使用 .beginPath() 和 .rect() 创建的。每次我尝试使 Canvas 在页面上响应或更改其位置时,光标跟踪都会中断。

我尝试使用此代码,但光标跟踪取决于 Canvas 的位置和大小。

我希望 Canvas 在屏幕调整大小时更改尺寸,并且鼠标跟踪独立于 Canvas 在页面上的位置。

我正在尝试制作一个响应式网格。

enter image description here

<!DOCTYPE html>
<html>

<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
canvas {
border: #000 1.5px solid;
margin-left: 8px;
margin-right: 8px;
}
</style>
</head>

<body>
<canvas id="myCanvas_one" width="174px" height="92px"></canvas>

<script>
var canvastwo = document.querySelector("#myCanvas_one");
var contexttwo = canvastwo.getContext("2d");

var canvasPostwo = getPosition(canvastwo);
var mouseQ = 0;
var mouseW = 0;

canvastwo.addEventListener("mousemove", setMousePositiontwo, false);

function setMousePositiontwo(r) {
mouseQ = r.clientX - canvasPostwo.a;
mouseW = r.clientY - canvasPostwo.b;
}

function updatetwo() {
contexttwo.clearRect(0, 0, canvastwo.width, canvastwo.height);
contexttwo.beginPath();
contexttwo.lineWidth = "1.5";
contexttwo.strokeStyle = "black";
contexttwo.rect(mouseQ - 42, mouseW - 21, 84, 42);
contexttwo.stroke();

contexttwo.beginPath();
contexttwo.moveTo(0, 0);
contexttwo.lineTo(mouseQ - 42, mouseW - 21);
contexttwo.stroke();

contexttwo.beginPath();
contexttwo.moveTo(0, 92);
contexttwo.lineTo(mouseQ - 42, mouseW + 21);
contexttwo.stroke();

contexttwo.beginPath();
contexttwo.moveTo(174, 0);
contexttwo.lineTo(mouseQ + 42, mouseW - 21);
contexttwo.stroke();

contexttwo.beginPath();
contexttwo.moveTo(174, 92);
contexttwo.lineTo(mouseQ + 42, mouseW + 21);
contexttwo.stroke();

requestAnimationFrame(updatetwo);
}

updatetwo();

function getPosition(qw) {
var aPosition = 0;
var bPosition = 0;

while (qw) {
aPosition += (qw.offsetLeft - qw.scrollLeft + qw.clientLeft);
bPosition += (qw.offsetTop - qw.scrollTop + qw.clientTop);
qw = qw.offsetParent;
}
return {
a: aPosition,
b: bPosition
};
}
</script>
</body>

</html>

最佳答案

我在 Javascript 中设置 Canvas 的大小,而不是在 html 中设置。此外,我还添加了一些变量,使您的绘图与窗口大小成比例。我希望这会有所帮助。

var canvastwo = document.querySelector("#myCanvas_one");
let cw = canvastwo.width=window.innerWidth;
let ch = canvastwo.height=window.innerHeight;

let W = cw/2,w=cw/4;H=ch/2,h=ch/4

var contexttwo = canvastwo.getContext("2d");

var canvasPostwo = getPosition(canvastwo);
var mouseQ = 0;
var mouseW = 0;

canvastwo.addEventListener("mousemove", setMousePositiontwo, false);

function setMousePositiontwo(r) {
mouseQ = r.clientX - canvasPostwo.a;
mouseW = r.clientY - canvasPostwo.b;
}

function updatetwo() {
contexttwo.clearRect(0, 0, canvastwo.width, canvastwo.height);
contexttwo.beginPath();
contexttwo.lineWidth = "1.5";
contexttwo.rect(mouseQ - w, mouseW - h, W, H);
contexttwo.stroke();

contexttwo.beginPath();
contexttwo.moveTo(0, 0);
contexttwo.lineTo(mouseQ - w, mouseW - h);
contexttwo.stroke();

contexttwo.beginPath();
contexttwo.moveTo(0, ch);
contexttwo.lineTo(mouseQ - w, mouseW + h);
contexttwo.stroke();

contexttwo.beginPath();
contexttwo.moveTo(cw, 0);
contexttwo.lineTo(mouseQ + w, mouseW - h);
contexttwo.stroke();

contexttwo.beginPath();
contexttwo.moveTo(cw, ch);
contexttwo.lineTo(mouseQ + w, mouseW + h);
contexttwo.stroke();

requestAnimationFrame(updatetwo);
}

updatetwo();

function getPosition(qw) {
var aPosition = 0;
var bPosition = 0;

while (qw) {
aPosition += (qw.offsetLeft - qw.scrollLeft + qw.clientLeft);
bPosition += (qw.offsetTop - qw.scrollTop + qw.clientTop);
qw = qw.offsetParent;
}
return {
a: aPosition,
b: bPosition
};
}

function Init(){
cw = canvastwo.width=window.innerWidth;
ch = canvastwo.height=window.innerHeight;

W = cw/2,w=cw/4;H=ch/2,h=ch/4;
updatetwo()
}

window.setTimeout(function() {
Init();
window.addEventListener('resize', Init, false);
}, 15);
* {
margin: 0;
padding: 0;
}
canvas {
border: #000 1.5px solid;
}
<canvas id="myCanvas_one"></canvas>

关于javascript - 在屏幕调整大小时响应式地更改 Canvas 尺寸,而不会丢失光标位置跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54136296/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com