当前位置:首页 > JavaScript

js实现画笔功能

2026-03-01 14:58:52JavaScript

实现基础画布与画笔功能

创建一个HTML文件并添加<canvas>元素作为画布。通过JavaScript获取画布上下文并设置初始样式:

<canvas id="drawCanvas" width="800" height="600"></canvas>
<script>
  const canvas = document.getElementById('drawCanvas');
  const ctx = canvas.getContext('2d');
  ctx.strokeStyle = '#000000';
  ctx.lineWidth = 5;
  ctx.lineCap = 'round';
</script>

监听鼠标事件实现绘制

绑定鼠标事件来跟踪绘制动作。需要处理mousedownmousemovemouseup事件:

let isDrawing = false;
let lastX = 0;
let lastY = 0;

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实现画笔功能

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

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

canvas.addEventListener('touchend', () => isDrawing = false);

实现画笔属性调整

添加控制面板来调整画笔颜色和粗细:

<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实现画笔功能

<button id="clearBtn">清除画布</button>
document.getElementById('clearBtn').addEventListener('click', () => {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
});

优化绘制性能

使用requestAnimationFrame优化绘制性能:

function draw(e) {
  if (!isDrawing) return;
  ctx.beginPath();
  ctx.moveTo(lastX, lastY);
  ctx.lineTo(e.offsetX, e.offsetY);
  ctx.stroke();
  [lastX, lastY] = [e.offsetX, e.offsetY];
  requestAnimationFrame(() => draw(e));
}

canvas.addEventListener('mousedown', (e) => {
  isDrawing = true;
  [lastX, lastY] = [e.offsetX, e.offsetY];
  draw(e);
});

保存绘制内容

添加保存功能将画布内容导出为图片:

<button id="saveBtn">保存图片</button>
document.getElementById('saveBtn').addEventListener('click', () => {
  const link = document.createElement('a');
  link.download = 'drawing.png';
  link.href = canvas.toDataURL('image/png');
  link.click();
});

标签: 画笔功能
分享给朋友:

相关文章

vue 实现筛选功能

vue 实现筛选功能

实现筛选功能的基本思路 在Vue中实现筛选功能通常涉及以下几个核心步骤:数据绑定、筛选逻辑处理、结果展示。以下是具体实现方法。 数据准备 准备需要筛选的数据源,通常是一个数组,可以存储在Vue组件的…

vue实现后台功能

vue实现后台功能

Vue 实现后台功能的方法 Vue.js 是一个流行的前端框架,适合构建后台管理系统。以下是实现后台功能的常见方法和步骤。 项目初始化 使用 Vue CLI 或 Vite 初始化项目: # Vue…

vue实现模态功能

vue实现模态功能

Vue 实现模态框功能 方法一:使用组件和v-if/v-show控制显示 创建独立的模态框组件(如Modal.vue),通过props接收标题、内容等数据,使用v-if或v-show控制显示状态。…

vue实现换页功能

vue实现换页功能

Vue 实现分页功能 使用第三方库(如 Element UI) 安装 Element UI: npm install element-ui 在 main.js 中引入: import Vue fr…

php购物车功能实现

php购物车功能实现

数据库设计 购物车功能通常需要设计数据库表来存储商品和用户信息。常见的表包括: products 表:存储商品信息,如商品ID、名称、价格、库存等。 users 表:存储用户信息,如用户ID、用户名…

vue实现网页功能

vue实现网页功能

Vue 实现网页功能的核心方法 创建 Vue 项目 使用 Vue CLI 或 Vite 快速初始化项目。Vue CLI 适合传统项目,Vite 适合现代轻量级应用。 npm init vue@lat…