javascript编写一个折线网格 ,鼠标可以选中折线图上的点并且可以拖动这个点 的位置,也可以用鼠标左键绘制一个新的折线
时间: 2024-03-26 22:41:47 浏览: 96
好的,以下是一个简单的实现示例:
```html
<!DOCTYPE html>
<html>
<head>
<title>折线网格</title>
<style>
body {
margin: 0;
padding: 0;
background-color: #f2f2f2;
}
canvas {
display: block;
margin: auto;
background-color: #fff;
box-shadow: 0 0 10px rgba(0,0,0,.2);
}
</style>
</head>
<body>
<canvas id="canvas"></canvas>
<script>
// 获取画布
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
// 设置画布大小
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
// 定义网格数据
var data = [
{ x: 100, y: 300 },
{ x: 200, y: 200 },
{ x: 300, y: 400 },
{ x: 400, y: 150 },
{ x: 500, y: 250 },
{ x: 600, y: 350 },
{ x: 700, y: 100 }
];
// 绘制网格
function drawGrid() {
ctx.beginPath();
ctx.moveTo(50, 50);
ctx.lineTo(50, canvas.height - 50);
ctx.lineTo(canvas.width - 50, canvas.height - 50);
ctx.stroke();
ctx.beginPath();
for (var i = 0; i < data.length; i++) {
var point = data[i];
ctx.lineTo(point.x, point.y);
}
ctx.stroke();
}
drawGrid();
// 鼠标事件
var selectedPoint = null;
var isDrawing = false;
canvas.addEventListener('mousedown', function(e) {
var mouseX = e.clientX;
var mouseY = e.clientY;
if (e.button === 0) {
// 左键绘制
isDrawing = true;
data.push({
x: mouseX,
y: mouseY
});
drawGrid();
} else if (e.button === 2) {
// 右键选择点
for (var i = 0; i < data.length; i++) {
var point = data[i];
if (Math.abs(point.x - mouseX) < 5 && Math.abs(point.y - mouseY) < 5) {
selectedPoint = point;
break;
}
}
}
});
canvas.addEventListener('mousemove', function(e) {
if (isDrawing) {
// 左键拖动
var mouseX = e.clientX;
var mouseY = e.clientY;
data[data.length - 1].x = mouseX;
data[data.length - 1].y = mouseY;
drawGrid();
} else if (selectedPoint !== null) {
// 右键拖动
var mouseX = e.clientX;
var mouseY = e.clientY;
selectedPoint.x = mouseX;
selectedPoint.y = mouseY;
drawGrid();
}
});
canvas.addEventListener('mouseup', function(e) {
isDrawing = false;
selectedPoint = null;
});
</script>
</body>
</html>
```
代码解释:
1. 首先定义了一个 `data` 数组,存储了网格上的所有点的坐标。
2. 定义了一个 `drawGrid` 函数,用于绘制网格。这个函数会先绘制网格背景,然后再根据 `data` 数组中的点连接折线。
3. 在鼠标事件中,监听鼠标按下、移动、抬起等事件。如果鼠标左键按下,则在当前位置新建一个点添加到 `data` 数组中,并绘制网格;如果鼠标右键按下,则查找当前位置附近的点并将其标记为选中状态。在鼠标移动期间,如果左键处于按下状态,则移动最后一个点的位置,如果右键处于按下状态,则移动选中的点的位置。在鼠标抬起时,清除状态。
这个示例实现的功能比较简单,只是一个基础的折线网格。如果需要更复杂的功能,例如网格缩放、拖动等,还需要进一步的开发。
阅读全文