• h5实现签名功能


     

    1. <el-dialog :visible.sync="signatureVisible" :close-on-click-modal="false" width="1337px" class="dialogSignature" :before-close="close">
    2. <div class="tLeft reminderT" slot="title">div>
    3. <div style="width:1250px;height:465px;" class="pRelative canvasBox" v-loading="canvasLoading">
    4. <canvas id="canvas3" width="1245px" height="465px" class="pAbsolute">canvas>
    5. div>
    6. <div class="buttonBox">
    7. <el-button class="dConfirm" @click="commitOk">签好了el-button>
    8. <el-button class="dCancel" @click="clearCanvas">清除重签el-button>
    9. div>
    10. el-dialog>
    1. methods:{
    2. dataURLtoBlob(dataurl) {
    3. var arr = dataurl.split(","),
    4. mime = arr[0].match(/:(.*?);/)[1],
    5. bstr = atob(arr[1]),
    6. n = bstr.length,
    7. u8arr = new Uint8Array(n);
    8. while (n--) {
    9. u8arr[n] = bstr.charCodeAt(n);
    10. }
    11. return new Blob([u8arr], {
    12. type: mime,
    13. });
    14. },
    15. blobCl(data){
    16. return new Blob(data)
    17. },
    18. initCanvas(){
    19. this.$nextTick(()=>{
    20. var c = document.getElementById('canvas3');
    21. //获取canvs上下文
    22. var ctx = c.getContext("2d");
    23. ctx.fillStyle = '#FFFFFF'
    24. ctx.fillRect(0,0,1250,465)//设置canvas背景色
    25. ctx.fillStyle='#E3E3E3' //设置字体颜色
    26. ctx.textAlign='center';//水平居中
    27. ctx.textBaseline = "middle"; //字体设置垂直居中
    28. ctx.font = "139px Georgia"; //设置字体size 风格
    29. ctx.fillText('签字区',622.5,232.5)//填充字体,x,y
    30. })
    31. },
    32. async commitOk(){
    33. console.log('触发了');
    34. let canvas=document.getElementById('canvas3')
    35. var dataURL = canvas.toDataURL('image/jpeg');
    36. //转成的二进制文件流
    37. console.log(this.dataURLtoBlob(dataURL))
    38. this.canvasLoading=true;
    39. let res=await uploadxxx({multipartFile:this.dataURLtoBlob(dataURL) })
    40. this.canvasLoading=false;
    41. console.log('upload上传成功');
    42. console.log(res);
    43. },
    44. //重置canvas画板
    45. clearCanvas(){
    46. this.initCanvas();
    47. },
    48. commonResize(dBox,yPy){
    49. let canvas=document.getElementById('canvas3')
    50. //获取canvas上下文对象
    51. var ctx=canvas.getContext('2d')//2d:图象
    52. ctx.lineWidth=3;//设置线宽
    53. // ctx.strokeStyle='purple'//设置线的颜色
    54. var flag=false;
    55. //监听鼠标按下的时候执行重新绘制
    56. canvas.onmousedown=function(e){
    57. flag=true;
    58. ctx.beginPath();
    59. }
    60. var bodyTag=document.querySelector('body')
    61. bodyTag.offsetTop-20
    62. var x,y;
    63. //鼠标移入绘图
    64. canvas.onmousemove=function(e){
    65. if(!flag)return;
    66. // x=e.clientX-offsetX*3
    67. console.log(yPy);
    68. x=e.offsetX
    69. // y=e.pageY-offsetY
    70. y=e.clientY-yPy
    71. // console.log('我是y');
    72. // console.log(y);
    73. ctx.lineTo(x,y)//画点 clientX,clientY获取鼠标所在位置的x,y轴坐标
    74. // ctx.lineTo(e.offsetX,e.offsetY)//画点 clientX,clientY获取鼠标所在位置的x,y轴坐标
    75. ctx.stroke();//绘制线条
    76. }
    77. //鼠标松开停止绘图
    78. canvas.onmouseup=function(e){
    79. flag=false;
    80. }
    81. },
    82. beginDialog(){
    83. var dBox=document.querySelector('.dialogSignature .el-dialog')
    84. var dBody=document.querySelector('body')
    85. var dialogSignatureTag=document.querySelector('.dialogSignature')
    86. this.initCanvas();
    87. //203是canvas距离顶部的距离
    88. this.commonResize(dBox,203);
    89. var _this=this;
    90. document.querySelector('.dialogSignature').onscroll=function(e){
    91. var jqYdY=203;//最终需要减去的移动x轴
    92. if(dialogSignatureTag.scrollTop>0){
    93. //为甚是减去scrollTop由于滚动条向下滚动,canvas顶部距离顶部会缩小
    94. jqYdY=203-dialogSignatureTag.scrollTop
    95. }else{
    96. }
    97. _this.commonResize(dBox,jqYdY);
    98. }
    99. },
    100. createCanvas(){
    101. },
    102. //关闭dialog弹窗,这个是传给父级的可以忽略,正常设置visibleDialog为false即可
    103. close(){
    104. this.$emit('update:signatureVisible')
    105. }
    106. },

     关键代码:

    计算弹窗中的canvas距离顶部的距离,顶部距离又会受到,浏览器滚动的影响需要监听滚动事件

    1. document.querySelector('.dialogSignature').onscroll=function(e){
    2. var jqYdY=203;//最终需要减去的移动x轴
    3. if(dialogSignatureTag.scrollTop>0){
    4. jqYdY=203-dialogSignatureTag.scrollTop
    5. }else{
    6. }
    7. _this.commonResize(dBox,jqYdY);
    8. }

    x轴只需要获取鼠标移入点的位置offsetX的距离即可

  • 相关阅读:
    统一建模语言UML(1~8章在线测试参考答案)
    linux C++注册程序退出信号处理的代码
    高性能 低功耗Cortex-A53核心板 | i.MX8M Mini
    【网络安全产品】---网闸
    初阶三子棋(超详解)
    Nodejs 开发者路线图 2022 零基础学习指南
    操作系统——处理机调度
    Redis SCAN命令操作实战(详细)
    高通开发系列 - ALSA声卡驱动中音频通路kcontrol控件
    LeetCode每日一题——522. 最长特殊序列 II
  • 原文地址:https://blog.csdn.net/qq_41429765/article/details/136261311