canvas制图做刮刮卡效果

2017-12-19  本文已影响6人  哼_

感谢小厨笔记的代码,事件那块写的很好.
其实我一开始只是想把变形金刚画出来,最后画成这样了.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="./index.css">
    <title>Document</title>
    <style>
        body{
            position: relative;
        }
#canvas{
    border:1px solid #ccc;
    display: block;
    margin: 20px auto;
    position: absolute;
    z-index: 9;
}
#box{
    border:1px solid #ccc;
    display: block;
    margin: 20px auto;
    position: absolute;
    text-align: center;
    width:700px;
    height: 700px;
    line-height: 700px;//重叠div和canvas,用z-index和position:absolute重叠两个元素,
}
    </style>
    
</head>
<body>
            <div id="box"></div>
            <canvas id="canvas" width="700" height="700"></canvas> 
    
</body>
<script>
    function drawGrid(CANVAS_WIDTH,CANVAS_HEIGHT,GRID_WIDTH,GRID_HEIGHT){
        var rows=parseInt(CANVAS_WIDTH/GRID_WIDTH);  
        var cols=parseInt(CANVAS_HEIGHT/GRID_HEIGHT);  
        for(var i=0;i<rows;++i)  {  
            for(var j=0;j<cols;++j)  
            {  
                drawRect(i,j,GRID_WIDTH,GRID_HEIGHT);  
                if(i==0||j==0)                  
                {  
                    drawText(i,j,GRID_WIDTH,GRID_HEIGHT); //增加坐标  
                }  
            }  
        }  
}
    drawGrid(700,700,50,50)
    // 绘制矩形  
    var myCanvas = document.getElementById("canvas");
     var ctx=myCanvas.getContext("2d");  
     console.log(ctx)
function drawRect(i,j,GRID_WIDTH,GRID_HEIGHT){ 
    var ctx=document.getElementById("canvas").getContext("2d");  
    ctx.lineWidth=0.5;  
    ctx.fillStyle="#ccc";  
    ctx.strokeRect(i*50,j*50,GRID_WIDTH,GRID_HEIGHT);  
}
//绘制横坐标与纵坐标  
function drawText(i,j,GRID_WIDTH,GRID_HEIGHT){  
    var ctx=document.getElementById("canvas").getContext("2d");  
    var x_axis=i*50+"";  
    var y_axis=j*50+"";  

} 
ctx.beginPath();
ctx.fillStyle = "#8b9096"
ctx.lineWidth="6";
ctx.moveTo(8*2,17*2);
ctx.lineTo(24*2,102*2);
ctx.lineTo(67*2,130*2);
ctx.lineTo(120*2,139*2);
ctx.lineTo(113*2,82*2);
ctx.lineTo(64*2,51*2);
ctx.lineTo(57*2,22*2);
ctx.lineTo(16,34);

ctx.fill()

ctx.beginPath();
ctx.fillStyle = "#8b9096"
ctx.moveTo(59*2,22*2);
ctx.lineTo(65*2,48*2);//65+158
ctx.lineTo(142*2,98*2);
ctx.lineTo(220*2,48*2);
ctx.lineTo(224*2,22*2);
ctx.quadraticCurveTo(300, 0, 59*2,22*2);
ctx.fill();

ctx.beginPath();
ctx.fillStyle = "#8b9096"
ctx.moveTo(227*2,22*2);
ctx.lineTo(280*2,16*2);
ctx.lineTo(259*2,102*2);
ctx.lineTo(220*2,130*2);
ctx.lineTo(165*2,140*2);
ctx.lineTo(174*2,82*2);//
ctx.lineTo(222*2,51*2);//
ctx.lineTo(227*2,22*2);
ctx.fill();

ctx.beginPath();
ctx.fillStyle = "#8b9096"
ctx.moveTo(115*2,85*2);
ctx.lineTo(122*2,144*2);
ctx.lineTo(124*2,204*2);
ctx.lineTo(161*2,204*2);
ctx.lineTo(163*2,144*2);
ctx.lineTo(170*2,84*2);
ctx.lineTo(142*2,102*2);
ctx.lineTo(115*2,85*2);
ctx.fill();

ctx.beginPath();
ctx.fillStyle = "#8b9096"
ctx.moveTo(31*2,110*2);
ctx.lineTo(37*2,213*2);
ctx.lineTo(83*2,249*2);
ctx.lineTo(83*2,157*2);
ctx.lineTo(66*2,143*2);
ctx.lineTo(64*2,133*2);
ctx.lineTo(31*2,110*2);
ctx.fill();

ctx.beginPath();
ctx.fillStyle = "#8b9096"
ctx.moveTo(255*2,110*2);
ctx.lineTo(247*2,213*2);
ctx.lineTo(202*2,249*2);
ctx.lineTo(202*2,157*2);//∠近或者元
ctx.lineTo(220*2,143*2);
ctx.lineTo(220*2,133*2);
ctx.lineTo(255*2,110*2);
ctx.fill();


ctx.beginPath();
ctx.fillStyle = "#8b9096"
ctx.moveTo(121*2,231*2);
ctx.lineTo(107*2,268*2);
ctx.lineTo(179*2,268*2);
ctx.lineTo(165*2,231*2);
ctx.fill();

ctx.beginPath();
ctx.fillStyle = "#8b9096"
ctx.moveTo(86*2,157*2);
ctx.lineTo(86*2,251*2);
ctx.lineTo(105*2,266*2);
ctx.lineTo(120*2,228*2);
ctx.lineTo(166*2,228*2);
ctx.lineTo(181*2,266*2);
ctx.lineTo(198*2,251*2);
ctx.lineTo(198*2,157*2);
ctx.lineTo(164*2,143*2);
ctx.lineTo(164*2,206*2);
ctx.lineTo(120*2,206*2);
ctx.lineTo(120*2,143*2);
ctx.lineTo(86*2,157*2);
ctx.fill();

ctx.beginPath();
ctx.fillStyle = "#fff"
ctx.moveTo(114*2,41*2);
ctx.lineTo(172*2,41*2);
ctx.lineTo(142*2,61*2);
ctx.lineTo(114*2,41*2);
ctx.fill();

//脸上的白线
ctx.beginPath();
ctx.fillStyle = "#fff"
ctx.moveTo(39*2,55*2);
ctx.lineTo(39*2,58*2);
ctx.lineTo(92*2,92*2);
ctx.lineTo(92*2,89*2);
ctx.lineTo(39*2,55*2);
ctx.fill();


ctx.beginPath();
ctx.fillStyle = "#fff"
ctx.moveTo(44*2,79*2);
ctx.lineTo(44*2,82*2);
ctx.lineTo(95*2,115*2);
ctx.lineTo(95*2,112*2);
ctx.lineTo(44*2,79*2);
ctx.fill();
//右边脸上的白线
ctx.beginPath();
ctx.fillStyle = "#fff"
ctx.moveTo(247*2,55*2);
ctx.lineTo(247*2,58*2);
ctx.lineTo(193*2,92*2);
ctx.lineTo(193*2,89*2);
ctx.lineTo(247*2,55*2);
ctx.fill();

ctx.beginPath();
ctx.fillStyle = "#fff"
ctx.moveTo(240*2,79*2);
ctx.lineTo(240*2,82*2);
ctx.lineTo(189*2,115*2);
ctx.lineTo(189*2,112*2);
ctx.lineTo(240*2,79*2);
ctx.fill();

// ctx.beginPath();
// ctx.fillStyle = "#ccc"
// ctx.rect(250*2,250*2,200,100);
// ctx.fill();

var box = document.getElementById("box")
box.innerHTML = "谢谢惠顾";
box.style.fontSize = "50px"

var isDown = false;//鼠标是否按下的标志
var pointerArr = []; //鼠标移动坐标数组
var xPointer = 0;//鼠标当前x坐标
var yPointer = 0;//鼠标当前y坐标
//pc,移动事件兼容写法
var hastouch = "ontouchstart" in window ? true : false,
// ontouchstart存在window么,存在hastouch为true,不存在hastouch为false;
    tapstart = hastouch ? "touchstart" : "mousedown",
    tapmove = hastouch ? "touchmove" : "mousemove",
    tapend = hastouch ? "touchend" : "mouseup";
//鼠标按下
myCanvas.addEventListener(tapstart,function (event){
    var e = window.event || event;
    this.style.cursor = "move";
    //此光标指示某对象可被移动
    isDown = true;
    xPointer = hastouch ? e.targetTouches[0].pageX : e.clientX - this.offsetLeft;
    yPointer = hastouch ? e.targetTouches[0].pageY : e.clientY - this.offsetTop;;
    pointerArr.push([xPointer, yPointer]);
    circleReset(ctx);
})

//鼠标按下后拖动
myCanvas.addEventListener(tapmove, function(event) {
        var e=window.event||event;//2017-12-06
        if (isDown) {
        xPointer = hastouch ? e.targetTouches[0].pageX : e.clientX - this.offsetLeft;;
        yPointer = hastouch ? e.targetTouches[0].pageY : e.clientY - this.offsetTop;;
        pointerArr.push([xPointer, yPointer]);
        circleReset(ctx);
        }
    });


    //鼠标抬起取消事件
    myCanvas.addEventListener(tapend, function(event) {
        isDown = false;
        pointerArr = [];
    });


    //圆形橡皮檫
    function circleReset(ctx) {
        ctx.save();
        ctx.beginPath();
        ctx.moveTo(pointerArr[0][0], pointerArr[0][1]);
        ctx.lineCap = "round";   //设置线条两端为圆弧
        ctx.lineJoin = "round";   //设置线条转折为圆弧
        ctx.lineWidth = 10;
        ctx.globalCompositeOperation = "destination-out";
        if (pointerArr.length == 1) {
            ctx.lineTo(pointerArr[0][0] + 1, pointerArr[0][1] + 1);
        } else {
            for (var i=1;i<pointerArr.length;i++) {
                ctx.lineTo(pointerArr[i][0], pointerArr[i][1]);
                ctx.moveTo(pointerArr[i][0], pointerArr[i][1]);
            }
        }
        ctx.closePath();
        ctx.stroke();
        ctx.restore();
    }
</script>
</html>

效果图展示


未刮开效果
刮开效果
上一篇下一篇

猜你喜欢

热点阅读