基于canvas在浏览器图像上画线 然后让线条自动吸附到目标区域附近
时间: 2023-05-26 20:05:13 浏览: 82
实现这个功能,需要以下步骤:
1. 使用canvas绘制线条,可以使用`context.lineTo()`和`context.stroke()`方法;
2. 监听鼠标移动事件,获取当前鼠标位置;
3. 计算鼠标位置与目标区域的距离,判断是否在吸附范围内;
4. 如果在吸附范围内,将线条的终点移动到目标区域边缘;
5. 绘制新的线条。
以下是一个示例代码:
```html
<!DOCTYPE html>
<html>
<head>
<title>Canvas Line Demo</title>
<style>
html, body {
margin: 0;
padding: 0;
height: 100%;
overflow: hidden;
}
canvas {
background-color: #f8f8f8;
display: block;
height: 100%;
width: 100%;
position: fixed;
top: 0;
left: 0;
z-index: -1;
}
</style>
</head>
<body>
<canvas id="canvas"></canvas>
<script>
// 获取canvas和context对象
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
// 设置线条样式
ctx.strokeStyle = '#333';
ctx.lineWidth = 5;
ctx.lineCap = 'round';
// 定义目标区域
const targetRect = {
x: 100,
y: 100,
width: 200,
height: 200
};
// 监听鼠标移动事件
canvas.addEventListener('mousemove', (e) => {
// 获取鼠标位置
const mouseX = e.clientX;
const mouseY = e.clientY;
// 计算鼠标位置到目标区域的距离
const dx = targetRect.x - mouseX;
const dy = targetRect.y - mouseY;
const distance = Math.sqrt(dx * dx + dy * dy);
// 如果鼠标在目标区域附近,将线条终点移动到目标区域边缘
if (distance <= 50) {
const angle = Math.atan2(dy, dx);
const newX = targetRect.x + Math.cos(angle) * (targetRect.width/2);
const newY = targetRect.y + Math.sin(angle) * (targetRect.height/2);
ctx.beginPath();
ctx.moveTo(mouseX, mouseY);
ctx.lineTo(newX, newY);
ctx.stroke();
}
// 否则,正常绘制线条
else {
ctx.lineTo(mouseX, mouseY);
ctx.stroke();
}
});
// 初始化线条起点
ctx.beginPath();
ctx.moveTo(50, 50);
</script>
</body>
</html>
```
在这个示例中,当鼠标移动到目标区域50像素范围内时,线条终点会自动吸附到目标区域边缘。当鼠标移出该范围时,线条终点会回到鼠标位置。
阅读全文