You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让上层Canvas完全覆盖下层Canvas?解决Canvas遮挡异常问题

解决Canvas矩形无法覆盖下层线条的问题

这个问题的核心是两个Canvas的堆叠层级搞反了,并不是你的globalAlpha或者fillStyle设置有问题。我来给你详细拆解:

问题原因

你给两个Canvas都设置了position:absolute,在这种定位规则下,DOM中后出现的元素会默认堆叠在前面。看你的HTML结构:

<canvas id="test_canvas" ...></canvas> 
<canvas id="line_canvas" ...></canvas>

line_canvas写在test_canvas后面,所以它实际是在视觉上层的——你在test_canvas绘制的矩形,其实被line_canvas的线条挡住了,看起来就像是矩形呈现透明效果。

两种可行解决方案

方案1:调整HTML中Canvas的顺序

把line_canvas放到test_canvas前面,这样test_canvas会自然堆叠在上方:

<div id="background"> 
  <div id="test"> 
    <canvas id="line_canvas" width="350" height="400" style="border:1px solid #d3d3d3;">err</canvas> 
    <canvas id="test_canvas" width="350" height="400" style="border:1px solid #d3d3d3;">err</canvas> 
  </div> 
</div>

方案2:用CSS的z-index强制设置层级

如果不想调整HTML结构,可以给test_canvas设置更高的z-index值,让它强制显示在line_canvas之上:

#background { margin: 0px; padding: 0px; width: 100%; height: 100% } 
#test { position:relative; margin: 0px; padding: 0px; width: 100%; height: 100%; } 
#line_canvas{ margin: 0px; padding: 0px; position:absolute; left: 0px; top: 0px; } 
#test_canvas{ 
    margin: 0px; 
    padding: 0px; 
    position:absolute; 
    left: 0px; 
    top: 0px; 
    z-index: 10; /* 只要比line_canvas的默认z-index(0)高即可 */
} 

修正后的完整代码示例

<!DOCTYPE html>
<html>
<head>
  <style>
    #background { margin: 0px; padding: 0px; width: 100%; height: 100% } 
    #test { position:relative; margin: 0px; padding: 0px; width: 100%; height: 100%; } 
    #line_canvas{ margin: 0px; padding: 0px; position:absolute; left: 0px; top: 0px; } 
    #test_canvas{ margin: 0px; padding: 0px; position:absolute; left: 0px; top: 0px; z-index:10; } 
  </style>
</head>
<body>
<div id="background"> 
  <div id="test"> 
    <canvas id="line_canvas" width="350" height="400" style="border:1px solid #d3d3d3;">err</canvas> 
    <canvas id="test_canvas" width="350" height="400" style="border:1px solid #d3d3d3;">err</canvas> 
  </div> 
</div>
<script>
var line_canvas = document.getElementById("line_canvas"); 
var test_canvas = document.getElementById("test_canvas"); 
var line_drawmap = line_canvas.getContext("2d"); 
var test_drawmap = test_canvas.getContext("2d"); 
line_drawmap.strokeStyle = "#000"; 
line_drawmap.beginPath(); 
line_drawmap.moveTo(100, 0); 
line_drawmap.lineTo(100, 400); 
line_drawmap.stroke(); 
line_drawmap.beginPath(); 
line_drawmap.moveTo(250, 0); 
line_drawmap.lineTo(250, 400); 
line_drawmap.stroke(); 
test_drawmap.globalAlpha = 1; 
test_drawmap.fillStyle = "rgba(100,30,100,1)"; 
test_drawmap.fillRect(50, 50, 260, 160); 
test_drawmap.font = "30px Microsoft YaHei"; 
test_drawmap.textAlign = "center" 
test_drawmap.fillStyle = "#00FFFF"; 
test_drawmap.fillText("test", 240, 130); 
test_drawmap.stroke(); 
</script>
</body>
</html>

这样修改后,test_canvas的矩形就能完全覆盖line_canvas的线条了。

内容的提问来源于stack exchange,提问作者天使街区

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:02:45