HTML5
语义化结构、表单校验、音视频、拖放与文件、Web Storage、现代浏览器 API 与可访问性。
进入 HTML5 教程
examples/**/*.js,不存在“示例和正文对不上”的问题。examples/reference/canvas-2d-starter.js/**
* 【参考示例 · Canvas 2D】粒子星空
* 演示:create2D(自动 DPR 适配)、rafLoop 帧循环、参数面板、清理函数。
*/
import { create2D, rafLoop, cleanupAll } from '../shared/runtime.js'
import { createPanel } from '../shared/ui.js'
import { hsl } from '../shared/math.js'
export default function (container) {
const view = create2D(container, { width: 640, height: 360, background: '#0b1220' })
const { ctx } = view
let count = 140
let speed = 1
let hue = 205
let paused = false
let stars = []
function reset() {
stars = Array.from({ length: count }, () => ({
x: Math.random() * view.width,
y: Math.random() * view.height,
z: 0.25 + Math.random() * 0.75,
r: Math.random() * 1.6 + 0.4
}))
}
function draw(time) {
const { width: w, height: h } = view
ctx.fillStyle = '#0b1220'
ctx.fillRect(0, 0, w, h)
// 中心光晕
const glow = ctx.createRadialGradient(w / 2, h / 2, 0, w / 2, h / 2, Math.max(w, h) / 2)
glow.addColorStop(0, hsl(hue, 0.7, 0.28, 0.55))
glow.addColorStop(1, 'rgba(11, 18, 32, 0)')
ctx.fillStyle = glow
ctx.fillRect(0, 0, w, h)
const dt = paused ? 0 : 0.016 * speed
const cx = w / 2
const cy = h / 2
for (const s of stars) {
if (!paused) {
s.x += (s.x - cx) * 0.06 * dt * s.z * 6
s.y += (s.y - cy) * 0.06 * dt * s.z * 6
if (s.x < -10 || s.x > w + 10 || s.y < -10 || s.y > h + 10) {
const angle = Math.random() * Math.PI * 2
s.x = cx + Math.cos(angle) * 6
s.y = cy + Math.sin(angle) * 6
s.z = 0.25 + Math.random() * 0.75
}
}
ctx.beginPath()
ctx.arc(s.x, s.y, s.r * s.z * 2, 0, Math.PI * 2)
ctx.fillStyle = hsl(hue + s.z * 40 + Math.sin(time + s.x * 0.01) * 12, 0.85, 0.55 + s.z * 0.3, 0.35 + s.z * 0.65)
ctx.fill()
}
ctx.font = '13px ui-monospace, monospace'
ctx.fillStyle = 'rgba(255,255,255,0.55)'
ctx.fillText(`canvas: ${w}×${h} CSS px · dpr ${view.dpr} · 后备存储 ${view.pixelWidth}×${view.pixelHeight}`, 12, h - 12)
}
reset()
const loop = rafLoop(draw)
const panel = createPanel(container, { title: '参数' })
panel.slider({ label: '粒子数量', min: 20, max: 400, value: count, step: 10, onInput: (v) => { count = v; reset() } })
panel.slider({ label: '速度', min: 0, max: 4, value: speed, step: 0.1, onInput: (v) => (speed = v) })
panel.slider({ label: '色相', min: 0, max: 360, value: hue, onInput: (v) => (hue = v) })
panel.buttons([
{ label: '运行中', active: true, onActivate: () => (paused = false) },
{ label: '暂停', onActivate: () => (paused = true) }
])
// 尺寸变化时画布后备存储会自动重建;因为每帧都会重绘,这里无需额外处理。
return cleanupAll(loop, view, panel)
}| 技术 | 本质 | 最适合 | 不适合 |
|---|---|---|---|
| HTML5 | 文档与浏览器能力 | 页面结构、表单、媒体、存储、系统能力调用 | 逐像素绘制 |
| SVG | 保留模式的矢量 DOM | 图标、图表、地图、可缩放插画、需要 CSS/事件逐个控制的图形 | 上万个动态对象、像素级特效 |
| Canvas 2D | 立即模式的位图画布 | 图表、图片处理、2D 游戏、动画 | 需要 DOM 语义/可选中文本的场景 |
| WebGL 1.0 | OpenGL ES 2.0 的 Web 绑定 | 3D 场景、大量精灵、GPU 图像处理 | 复杂的现代 GPU 特性 |
| WebGL 2.0 | OpenGL ES 3.0 的 Web 绑定 | 实例化、变换反馈、3D 纹理、MRT、GPGPU | 需要计算着色器、显式内存管理 |
| WebGPU | 新一代图形 + 计算 API | 高性能 3D、计算着色器、低开销多线程渲染 | 老浏览器、需要立即上线的兼容性场景 |
更完整的对比、决策树与兼容性数据见 六大图形技术选型。
图形 API 只是"怎么把像素画出来"。真正决定代码质量的是另外四块内容,它们同样是可交互示例 + TypeScript 源码:
| 板块 | 适合谁 | 内容 |
|---|---|---|
| 图形学数学 | 想把矩阵/四元数/投影真正搞懂的人 | 坐标系、向量、矩阵、四元数、插值曲线、几何相交、颜色空间、噪声 |
| 算法 | 准备面试或想提升代码效率 | 复杂度、排序、二分、滑动窗口、回溯、DP、图算法、字符串与位运算 |
| 数据结构 | 想知道"该用哪个容器"的人 | 数组/TypedArray、链表、栈队列、哈希表、树、堆、Trie、并查集、线段树、LRU |
| 游戏物理 | 想让物体"动得对"的人 | 物理与力学基础、数值积分与固定步长、碰撞与冲量响应、2D/3D 刚体、平台手感、粒子与布料 |
| 无限画布 | 想做 Figma / MasterGo 类设计平台的人 | 视口坐标、矢量编辑、文本、图层、组件样式、自动布局、标尺网格与吸附、测量、原型、交付导出、版本分支、评论权限、实时协作、插件、性能 |
| 前端程序设计模式 | 想让代码结构更稳的人 | 创建/结构/行为型模式、发布订阅、状态机、组件模式、架构与反模式 |
这四个板块的示例统一用 TypeScript 编写,并且会被 tsc 真实类型检查(pnpm typecheck)——写错参数、漏掉分支都会在检查阶段报错。写法约定见 TypeScript 示例约定。
教程页讲原理,API 速查 板块负责「这个东西叫什么」:每个技术一页,按对象分组的完整方法/属性/常量/事件表,页面顶部有即时筛选框,右侧搜索也能跨页命中。
| 速查页 | 内容 |
|---|---|
| HTML / DOM | 元素与全局属性、input 类型、常用 Web API、DOM 事件总表 |
| SVG | 元素清单、演示属性、path 命令、滤镜图元、DOM 接口 |
| Canvas 2D | CanvasRenderingContext2D 全部成员、渐变、Path2D、ImageData |
| WebGL 1.0 | 按用途分组的方法、GL 对象、常量表、扩展 |
| WebGL 2.0 | 相对 1.0 的增量:新方法、新对象、新常量 |
| GLSL ES | 1.00 / 3.00 的限定符、类型、内置函数 |
| WebGPU | 全部接口方法、描述符字段、枚举、limits / features |
| WGSL | 类型、地址空间、属性、内置变量与函数 |