zoukankan      html  css  js  c++  java
  • vue移动端在线签名

    <template>
    <section class="signature">
      <div class="signatureBox">
          <div class="canvasBox" ref="canvasHW">
              <canvas ref="canvasF" 
                @touchstart='touchStart'
                @touchmove='touchMove'
                @touchend='touchEnd'
                @mousedown="mouseDown"
                @mousemove="mouseMove"
                @mouseup="mouseUp"
              >
              </canvas>
              <div class="btnBox">
                  <button @click="overwrite">重新签名</button>
                  <button @click="commit">提交签名</button>
              </div>   
          </div>
      </div>
              <img class="imgCanvas" :src="imgUrl">
          </section> 
    </template>
     
    <script>
      export default {
        data() {
          return {
            stageInfo:'',
            imgUrl:'',
            client: {},
            points: [],
            canvasTxt: null,
            startX: 0,
            startY: 0,
            moveY: 0,
            moveX: 0,
            endY: 0,
            endX: 0,
            w: null,
            h: null,
            isDown: false,
            // isViewAutograph: this.$route.query.isViews > 0,
            // contractSuccess: this.$route.query.contractSuccess
          }
        },
        mounted() {
          let canvas = this.$refs.canvasF
          canvas.height = this.$refs.canvasHW.offsetHeight - 500
          canvas.width = this.$refs.canvasHW.offsetWidth - 2
          this.canvasTxt = canvas.getContext('2d')
          this.stageInfo = canvas.getBoundingClientRect()
          this.canvasTxt.lineWidth = 3; // 线条宽度
        },
        methods: {
          //mobile
          touchStart(ev) {
            ev = ev || event
            ev.preventDefault()
            if (ev.touches.length == 1) {
              let obj = {
                x: ev.targetTouches[0].clientX,
                y: ev.targetTouches[0].clientY,
              }
              this.startX = obj.x
              this.startY = obj.y
              this.canvasTxt.beginPath()
              this.canvasTxt.moveTo(this.startX, this.startY)
              this.canvasTxt.lineTo(obj.x, obj.y)
              this.canvasTxt.stroke()
              this.canvasTxt.closePath()
              this.points.push(obj)
            }
          },
          touchMove(ev) {
            ev = ev || event
            ev.preventDefault()
            if (ev.touches.length == 1) {
              let obj = {
                x: ev.targetTouches[0].clientX - this.stageInfo.left,
                y: ev.targetTouches[0].clientY - this.stageInfo.top
              }
              this.moveY = obj.y
              this.moveX = obj.x
              this.canvasTxt.beginPath()
            //   strokeStyle = 'blue';
              this.canvasTxt.moveTo(this.startX, this.startY)
              this.canvasTxt.lineTo(obj.x, obj.y)
              this.canvasTxt.stroke()
              this.canvasTxt.closePath()
              this.startY = obj.y
              this.startX = obj.x
              this.points.push(obj)
            }
          },
          touchEnd(ev) {
            ev = ev || event
            ev.preventDefault()
            if (ev.touches.length == 1) {
              let obj = {
                x: ev.targetTouches[0].clientX - this.stageInfo.left,
                y: ev.targetTouches[0].clientY - this.stageInfo.top
              }
              this.canvasTxt.beginPath()
              this.canvasTxt.moveTo(this.startX, this.startY)
              this.canvasTxt.lineTo(obj.x, obj.y)
              this.canvasTxt.stroke()
              this.canvasTxt.closePath()
              this.points.push(obj)
            }
          },
          //pc
          mouseDown(ev) {
            ev = ev || event
            ev.preventDefault()
            if (1) {
              let obj = {
                x: ev.offsetX,
                y: ev.offsetY
              }
              this.startX = obj.x
              this.startY = obj.y
              this.canvasTxt.beginPath()
              this.canvasTxt.moveTo(this.startX, this.startY)
              this.canvasTxt.lineTo(obj.x, obj.y)
              this.canvasTxt.stroke()
              this.canvasTxt.closePath()
              this.points.push(obj)
              this.isDown = true
            }
          },
          mouseMove(ev) {
            ev = ev || event
            ev.preventDefault()
            if (this.isDown) {
              let obj = {
                x: ev.offsetX,
                y: ev.offsetY
              }
              this.moveY = obj.y
              this.moveX = obj.x
              this.canvasTxt.beginPath()
              this.canvasTxt.moveTo(this.startX, this.startY)
              this.canvasTxt.lineTo(obj.x, obj.y)
              this.canvasTxt.stroke()
              this.canvasTxt.closePath()
              this.startY = obj.y
              this.startX = obj.x
              this.points.push(obj)
            }
          },
          mouseUp(ev) {
            ev = ev || event
            ev.preventDefault()
            if (1) {
              let obj = {
                x: ev.offsetX,
                y: ev.offsetY
              }
              this.canvasTxt.beginPath()
              this.canvasTxt.moveTo(this.startX, this.startY)
              this.canvasTxt.lineTo(obj.x, obj.y)
              this.canvasTxt.stroke()
              this.canvasTxt.closePath()
              this.points.push(obj)
              this.points.push({x: -1, y: -1})
              this.isDown = false
            }
          },
          //重写
          overwrite() {
            this.canvasTxt.clearRect(0, 0, this.$refs.canvasF.width, this.$refs.canvasF.height)
            this.points = []
          },
          //提交签名
          commit() {
            this.imgUrl=this.$refs.canvasF.toDataURL();
            console.log(this.$refs.canvasF.toDataURL()) //签名img回传后台
          }
        }
      }
    </script>
     
    <style scoped>
      .signatureBox {
        width: 100%;
        height: calc(100% - 50px);
        box-sizing: border-box;
        overflow: hidden;
        background: #fff;
        z-index: 100;
        display: flex;
        flex-direction: column;
      }
      .canvasBox {
        box-sizing: border-box;
        flex: 1;
      }
      .canvasBox canvas {
        border: 1px solid #7d7d7d;
      }
      .btnBox {
        padding: 10px;
        text-align: center;
      }
      .btnBox button:first-of-type {
        background: transparent;
        border-radius: 4px;
        height: 34px;
        width: 80px;
        font-size: 14px;
        color: #71b900;
        border: 1px solid #71b900;
      }
      .btnBox button:last-of-type {
        background: #71b900;
        color: #fff;
        border-radius: 4px;
        height: 34px;
        width: 80px;
        border: none;
        font-size: 14px;
      }
      </style>
  • 相关阅读:
    设计模式(三)原型模式
    PageHelper在Mybatis中的使用
    设计模式(二) 单例模式
    设计模式(一)简单工厂、工厂方法和抽象工厂
    Java网络编程
    循环控制语句if 、for、case、while
    处理海量数据的grep、cut、awk、sed 命令
    shell脚本的输入以及脚本拥有特效地输出
    shell的变量以及常见符号
    shell的使用技巧
  • 原文地址:https://www.cnblogs.com/CinderellaStory/p/13597599.html
Copyright © 2011-2022 走看看