当前位置:首页 > JavaScript

js 实现画板

2026-03-14 18:59:33JavaScript

使用 Canvas API 实现基础画板

HTML 部分需添加 <canvas> 元素并设置宽高:

<canvas id="drawing-board" width="800" height="600"></canvas>

JavaScript 核心实现逻辑:

const canvas = document.getElementById('drawing-board');
const ctx = canvas.getContext('2d');
let isDrawing = false;

// 设置初始绘制样式
ctx.strokeStyle = '#000000';
ctx.lineWidth = 5;
ctx.lineCap = 'round';

// 鼠标按下事件
canvas.addEventListener('mousedown', (e) => {
    isDrawing = true;
    ctx.beginPath();
    ctx.moveTo(e.offsetX, e.offsetY);
});

// 鼠标移动事件
canvas.addEventListener('mousemove', (e) => {
    if (!isDrawing) return;
    ctx.lineTo(e.offsetX, e.offsetY);
    ctx.stroke();
});

// 鼠标释放事件
canvas.addEventListener('mouseup', () => isDrawing = false);
canvas.addEventListener('mouseout', () => isDrawing = false);

添加颜色和粗细控制

扩展功能面板的 HTML:

js 实现画板

<div class="tools">
    <input type="color" id="color-picker" value="#000000">
    <input type="range" id="brush-size" min="1" max="50" value="5">
    <button id="clear-btn">清空画板</button>
</div>

对应的 JavaScript 控制逻辑:

document.getElementById('color-picker').addEventListener('change', (e) => {
    ctx.strokeStyle = e.target.value;
});

document.getElementById('brush-size').addEventListener('change', (e) => {
    ctx.lineWidth = e.target.value;
});

document.getElementById('clear-btn').addEventListener('click', () => {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
});

实现触摸屏支持

添加触摸事件处理:

js 实现画板

// 触摸开始
canvas.addEventListener('touchstart', (e) => {
    e.preventDefault();
    isDrawing = true;
    const touch = e.touches[0];
    const rect = canvas.getBoundingClientRect();
    ctx.beginPath();
    ctx.moveTo(touch.clientX - rect.left, touch.clientY - rect.top);
});

// 触摸移动
canvas.addEventListener('touchmove', (e) => {
    e.preventDefault();
    if (!isDrawing) return;
    const touch = e.touches[0];
    const rect = canvas.getBoundingClientRect();
    ctx.lineTo(touch.clientX - rect.left, touch.clientY - rect.top);
    ctx.stroke();
});

// 触摸结束
canvas.addEventListener('touchend', () => isDrawing = false);

保存画布为图片

添加保存功能按钮:

<button id="save-btn">保存图片</button>

实现保存逻辑:

document.getElementById('save-btn').addEventListener('click', () => {
    const link = document.createElement('a');
    link.download = 'drawing.png';
    link.href = canvas.toDataURL('image/png');
    link.click();
});

添加撤销/重做功能

使用数组记录绘图历史:

let drawingHistory = [];
let historyIndex = -1;

function saveDrawingState() {
    historyIndex++;
    if (historyIndex < drawingHistory.length) {
        drawingHistory.length = historyIndex;
    }
    drawingHistory.push(canvas.toDataURL());
}

// 在每次绘制结束后调用 saveDrawingState()

document.getElementById('undo-btn').addEventListener('click', () => {
    if (historyIndex <= 0) return;
    historyIndex--;
    const img = new Image();
    img.onload = () => ctx.drawImage(img, 0, 0);
    img.src = drawingHistory[historyIndex];
});

document.getElementById('redo-btn').addEventListener('click', () => {
    if (historyIndex >= drawingHistory.length - 1) return;
    historyIndex++;
    const img = new Image();
    img.onload = () => ctx.drawImage(img, 0, 0);
    img.src = drawingHistory[historyIndex];
});

标签: 画板js
分享给朋友:

相关文章

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…