shadowColor 必须显式设置非透明值(如"rgba(0,0,0,0.3)"),否则阴影不可见;shadowBlur在高DPR屏需设为2–12;shadowOffset仅影响下一次fill/stroke;drawImage无视阴影,可用离屏canvas或ctx.filter替代。

shadowColor 不设就看不到阴影,这是最常卡住新手的第一步。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
shadowColor 必须显式设置且非透明
- 默认值是
"rgba(0,0,0,0)"—— 看似“黑”,实为完全透明,设了等于没设 - 只要颜色带 alpha 为 0(比如
"#00000000"或"transparent"),阴影就不可见 - 推荐用
"rgba(0,0,0,0.3)"这类带透明度的写法,比纯"#000"更自然 - 如果后续图形不想带阴影,别只改
shadowColor,最好连同shadowBlur一起重置为 0,避免误影响
阴影只对 fill/stroke 类操作生效,drawImage 被绕过
-
fillRect()、fillText()、stroke()、fill()这些会走阴影管线 -
drawImage()是位图直贴,*完全无视所有shadow属性**,不是 bug,是设计如此 - 替代方案只有两个:
- 先把图片画到离屏
canvas,再用fill()填充该 canvas 的getImageData()(适合静态图,性能差) - 改用
ctx.filter = "drop-shadow(2px 2px 4px rgba(0,0,0,0.3))"(Chrome/Firefox 支持,Safari 15.4+ 才稳定,且 filter 开启后会影响后续所有绘制,必须手动设回"none")
- 先把图片画到离屏
shadowBlur 在高 DPR 屏上容易失效
- 移动端或 Mac Retina 屏下,
shadowBlur = 1基本看不见,因为物理像素密度翻倍,模糊半径没跟着缩放 - 实测建议起步值设为
2,常用范围是2–12;超过20渲染开销明显上升,边缘也趋于糊成一片 - 每次调用
clearRect()、切换canvas.width/height、或执行ctx.save()/ctx.restore()后,所有shadow*状态都会丢失,必须重新赋值
shadowOffsetX 和 shadowOffsetY 是相对图形原点的偏移,不是 CSS 里的“相对于容器”。很多效果做不出来,其实是忘了它们只作用于下一次 fill() 或 stroke(),而不是整个 canvas。


















