当前位置:首页 > JavaScript

js实现画布

2026-02-01 19:27:05JavaScript

使用Canvas API创建画布

在HTML中通过<canvas>标签创建画布基础结构,需设置宽度和高度属性:

<canvas id="myCanvas" width="500" height="300"></canvas>

通过JavaScript获取画布上下文并设置绘图环境:

const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');

基本绘图操作

绘制矩形可使用以下方法:

ctx.fillStyle = 'red';  // 设置填充颜色
ctx.fillRect(50, 50, 100, 75);  // 绘制填充矩形(x,y,width,height)

ctx.strokeStyle = 'blue';  // 设置描边颜色
ctx.lineWidth = 3;  // 设置线宽
ctx.strokeRect(200, 50, 100, 75);  // 绘制描边矩形

绘制路径时需使用路径命令:

ctx.beginPath();
ctx.moveTo(100, 150);  // 起点
ctx.lineTo(250, 150);  // 直线
ctx.arc(200, 200, 50, 0, Math.PI * 2);  // 圆形
ctx.closePath();  // 闭合路径
ctx.fill();  // 填充路径

文本与图像处理

绘制文本需设置字体属性:

ctx.font = '24px Arial';
ctx.fillStyle = 'green';
ctx.fillText('Hello Canvas', 150, 100);  // 填充文本
ctx.strokeText('Hello Canvas', 150, 130);  // 描边文本

加载并绘制图像:

const img = new Image();
img.src = 'image.png';
img.onload = function() {
  ctx.drawImage(img, 0, 0, 200, 150);  // 绘制缩放图像
};

动画实现

使用requestAnimationFrame实现动画循环:

let x = 0;
function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);  // 清空画布
  ctx.fillRect(x, 100, 50, 50);
  x += 2;
  if (x < canvas.width) {
    requestAnimationFrame(animate);
  }
}
animate();

高级特性应用

实现粒子系统可创建对象数组:

const particles = [];
for (let i = 0; i < 100; i++) {
  particles.push({
    x: Math.random() * canvas.width,
    y: Math.random() * canvas.height,
    size: Math.random() * 5 + 2
  });
}

function drawParticles() {
  particles.forEach(p => {
    ctx.beginPath();
    ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);
    ctx.fill();
  });
}

添加交互事件监听:

canvas.addEventListener('mousemove', (e) => {
  const rect = canvas.getBoundingClientRect();
  const x = e.clientX - rect.left;
  const y = e.clientY - rect.top;
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillRect(x - 25, y - 25, 50, 50);
});

性能优化技巧

离屏渲染可提升复杂场景性能:

const offscreen = document.createElement('canvas');
offscreen.width = 200;
offscreen.height = 200;
const offCtx = offscreen.getContext('2d');
// 在离屏画布上预绘制
offCtx.fillRect(0, 0, 200, 200);
// 主画布上快速绘制
ctx.drawImage(offscreen, 0, 0);

使用willReadFrequently属性优化频繁读取操作:

js实现画布

const ctx = canvas.getContext('2d', { willReadFrequently: true });

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

相关文章

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…

js实现正交

js实现正交

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

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…

js分页实现

js分页实现

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