当前位置:首页 > JavaScript

js 实现画笔

2026-04-06 09:05:14JavaScript

使用 Canvas 实现画笔功能

在 HTML 中创建一个 <canvas> 元素,通过 JavaScript 监听鼠标事件来实现画笔功能。以下是核心代码示例:

<canvas id="drawingCanvas" width="800" height="600"></canvas>
const canvas = document.getElementById('drawingCanvas');
const ctx = canvas.getContext('2d');
let isDrawing = false;

canvas.addEventListener('mousedown', startDrawing);
canvas.addEventListener('mousemove', draw);
canvas.addEventListener('mouseup', stopDrawing);
canvas.addEventListener('mouseout', stopDrawing);

function startDrawing(e) {
    isDrawing = true;
    draw(e); // 立即开始绘制,避免点击时出现断点
}

function draw(e) {
    if (!isDrawing) return;

    ctx.lineWidth = 5;
    ctx.lineCap = 'round';
    ctx.strokeStyle = '#000000';

    ctx.lineTo(e.clientX - canvas.offsetLeft, e.clientY - canvas.offsetTop);
    ctx.stroke();
    ctx.beginPath();
    ctx.moveTo(e.clientX - canvas.offsetLeft, e.clientY - canvas.offsetTop);
}

function stopDrawing() {
    isDrawing = false;
    ctx.beginPath(); // 结束当前路径
}

添加触摸屏支持

为移动设备添加触摸事件支持:

js 实现画笔

canvas.addEventListener('touchstart', handleTouchStart);
canvas.addEventListener('touchmove', handleTouchMove);
canvas.addEventListener('touchend', handleTouchEnd);

function handleTouchStart(e) {
    e.preventDefault();
    const touch = e.touches[0];
    startDrawing(touch);
}

function handleTouchMove(e) {
    e.preventDefault();
    const touch = e.touches[0];
    draw(touch);
}

function handleTouchEnd() {
    stopDrawing();
}

实现画笔属性控制

添加控制画笔颜色和粗细的功能:

<input type="color" id="colorPicker" value="#000000">
<input type="range" id="brushSize" min="1" max="50" value="5">
const colorPicker = document.getElementById('colorPicker');
const brushSize = document.getElementById('brushSize');

colorPicker.addEventListener('input', () => {
    ctx.strokeStyle = colorPicker.value;
});

brushSize.addEventListener('input', () => {
    ctx.lineWidth = brushSize.value;
});

实现橡皮擦功能

通过设置合成模式实现橡皮擦:

js 实现画笔

function activateEraser() {
    ctx.globalCompositeOperation = 'destination-out';
    ctx.lineWidth = 20; // 橡皮擦大小
}

function deactivateEraser() {
    ctx.globalCompositeOperation = 'source-over';
}

保存画布内容

将画布内容保存为图像:

function saveCanvas() {
    const link = document.createElement('a');
    link.download = 'drawing.png';
    link.href = canvas.toDataURL('image/png');
    link.click();
}

清除画布

实现清空画布功能:

function clearCanvas() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.beginPath(); // 重置路径
}

注意事项

  1. 坐标计算需要考虑画布在页面中的偏移量
  2. 对于高DPI设备,可能需要设置画布的逻辑尺寸和显示尺寸
  3. 性能优化:对于复杂绘图,可以考虑使用 requestAnimationFrame
  4. 路径绘制需要正确管理 beginPath 和 closePath 的调用

这个实现提供了基础的画笔功能,可以根据需要进一步扩展,如添加撤销/重做、不同画笔样式、图层支持等功能。

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

相关文章

js实现图片轮播

js实现图片轮播

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

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

js实现显示隐藏

js实现显示隐藏

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