渡一教育公开课web前端开发JavaScript精英课学习笔记(二十)Canvas实现PC画板

Canvas实现PC画板

渡一教育公开课web前端开发JavaScript精英课学习笔记(二十)Canvas实现PC画板

<!DOCTYPE html>
<!DOCTYPE html>
<html>

<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">
    <title>Canvas实现PC画板</title>
    <style>
        * {
            padding: 0;
            margin: 0;
            list-style: none;
        }

        body {
            background-size: cover;
            background-attachment: fixed;
        }

        .container {
            margin: 30px;
        }

        #cavs {
            border: 2px solid indianred;
            border-radius: 10px;
            box-shadow: 10px 10px 5px #999999;
            margin-bottom: 20px;
        }

        .container ul {
            width: 700px;
            text-align: center;
        }

        .container ul li {
            display: inline-block;
            margin-left: 35px;
        }

        .container ul li input {
            background-color: yellow;
            color: black;
            border: none;
            padding: 6px 15px;
            font-size: 16px;
            border-radius: 25px;
            cursor: pointer;
            transition-duration: 0.2s;
        }

        .container ul li input:hover {
            border: 1px solid #aaaa;
            box-shadow: 0 12px 16px 0 rgba(0, 0, 0, 0.25);
        }
    </style>
</head>

<body>
    <div class="container">
        <canvas id="cavs" width="700" height="333"></canvas>
        <ul id='btn_container'>
            <li><input type="color" id="colorChange"></li>
            <li><input type="button" id="clear" value="清屏"></li>
            <li><input type="button" id="eraser" value="橡皮"></li>
            <li><input type="button" id="revoke" value="撤销"></li>
            <li><input type="range" id="lineRuler"></li>
            <li><span id="showRange"></span></li>
        </ul>
    </div>
</body>

</html>
<script>
    /*
     * drawing board lei.xue
     * 开发方式三种
     * 单对象
     * 立即执行函数
     * let
    */


    var drawingBoard = {
        cavs: document.getElementById("cavs"),
        ctx: document.getElementById("cavs").getContext('2d'),
        btn_container: document.getElementById('btn_container'),
        colorChange: document.getElementById("colorChange"),
        lineRuler: document.getElementById("lineRuler"),
        showRange: document.getElementById("showRange"),
        arrImageDate: [],
        bool: false,
        clearFlag:false,
        init: function () {
            this.ctx.lineCap = "round";//线条的头尾样式
            this.ctx.lineJoin = "round";//线条平滑样式
            this.drawing();
            this.btnsAllFn();
        },
        btnsAllFn: function () {
            var self = this;

            self.btn_container.onclick = function (e) {
                switch (e.target.id) {
                    case 'clear':
                        if(!self.clearFlag){
                            self.arrImageDate.push(self.ctx.getImageData(0, 0, self.cavs.offsetWidth, self.cavs.offsetHeight));
                            self.clearFlag = true;
                        }
                        self.ctx.clearRect(0, 0, self.cavs.offsetWidth, self.cavs.offsetHeight);
                        break;
                    case 'eraser':
                        //画背景色
                        self.ctx.strokeStyle = "#ffffff";
                        break;
                    case 'revoke':
                        //每次抬起鼠标是 把当前画板内容保存起来,撤销就是恢复最后一张图片数据
                        console.log(self.arrImageDate);
                        if (self.arrImageDate.length > 0) {
                            var img = self.arrImageDate.pop();
                            self.ctx.putImageData(img, 0, 0);
                        }
                        break;
                }
            }
            this.colorChange.onchange  = function () {
                self.ctx.strokeStyle = this.value;
            }
            this.lineRuler.onchange = function(){
                self.showRange.innerText =  1 + Math.floor(self.lineRuler.value / 5);
            }
        },
        drawing: function () {
            var self = this;
            var c_left = cavs.offsetLeft;
            var c_top = cavs.offsetTop;
            self.showRange.innerText =  1 + Math.floor(self.lineRuler.value / 5);

            self.cavs.onmousedown = function (e) {
                self.ctx.lineWidth = 1 + Math.floor(self.lineRuler.value / 5);
                self.arrImageDate.push(self.ctx.getImageData(0, 0, self.cavs.offsetWidth, self.cavs.offsetHeight));
                self.bool = true;
                self.clearflag = false;
                self.ctx.beginPath();
                self.ctx.moveTo(e.pageX - c_left, e.pageY - c_top);
            }
            self.cavs.onmousemove = function (e) {
                if (self.bool) {
                    self.ctx.lineTo(e.pageX - c_left, e.pageY - c_top);
                    self.ctx.stroke();
                }
            }
            self.cavs.onmouseup = cavsEnd;
            self.cavs.onmouseleave = cavsEnd;
            function cavsEnd(e) {
                if (self.bool) {

                    self.bool = false;
                    self.ctx.closePath();
                }
            }
        }
    }
    drawingBoard.init();
</script>