HTML5中标签直接支持透明PNG,只需图片本身含Alpha通道;叠加时用position: relative/absolute定位,Canvas默认支持PNG透明混合,旧浏览器需用PNG-8兼容。
标签就能加载透明PNG不需要额外设置,只要PNG文件本身带Alpha通道(即真正支持透明), 渲染出来就会自动保留透明区域。常见错误是误以为要加CSS opacity 或者用 canvas 才能“实现透明”——其实那是控制整体不透明度,和PNG自身的像素级透明无关。
注意点:
pngquant 压缩时保留 alpha) 或 JS 干预z-index
想让一张PNG盖在另一张上面(比如头像+徽章、图标+角标),核心是脱离文档流并分层。最稳妥方式是用父容器 position: relative,子图用 position: absolute 定位。
@@##@@ @@##@@
关键细节:
badge.png 必须自身含透明背景,否则会遮住下面的图opacity 模拟叠加,它会让整张图变淡,包括透明区域 叠加时必须调用 globalAlpha 吗?不需要。Canvas 默认就支持PNG透明像素的自然混合,只要用 ctx.drawImage() 绘制带Alpha的PNG,透明部分会自动透出下层内容或canvas背景色。

ctx.globalAlpha = 0.8;否则保持默认 1.0 即可。
易错点:
ctx.fillStyle = '#fff'; ctx.fillRect(0,0,w,h);
SecurityError)→ 需服务端配 CORS 或加 crossorigin="anonymous" 属性不是HTML5的问题,是渲染引擎对PNG-alpha的支持差异。IE11及以下不支持PNG-24的完整Alpha(只支持PNG-8的二值透明),旧Android WebView(4.3及以前)也有类似限制。
兼容方案(仅当必须支持这些环境时):
convert in.png -type PaletteAlpha out.png)filter: drop-shadow() 叠加,它在旧环境下可能把透明区域渲染成实色现在绝大多数项目已不用考虑这些,但如果客户明确要求兼容 IE11,PNG素材得提前按老标准处理——这点很容易被忽略,等上线才发现徽章边缘糊成一片灰。