Canvas无z-index,仅靠绘图顺序模拟层叠:先绘在后绘之下;应按z属性升序排序对象后依次绘制,文字、透明度等需统一纳入排序;多canvas叠加属DOM层,非真正z-index。
Canvas 并不存在 z-index 概念:作为一块位图画布,它会按照代码执行次序,将全部绘制操作覆盖到同一平面缓冲区。所谓“z-index 模拟”,实质上是控制绘图顺序,使后画内容在视觉上位于前方、先画内容处于后方,以此形成层叠效果。
Canvas 的 2D 渲染上下文(ctx)既不维护对象树,也不保存图层栈,只负责维护一个像素缓冲区。因此:
ctx.fillRect(0,0,100,100)(绘制红方块),然后调用 ctx.fillRect(50,50,100,100)(绘制蓝方块),红方块的右下部分会被蓝方块覆盖,因此蓝方块在视觉上“更靠前”建议先依据 z 值对待绘制对象进行分组或排序,从而清楚地控制 z 序:
z 属性(例如 {x:10, y:20, width:50, z:2})Array.sort((a,b) => a.z - b.z) 升序排列(z 小的先画,z 大的后画)ctx.fillRect()、ctx.drawImage() 等globalAlpha)同样会受到绘制次序影响,因此都要纳入统一的排序逻辑有些人会尝试使用多个 <canvas> 元素,并通过 CSS 设置 z-index 进行“分层模拟”,但这种方式属于 DOM 层面的叠加,并非 Canvas 2D 上下文内部的 z-index:
立即学习“前端免费学习笔记(深入)”;
ctx.clip() 和 ctx.save()/ctx.restore() 负责控制绘制范围和样式状态,但不会改变像素的写入次序:
save → clip → fill → restore,该 fill 的覆盖关系依然由它在代码中的出现位置决定draw 调用之后