globalCompositeOperation
该属性设置或返回如何将一个源(新的)图像绘制到目标(已有的)的图像上。
源图像 = 你打算放置到画布上的绘图
目标图像 = 你已经放置在画布上的绘图
<canvas id="canvas" width="800" height="600"></canvas>
<script>
var canvas = document.querySelector("#canvas")
var ctx = canvas.getContext("2d")
//第一个红色矩形为目标图像
ctx.fillStyle = "hotpink"
ctx.fillRect(100,100,200,200)
//第二个蓝色矩形为源图像
ctx.fillStyle = "deepskyblue"
ctx.fillRect(200,200,200,200)
</script>
设置globalCompositeOperation的值是atop
设置source-in,如下
设置source-out,如下
设置destination-over,如下
设置destination-atop,如下
设置destination-in,如下
设置destination-out,如下(刮刮卡就是用这个)
设置lighter,如下
设置copy,如下(copy就是之前的图片都不见了,只保留最新的图像)
设置xor,如下(等同于设置lighter)
刮刮卡功能实现
<style type="text/css">
#ggk{
width:400px;
height:100px;
position:relative;
}
#ggk .jp{
width:400px;
height:100px;
position:absolute;
left:0;
top:0;
text-align:center;
color:deeppink;
font-size:50px;
line-height:100px;
}
#canvas{
width:400px;
height:100px;
position:absolute;
left:0;
top:0;
}
</style>
<body>
<div id="ggk">
<div class="jp">谢谢惠顾</div>
<canvas id="canvas" width="400" height="100"></canvas>
</body>
<script>
var canvas = document,querySelector("#canvas")
var ggkDom = document,querySelector("#ggk")
var ctx = canvas.getContext('2d')
ctx.fillStyle = 'darkgray'
ctx.fillRect(0,0,400,100)
ctx.font = "20px 微软雅黑"
ctx.fillStyle = 'fff'
ctx.fillText("刮刮卡".180,50)
var isDraw = false;
// 设置isDraw = true,即为允许绘制
canvas.onmousedown = function(){
isDraw = true
}
// 移动的时候绘制圆形,将源图像内的目标的内容给清除掉
canvas.onmousemove = function(e){
if(isDraw){
var x = e.pageX - ggkDom.offsetLeft
var y = e.pageY - ggkDom.offsetTop
ctx.globalCompositeOperation = "destination-out"
ctx.arc(x,y,20,0,2*Math.PI)
ctx.fill()
}
}
canvas.onmouseup = function(){
isDraw = false
}
</script>