【发布时间】:2021-06-05 13:46:21
【问题描述】:
我正在阅读来自 MDN 的 Canvas 元素,并遇到了一个通过 globalAlpha 属性设置透明度的示例。
<!DOCTYPE html>
<html>
<style type="text/css">
canvas{
border: 1px solid black;
}
</style>
<head>
<title>Canvas Example</title>
</head>
<body>
<canvas id='tutorial' width="150" height="150"></canvas>
</body>
<script>
let canvas=document.getElementById("tutorial");
let ctx=canvas.getContext('2d');
ctx.fillStyle="#F00";
ctx.fillRect(0,0,75,75);
ctx.fillStyle="#0F0"
ctx.fillRect(75,0,75,75)
ctx.fillStyle="#00F";
ctx.fillRect(0,75,75,75);
ctx.fillStyle="#0FF"
ctx.fillRect(75,75,75,75)
ctx.fillStyle='#FFF';
ctx.globalAlpha=0.2;
ctx.beginPath();
for(let i=1;i<8;i++){
ctx.arc(75, 75, 10*i, 0, 2 * Math.PI, true)
ctx.fill();
}
ctx.fill();
</script>
</html>
在上面的示例中,我创建了 8 个同心圆,每个同心圆的透明度为 0.2 。但我仍然可以看到画布元素的中心。
画布中心不应该被 5 个圆圈隐藏/不透明吗?
如果我将 globalAlpha 值更改为 0.4 或 0.5,我将无法再看到 Canvas 元素的中心
示例如下:
<!DOCTYPE html>
<html>
<style type="text/css">
canvas{
border: 1px solid black;
}
</style>
<head>
<title>Canvas Example</title>
</head>
<body>
<canvas id='tutorial' width="150" height="150"></canvas>
</body>
<script>
let canvas=document.getElementById("tutorial");
let ctx=canvas.getContext('2d');
ctx.fillStyle="#F00";
ctx.fillRect(0,0,75,75);
ctx.fillStyle="#0F0"
ctx.fillRect(75,0,75,75)
ctx.fillStyle="#00F";
ctx.fillRect(0,75,75,75);
ctx.fillStyle="#0FF"
ctx.fillRect(75,75,75,75)
ctx.fillStyle='#FFF';
ctx.globalAlpha=0.5;
ctx.beginPath();
for(let i=1;i<8;i++){
ctx.arc(75, 75, 10*i, 0, 2 * Math.PI, true)
ctx.fill();
}
</script>
</html>
谁能解释一下,
-
为什么当 globalAlpha 值为 0.2 而不是 0.5 时我仍然可以看到中心?
-
为什么堆叠 2 个不透明度为 0.5 的圆圈或 5 个不透明度为 0.2 的圆圈不会使其完全不透明?
【问题讨论】:
-
我不知道该告诉你什么。如果你把一块玻璃板放在一个表面上,你可以透过它看到表面。
-
@Hiro 是的,我明白这一点,但是如果我们堆叠一定数量的板,每个都具有一定的不透明度,我们不应该看不到表面吗?
-
我不明白为什么堆叠 2 个不透明度为 0.5 的圆圈或 5 个不透明度为 0.2 的圆圈使其完全不透明?
-
不相关,但您应该真正将 beginPath() 放入循环中。
标签: javascript html canvas html5-canvas