HTML 的 <canvas> 标签

作者:hubenchang0515日期:2025/11/11

#HTML 的 <canvas> 标签

请查看 HTML 元素帮助手册 了解更多 HTML 元素。

<canvas> 元素可被用来通过 JavaScript(Canvas API 或 WebGL API)绘制图形及图形动画。

#属性

请查看 HTML 元素的全局属性 了解 HTML 元素的全局属性。

  • height: 该元素占用空间的高度,以 CSS 像素(px)表示,默认为 150。
  • moz-opaque(废弃): 通过设置这个属性,来控制 canvas 元素是否半透明。如果你不想 canvas 元素被设置为半透明,使用这个元素将可以优化浏览器绘图性能。
  • width: 该元素占用空间的宽度,以 CSS 像素(px)表示,默认为 300。

#示例

1<canvas id="myCanvas">
2</canvas>
3
4<script>
5    // 2. 获取 Canvas 上下文
6    const canvas = document.getElementById("myCanvas");
7    const ctx = canvas.getContext("2d");
8
9    // 3. 设置画布尺寸为窗口大小
10    canvas.width = window.innerWidth;
11    canvas.height = window.innerHeight;
12
13    // 4. 定义小球对象
14    const ball = {
15        x: canvas.width / 2,
16        y: canvas.height / 2,
17        radius: 20,
18        dx: 4,  // x轴速度
19        dy: 4,  // y轴速度
20        color: `hsl(${Math.random() * 360}, 70%, 50%)`
21    };
22
23    // 5. 绘制小球的函数
24    function drawBall() {
25        ctx.beginPath();
26        ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI * 2);
27        ctx.fillStyle = ball.color;
28        ctx.fill();
29        ctx.closePath();
30    }
31
32    // 6. 动画循环
33    function animate() {
34        // 清空画布(半透明效果会产生拖尾)
35        ctx.fillStyle = "rgba(255, 255, 255, 0.1)";
36        ctx.fillRect(0, 0, canvas.width, canvas.height);
37
38        drawBall();
39
40        // 碰撞检测(碰到边缘反弹)
41        if (ball.x + ball.radius > canvas.width || ball.x - ball.radius < 0) {
42            ball.dx = -ball.dx;
43            ball.color = `hsl(${Math.random() * 360}, 70%, 50%)`; // 随机变色
44        }
45        if (ball.y + ball.radius > canvas.height || ball.y - ball.radius < 0) {
46            ball.dy = -ball.dy;
47            ball.color = `hsl(${Math.random() * 360}, 70%, 50%)`;
48        }
49
50        // 更新位置
51        ball.x += ball.dx;
52        ball.y += ball.dy;
53
54        requestAnimationFrame(animate);
55    }
56
57    // 7. 启动动画
58    animate();
59</script>
60
<canvas>

#推荐阅读


HTML 的 <canvas> 标签》 是转载文章,点击查看原文


相关推荐


CCState:为大型 Web 应用设计的状态管理库
温宇飞2025/11/9

CCState 是一个基于 Signal 的状态管理库。它通过三种语义化的信号类型(State、Computed、Command)实现读写能力隔离,并原生支持 async/await 的异步计算,让状态管理变得简单直观。CCState 与框架无关,可与 React、Vue、Solid.js 等任何 UI 框架无缝集成。它在 秒多 等项目中得到验证,为大规模应用而设计。 快速上手 Signal Signal 是一个轻量级的描述对象,它本身不存储值,只是一个"引用"或"标识符"。所有 Signal


为什么你的JavaScript代码总是出bug?这5个隐藏陷阱太坑了!
良山有风来2025/11/7

你是不是经常遇到这样的情况:明明代码看起来没问题,一运行就各种报错?或者测试时好好的,上线后用户反馈bug不断?更气人的是,有时候改了一个小问题,结果引出了三个新问题…… 别担心,这绝对不是你的能力问题。经过多年的观察,我发现大多数JavaScript开发者都会掉进同样的陷阱里。今天我就来帮你揪出这些隐藏的bug制造机,让你的代码质量瞬间提升一个档次! 变量声明那些事儿 很多bug其实从变量声明的那一刻就开始埋下了隐患。看看这段代码,是不是很眼熟? // 反面教材:变量声明混乱 function


【基础算法】DFS中的剪枝与优化
让我们一起加油好吗2025/11/2

文章目录 上文链接一、剪枝与优化1. 排除等效冗余2. 可行性剪枝3. 最优性剪枝4. 优化搜索顺序5. 记忆化搜索 二、OJ 练习1. 数的划分(1) 解题思路(2) 代码实现 2. 小猫爬山(1) 解题思路(2) 代码实现 上文链接 【基础算法】DFS 一、剪枝与优化 剪枝,形象地看,就是剪掉搜索树的分支,从而减小搜索树的规模,排除掉搜索树中没有必要的分支,优化时间复杂度。 在深度优先遍历中,有几种常见的剪枝方法: 1. 排除等效冗余 如


Python 的内置函数 exec
IMPYLH2025/10/30

Python 内建函数列表 > Python 的内置函数 exec Python 的内置函数 exec 是一个强大的动态执行工具,它允许程序在运行时执行以字符串形式提供的 Python 代码。 def eval(source:str|codeobject, /, globals:dict=None, locals:mapping=None): ''' 执行表达式并返回结果 :param source: Python 表达式 :param globals :


面经分享——字节前端一面
Moment2025/10/28

最近在使用 NestJs 和 NextJs 在做一个协同文档 DocFlow,如果感兴趣,欢迎 star,有任何疑问,欢迎加我微信进行咨询 yunmz777 1. 使用的 React 版本? React 版本演进的趋势是怎样的? React 的版本迭代趋势体现了其向更高效、更简洁的开发体验不断发展的方向。从 React 16 开始,React 引入了许多新特性,如错误边界(Error Boundaries)和 Fiber 架构,显著提高了渲染效率。React 17 主要是稳定性的更新,并没有引入


Redis(83)Redis的缓存击穿是什么?
Victor3562025/10/25

缓存击穿的概念 缓存击穿(Cache Breakdown)指的是在某一个热点缓存数据过期的瞬间,有大量并发请求同时访问这个数据,而该数据在缓存中不存在,因此所有的请求都打到数据库上,导致数据库压力过大,可能引起系统性能问题。 解决缓存击穿的方法 为了解决缓存击穿问题,可以采取以下策略: 互斥锁(Mutex):在缓存失效时,只有一个线程去加载数据,其他线程等待。 永不过期:热点数据的缓存永不过期,只在数据更新时主动去更新缓存。 预加载:在缓存即将过期之前,提前加载数据到缓存。 以下是这几种解决


从入门到精通:JavaScript异步编程避坑指南
良山有风来2025/10/23

你是不是也遇到过这样的场景?页面上有个按钮,点击后需要先请求数据,然后根据数据更新界面,最后弹出提示框。结果代码写着写着就变成了“回调地狱”,一层套一层,自己都看不懂了。更可怕的是,有时候数据没加载完,页面就显示了,各种undefined错误让人抓狂。 别担心,这篇文章就是来拯救你的。我会带你从最基础的异步概念开始,一步步深入Promise、async/await,最后还会分享几个实战中超级好用的技巧。读完本文,你不仅能彻底理解JavaScript的异步机制,还能写出优雅高效的异步代码。 为什么


Swift 字符串与字符完全导读(三):比较、正则、性能与跨平台实战
unravel20252025/10/22

字符串比较的 3 个层次 比较方式API等价准则复杂度备注字符相等“==”扩展字形簇 canonically equivalentO(n)最常用前缀hasPrefix(:)UTF-8 字节逐段比较O(m)m=前缀长度后缀hasSuffix(:)同上,从后往前O(m)注意字形簇边界 示例 let precomposed = "café" // U+00E9 let decomposed = "


主流DDS实现简介及对比
^Moon^2025/10/20

DDS有多个团体进行过实现,这些实现各有侧重,适用于不同场景(如嵌入式、实时系统、大规模分布式系统等)。以下从开源属性、性能、功能、适用场景等维度进行对比分析: 一、主流DDS实现简介及对比 特性RTI Connext DDSFast DDSADLINK OpenSplice DDSCycloneDDS开发者Real-Time Innovations (RTI)eProsima(西班牙公司)ADLINK Technology(台湾凌华)Eclipse基金会(开源社区)开源属性商业闭源(提供免


Anthropic Haiku 4.5:这波AI性能,我愿称之为“超值”!
墨风如雪2025/10/19

嘿,各位AI圈的朋友们!最近,Anthropic又悄悄地扔出了一颗重磅炸弹——他们最新发布的Claude Haiku 4.5,可不是那种哗众取宠的“大而全”模型,它走的是一条“小、快、灵”的路线,但其带来的性价比和实用性,绝对能让你眼前一亮。在我看来,这不只是一次版本更新,更是AI普惠化进程中一个非常重要的里程碑。 想象一下,你用着一台小型跑车的钱,却买到了一辆豪华轿车的核心动力,甚至速度还更快——Claude Haiku 4.5给人的,就是这样一种惊喜。 小身材,大能量:性能直逼“老大哥” H

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读