【发布时间】:2018-11-05 23:16:54
【问题描述】:
我在这里查看了许多画布 z-index 帖子,包括:
HTML5 Canvas layer issue
Multi Layer Canvas HTML5
html5 - canvas element - Multiple layers
但我没有找到问题的答案。
我试图简单地将一个画布直接放在另一个画布后面。当用户点击画布时,它会改变堆叠顺序。但是,画布不是在彼此的前后,而是可以看到,一个在上面,一个在它下面(不是在它后面)(参见https://imgur.com/a/BcUNy)。
HTML 和 CSS:
<div id="preview" style="visibility:hidden;">
<canvas id="cOriginal" width="2" height="1" onclick="clickCompare()" style="position:relative; z-index:2; border-style:solid; border-color: #C0C0C0 #C0C0C0 #606060 #606060;"></canvas>
<canvas id="cPreview" width="2" height="1" onclick="clickCompare()" style="position:relative; z-index:1; border-style:solid; border-color: #C0C0C0 #C0C0C0 #606060 #606060;"></canvas>
<canvas id="cSave" width="2" height="1" style="position:relative; z-index:0; border-style:solid; border-color: #C0C0C0 #C0C0C0 #606060 #606060;"></canvas>
</div>
非常感谢!
编辑:更新我的问题以显示当前问题。
HTML:
<div id="preview" style="visibility:hidden; position:relative;">
<canvas id="cOriginal" width="2" height="1" onclick="clickCompare()" style="position:absolute; z-index:2; border-style:solid; border-color: #C0C0C0 #C0C0C0 #606060 #606060;"></canvas>
<canvas id="cPreview" width="2" height="1" onclick="clickCompare()" style="position:absolute; z-index:1; border-style:solid; border-color: #C0C0C0 #C0C0C0 #606060 #606060;"></canvas>
<canvas id="cSave" width="2" height="1" style="position:absolute; z-index:0; border-style:solid; border-color: #C0C0C0 #C0C0C0 #606060 #606060;"></canvas>
</div>
CSS(居中代码):
<style>
#cOriginal, #cPreview, #cSave { max-width: 100%; display: block; margin: auto; left: 0; right: 0; margin-left: auto; margin-right: auto; }
</style>
画布现在分层并居中。但是画布后面的一切都坏了。见https://imgur.com/AHG59zd。谢谢!
【问题讨论】:
-
为什么不只使用一个画布并按照您想要的顺序绘制图像。它更快(无需强制回流和不受控制的合成)并且代码更简单。
-
感谢您的评论,但这在这里不会有效。该代码将用于显示原始图像与编辑后的图像。编辑代码遍历图像以读取它,对 R、G、B、A 数组进行更改,然后再次迭代以重绘图像。在大图像上,这可能很耗时。如果图像可以绘制一次然后简单地交换 z-index 顺序,那么复制所有这些是没有意义的。
-
只需将编辑后的图像保留为屏幕外画布即可。总体而言,您将获得性能提升。您可以像绘制图像一样将画布绘制到画布上。
ctx.drawImage(canvas2,0,0) -
@Blindman67 这很有趣,感谢您指出。将“canvas2”保持在屏幕之外的首选方法是什么?