使用canvas制作一个画板

undefined 复制代码
## 使用 Canvas 制作一个画板

在 Web 开发中,`<canvas>` 元素提供了一个强大的 API 来实现各种绘图功能。本文将介绍如何使用 `canvas` 创建一个基本的画板,支持绘制、清空和更改画笔颜色。

### 1. 创建 HTML 结构

首先,我们需要一个 `canvas` 画布,并添加一些控制按钮:

```html
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Canvas 画板</title>
    <style>
        body { text-align: center; }
        canvas { border: 1px solid black; cursor: crosshair; }
    </style>
</head>
<body>
    <h1>Canvas 画板</h1>
    <canvas id="drawingBoard" width="800" height="500"></canvas>
    <br>
    <button onclick="clearCanvas()">清空画布</button>
    <input type="color" id="colorPicker" value="#000000">
    <script src="script.js"></script>
</body>
</html>

2. JavaScript 实现绘制功能

在 script.js 文件中,添加以下代码:

javascript 复制代码
const canvas = document.getElementById("drawingBoard");
const ctx = canvas.getContext("2d");
const colorPicker = document.getElementById("colorPicker");

let drawing = false;

// 设置画笔颜色
colorPicker.addEventListener("input", () => {
    ctx.strokeStyle = colorPicker.value;
});

// 监听鼠标事件
canvas.addEventListener("mousedown", () => drawing = true);
canvas.addEventListener("mouseup", () => drawing = false);
canvas.addEventListener("mousemove", draw);

function draw(event) {
    if (!drawing) return;
    ctx.lineWidth = 5;
    ctx.lineCap = "round";
    ctx.lineTo(event.offsetX, event.offsetY);
    ctx.stroke();
    ctx.beginPath();
    ctx.moveTo(event.offsetX, event.offsetY);
}

// 清空画布
function clearCanvas() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
}

3. 关键实现解析

  1. 获取 Canvas 上下文

    • canvas.getContext("2d") 获取 2D 绘图上下文。
  2. 鼠标事件绑定

    • mousedown 开始绘制。
    • mouseup 结束绘制。
    • mousemove 监听鼠标移动,动态绘制路径。
  3. 实现绘制逻辑

    • ctx.lineTo(event.offsetX, event.offsetY) 连接到鼠标位置。
    • ctx.stroke() 绘制当前路径。
    • ctx.beginPath() 开始新的路径,避免连线断裂。
  4. 清空画布

    • ctx.clearRect(0, 0, canvas.width, canvas.height) 清除整个画布。

4. 进一步优化

  1. 调整画笔大小

    • 可添加 <input type="range" id="sizePicker" min="1" max="10" value="5"> 控制画笔粗细。
    • 在 draw 方法中使用 ctx.lineWidth = sizePicker.value;。
  2. 添加橡皮擦功能

    • 创建一个橡皮擦按钮,点击后 ctx.strokeStyle = "#FFFFFF";。
  3. 支持触摸事件

    • 监听 touchstart、touchmove 事件,使其适用于移动端。

通过以上步骤,我们成功实现了一个简单的 Canvas 画板,并可以进一步扩展功能以已完成 Canvas 画板的详细实现,包括 HTML 结构、JavaScript 绘制功能及优化建议。请检查并提出修改需求!

相关推荐
IT_陈寒36 分钟前
Java中equals方法比了个寂寞?原来这才是正确的重写姿势
前端·人工智能·后端
默_笙36 分钟前
🚓 分诊台与拆题术:让 RAG 学会判断和规划
前端·javascript
CopyCode36 分钟前
用 AI 迁项目有多爽?我把 Webpack 迁 Vite 的全过程记下来了
前端·架构
去伪存真36 分钟前
Electron 自动化发布指南:GitHub Actions 跨平台打包全纪录
前端·electron
计算机魔术师36 分钟前
OpenAI智能体失控闯进美国政府网站,53张用户图片外泄背后
前端
颜进强37 分钟前
14 · NestJS ExecutionContext 执行上下文:守卫、拦截器、过滤器拿到的"同一个 context",为什么能力不一样?
前端·后端·ai编程
程序员Flycan37 分钟前
🚀 跨域终结者:前端代理服务器(Proxy)原理解析与配置总结
前端
怕浪猫37 分钟前
顶级模型一句话,AI 写出了能玩的 QQ飞车
前端·面试·github
huakoh37 分钟前
MCP 报错分不清?先看响应里是 result 还是 error
前端
呃呃呃呃ex37 分钟前
10. 现代前端工程化:ES6 React 项目实战与原理解析
前端·javascript