
- <el-dialog :visible.sync="signatureVisible" :close-on-click-modal="false" width="1337px" class="dialogSignature" :before-close="close">
- <div class="tLeft reminderT" slot="title">div>
- <div style="width:1250px;height:465px;" class="pRelative canvasBox" v-loading="canvasLoading">
- <canvas id="canvas3" width="1245px" height="465px" class="pAbsolute">canvas>
- div>
- <div class="buttonBox">
-
- <el-button class="dConfirm" @click="commitOk">签好了el-button>
- <el-button class="dCancel" @click="clearCanvas">清除重签el-button>
- div>
- el-dialog>
- methods:{
- dataURLtoBlob(dataurl) {
- var arr = dataurl.split(","),
- mime = arr[0].match(/:(.*?);/)[1],
- bstr = atob(arr[1]),
- n = bstr.length,
- u8arr = new Uint8Array(n);
- while (n--) {
- u8arr[n] = bstr.charCodeAt(n);
- }
- return new Blob([u8arr], {
- type: mime,
- });
- },
- blobCl(data){
- return new Blob(data)
- },
- initCanvas(){
- this.$nextTick(()=>{
- var c = document.getElementById('canvas3');
- //获取canvs上下文
- var ctx = c.getContext("2d");
- ctx.fillStyle = '#FFFFFF'
- ctx.fillRect(0,0,1250,465)//设置canvas背景色
- ctx.fillStyle='#E3E3E3' //设置字体颜色
- ctx.textAlign='center';//水平居中
- ctx.textBaseline = "middle"; //字体设置垂直居中
- ctx.font = "139px Georgia"; //设置字体size 风格
- ctx.fillText('签字区',622.5,232.5)//填充字体,x,y
- })
- },
- async commitOk(){
- console.log('触发了');
- let canvas=document.getElementById('canvas3')
- var dataURL = canvas.toDataURL('image/jpeg');
- //转成的二进制文件流
- console.log(this.dataURLtoBlob(dataURL))
- this.canvasLoading=true;
- let res=await uploadxxx({multipartFile:this.dataURLtoBlob(dataURL) })
- this.canvasLoading=false;
- console.log('upload上传成功');
- console.log(res);
- },
- //重置canvas画板
- clearCanvas(){
- this.initCanvas();
- },
- commonResize(dBox,yPy){
- let canvas=document.getElementById('canvas3')
- //获取canvas上下文对象
- var ctx=canvas.getContext('2d')//2d:图象
- ctx.lineWidth=3;//设置线宽
- // ctx.strokeStyle='purple'//设置线的颜色
- var flag=false;
- //监听鼠标按下的时候执行重新绘制
- canvas.onmousedown=function(e){
- flag=true;
- ctx.beginPath();
- }
-
- var bodyTag=document.querySelector('body')
- bodyTag.offsetTop-20
- var x,y;
- //鼠标移入绘图
- canvas.onmousemove=function(e){
- if(!flag)return;
- // x=e.clientX-offsetX*3
- console.log(yPy);
- x=e.offsetX
- // y=e.pageY-offsetY
- y=e.clientY-yPy
- // console.log('我是y');
- // console.log(y);
- ctx.lineTo(x,y)//画点 clientX,clientY获取鼠标所在位置的x,y轴坐标
- // ctx.lineTo(e.offsetX,e.offsetY)//画点 clientX,clientY获取鼠标所在位置的x,y轴坐标
- ctx.stroke();//绘制线条
- }
- //鼠标松开停止绘图
- canvas.onmouseup=function(e){
- flag=false;
- }
- },
- beginDialog(){
- var dBox=document.querySelector('.dialogSignature .el-dialog')
- var dBody=document.querySelector('body')
- var dialogSignatureTag=document.querySelector('.dialogSignature')
- this.initCanvas();
- //203是canvas距离顶部的距离
- this.commonResize(dBox,203);
- var _this=this;
- document.querySelector('.dialogSignature').onscroll=function(e){
-
- var jqYdY=203;//最终需要减去的移动x轴
-
- if(dialogSignatureTag.scrollTop>0){
- //为甚是减去scrollTop由于滚动条向下滚动,canvas顶部距离顶部会缩小
- jqYdY=203-dialogSignatureTag.scrollTop
- }else{
-
- }
- _this.commonResize(dBox,jqYdY);
- }
- },
- createCanvas(){
-
- },
- //关闭dialog弹窗,这个是传给父级的可以忽略,正常设置visibleDialog为false即可
- close(){
- this.$emit('update:signatureVisible')
- }
- },
关键代码:
计算弹窗中的canvas距离顶部的距离,顶部距离又会受到,浏览器滚动的影响需要监听滚动事件
- document.querySelector('.dialogSignature').onscroll=function(e){
-
- var jqYdY=203;//最终需要减去的移动x轴
-
- if(dialogSignatureTag.scrollTop>0){
- jqYdY=203-dialogSignatureTag.scrollTop
- }else{
-
- }
- _this.commonResize(dBox,jqYdY);
- }
x轴只需要获取鼠标移入点的位置offsetX的距离即可