当前位置:首页 > 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);

功能扩展

颜色选择器

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

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

画笔粗细调整

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
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div c…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(…