必须满足chrome/edge≥88且css.paintworklet.addmodule()成功加载注册,否则background: paint(wave)静默失效;需提前执行addmodule、使用http服务、确保mime类型和cors、大小写严格匹配;firefox/safari不支持,须用@supports降级。

直接能做,但必须满足两个硬性前提:Chrome/Edge ≥ 88(2026 年稳定版默认开启),且 CSS.paintWorklet.addModule() 成功加载并注册 worklet;否则 background: paint(wave) 会被静默忽略——不报错、不渲染、DevTools 里也看不到绘制痕迹。
为什么 background: paint(wave) 完全没反应?
最常见原因不是 JS 写错,而是环境或加载时机失败:
-
CSS.paintWorklet.addModule('wave-painter.js')必须在任何含paint(wave)的 CSS 规则被解析前执行;异步加载未 await 就插入样式,会失效 - 本地开发用
file://协议时,worklet 加载静默失败——必须起本地 HTTP 服务(如python3 -m http.server) - JS 文件返回非 200 状态、MIME 类型不是
application/javascript、或跨域没配Access-Control-Allow-Origin,addModule() 会拒绝 - 注册名不一致:
registerPaint('wave', ...)和 CSS 中paint(wave)大小写、拼写必须完全相同 - Firefox/Safari 当前(2026 年中)仍不支持 Paint API,
paint()声明会被当作无效值丢弃
如何让波浪随容器尺寸和参数实时重绘?
不能靠 JS 函数传参,唯一受支持的响应通道是 CSS 自定义属性 + inputProperties 声明:
- 在 worklet 类中显式声明:
static get inputProperties() { return ['--wave-amplitude', '--wave-frequency', '--wave-color']; } - CSS 中设置变量:
.wave-bg { --wave-amplitude: 16; --wave-frequency: 0.05; --wave-color: #3b82f6; background: paint(wave); } - JS 修改触发重绘:
el.style.setProperty('--wave-amplitude', '24'),无需手动调用重绘逻辑 - 未在
inputProperties中声明的变量,properties.get('--xxx')返回undefined,不会抛错但取不到值
paint() 里怎么画出平滑正弦波?注意这些限制
paint() 接收的 ctx 是 PaintRenderingContext2D,不是完整 Canvas 2D Context:
- 可用:
beginPath()、lineTo()、stroke()、fillStyle、strokeStyle、clearRect() - 不可用:
drawImage()、getImageData()、clip()(Chrome 115+ 才部分支持)、transform()、save()/restore() - 坐标系原点在左上角,
size.width/size.height是当前背景绘制区域尺寸(单位 CSS px),已自动适配设备像素比 - 别在
paint()里做密集计算:避免 for 循环生成上千点,禁用Math.random();波形建议用Math.sin(i * frequency)直接算
真正容易被忽略的是降级处理——@supports (background: paint()) 必须包裹所有 paint() 相关规则,并提供纯 CSS fallback(如线性渐变或图片背景),否则 Safari/Firefox 用户看到的是透明块。另外,worklet 文件不能含任何 DOM 操作(document、window、fetch),否则注册直接失败。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











