H5手写签名

Z技术 2021年05月12日 683次浏览
<html lang="en"><head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        html,body{
            width: 100%;
            height: 100%;
        }
        #canvans{
            width: 100%;
            height: 100%;
            position: relative;
        }
        #canvas canvas{
            display: block;
        }
        button{
            width: 50%;
            height: 40px;
            line-height: 40px;
            text-align: center;
            
            border: 1px solid #DEDEDE;
            z-index: 1;
        }
        #clear{
            position: absolute;
            bottom: 0;
            left: 0;
        }
        #sure{
            position: absolute;
            bottom: 0;
            right: 0;
        }
    </style>
</head>
<body>
    <div id="canvans">
        <button id="clear">清空</button>
        <button id="sure">确定</button>
    <canvas width="414" height="896"></canvas></div>
    <script>
        window.onload = function(){
            new drawImage({
                el:document.getElementById('canvans'), //绘制canvas的父级div
                clearClick:document.getElementById('clear'), //清除按钮
                saveClick:document.getElementById('sure')  //保存按钮
            })
        }
        //绘制签名
        function drawImage(obj){
            this.linewidth = 1;
            this.color = "#000000";
            this.background = "#ffffff";
            for(let i in obj){
                this[i]=obj[i]
            }
            this.canvans = document.createElement('canvas')
            this.el.appendChild(this.canvans)
            this.ctx=this.canvans.getContext('2d')  //创建画布
            this.canvans.width=this.el.clientWidth  //画布宽度
            this.canvans.height=this.el.clientHeight
            this.ctx.fillStyle=this.background    //画布背景色填充
            this.ctx.fillRect(0,0,this.canvans.width,this.canvans.height)  //绘制被填充的矩形
            this.ctx.strokeStyle=this.color      //画笔颜色
            this.ctx.lineWidth=this.lineHeight   //线条宽度
            this.ctx.lineCap = 'round'       //设置或返回结束端点样式
            //base64转blob
            let base64Img2Blob=function(code){
                var parts = code.split(';base64,');
                var contentType = parts[0].split(':')[1];
                var raw = window.atob(parts[1]);
                var rawLength = raw.length;
 
                var uInt8Array = new Uint8Array(rawLength);
 
                for (var i = 0; i < rawLength; ++i) {
                  uInt8Array[i] = raw.charCodeAt(i);
                }
                console.log(new Blob([uInt8Array], {type: contentType}));
                return new Blob([uInt8Array], {type: contentType});
            }
			//pc监听
            this.canvans.addEventListener('mousedown',function(e){
                //起始一条路径
                this.ctx.beginPath()
                //把路径移动到画布指定点,不创建线条
                this.ctx.moveTo(e.pageX,e.pageY)
                this.mouseShow=true
            }.bind(this),false)
            this.canvans.addEventListener('mousemove',function(e){
                e.preventDefault();
                if (!this.mouseShow) return
                // 添加一个新点,然后在画布中创建从该点到最后指定点的线条
                this.ctx.lineTo(e.pageX,e.pageY)
                // 绘制已定义的路径
                this.ctx.stroke()
            }.bind(this),false)
            this.canvans.addEventListener('mouseup',function(e){
                //创建从当前点回到起始点的路径
                this.ctx.closePath()
                this.mouseShow=false
            }.bind(this),false)

			//移动监听
            //开始绘制
            this.canvans.addEventListener('touchstart',function(e){
                //起始一条路径
                this.ctx.beginPath()
                //把路径移动到画布指定点,不创建线条
                this.ctx.moveTo(e.changedTouches[0].pageX,e.changedTouches[0].pageY)

            }.bind(this),false)
            //绘制中
            this.canvans.addEventListener('touchmove',function(e){
                // 添加一个新点,然后在画布中创建从该点到最后指定点的线条
                this.ctx.lineTo(e.changedTouches[0].pageX,e.changedTouches[0].pageY)
                // 绘制已定义的路径
                this.ctx.stroke()
            }.bind(this),false)
            //结束绘制
            this.canvans.addEventListener('touchend',function(e){
                //创建从当前点回到起始点的路径
                this.ctx.closePath()
            }.bind(this),false)
            //清除画布
            this.clearClick.addEventListener('click',function(){
                this.ctx.clearRect(0,0,this.canvans.width,this.canvans.height)
            }.bind(this),false)
            //保存图片,直接转base64
            this.saveClick.addEventListener('click',function(){
                var dataImg = this.canvans.toDataURL('image/png')
                var a = document.createElement('a')
            //转blob下载
                var blob= base64Img2Blob(dataImg)
                var evt = document.createEvent("HTMLEvents");
                evt.initEvent("click", false, false);//initEvent 不加后两个参数在FF下会报错
                a.download ='签名' // 设定下载名称
                a.href= URL.createObjectURL(blob);
                a.dispatchEvent(evt);
                a.click()
            //base64下载
                // a.href = dataImg // 将画布内的信息导出为png图片数据
                // a.download ='签名' // 设定下载名称
                // a.click() // 
            }.bind(this),false)
        }
    </script>

</body></html>

效果如下:

4e645d8c41d14369a5fde6fbcfe23ae4.png

 更多信息请关注公众号:
20220401152838