当前位置:首页 > JavaScript

js实现白板

2026-02-01 15:26:26JavaScript

实现白板的基本思路

使用HTML5的Canvas API可以轻松实现一个简单的白板功能。Canvas提供了绘制路径、形状、文本和图像的方法,结合鼠标事件监听可以实现自由绘制。

基础代码结构

<!DOCTYPE html>
<html>
<head>
    <title>简易白板</title>
    <style>
        #drawing-board {
            border: 1px solid #000;
            cursor: crosshair;
        }
    </style>
</head>
<body>
    <canvas id="drawing-board" width="800" height="600"></canvas>
    <script src="script.js"></script>
</body>
</html>

JavaScript实现

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

// 设置画笔样式
ctx.strokeStyle = '#000';
ctx.lineWidth = 5;
ctx.lineCap = 'round';
ctx.lineJoin = 'round';

// 鼠标按下事件
canvas.addEventListener('mousedown', (e) => {
    isDrawing = true;
    [lastX, lastY] = [e.offsetX, e.offsetY];
});

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

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

功能扩展

颜色选择器

js实现白板

const colorPicker = document.createElement('input');
colorPicker.type = 'color';
document.body.prepend(colorPicker);

colorPicker.addEventListener('change', (e) => {
    ctx.strokeStyle = e.target.value;
});

画笔粗细调整

js实现白板

const brushSize = document.createElement('input');
brushSize.type = 'range';
brushSize.min = '1';
brushSize.max = '50';
document.body.prepend(brushSize);

brushSize.addEventListener('change', (e) => {
    ctx.lineWidth = e.target.value;
});

清除画布

const clearBtn = document.createElement('button');
clearBtn.textContent = '清除';
document.body.prepend(clearBtn);

clearBtn.addEventListener('click', () => {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
});

触摸屏支持

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

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

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

保存绘图

const saveBtn = document.createElement('button');
saveBtn.textContent = '保存';
document.body.prepend(saveBtn);

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

优化绘图性能

对于复杂绘图,可以使用requestAnimationFrame优化性能:

function draw(x, y) {
    ctx.beginPath();
    ctx.moveTo(lastX, lastY);
    ctx.lineTo(x, y);
    ctx.stroke();
    [lastX, lastY] = [x, y];
}

function throttle(callback, delay) {
    let previousCall = new Date().getTime();
    return function() {
        const time = new Date().getTime();
        if ((time - previousCall) >= delay) {
            previousCall = time;
            callback.apply(null, arguments);
        }
    };
}

canvas.addEventListener('mousemove', throttle((e) => {
    if (!isDrawing) return;
    draw(e.offsetX, e.offsetY);
}, 10));

以上代码实现了一个功能完整的简易白板,支持鼠标和触摸绘制、颜色选择、画笔粗细调整、清除画布和保存图片等功能。可以根据需要进一步扩展,如添加形状工具、文字工具或撤销重做功能。

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

相关文章

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…

js 实现全选

js 实现全选

实现全选功能的方法 使用 JavaScript 实现全选功能通常需要操作复选框(checkbox)的状态。以下是几种常见的实现方式。 通过 DOM 操作实现全选 // 获取全选复选框和子复选框 co…