利用canvas制作一个vue的签名版

废话不多说,直接上代码,注释详细

<template>
        <div class="sign-canvas" ref="putImageData">
            <canvas id="canvas" width="400" height="600" @mousedown="canvasDown($event)" @mousemove="canvasMove($event)" @mouseup="canvasUp()" @mouseleave="canvasLeave()" ref="canvas">
                抱歉,您的浏览器暂不支持canvas元素
            </canvas>
            <div class="sign-btn">
                <div class="clear" @click="clear">
                    清空
                </div>
                <div class="save" @click="save">
                    保存
                </div>
            </div>
        </div>
    </template>
<script>
export default {
  data () {
    return {}
  },
  mounted () {
    this.show()
  },
  methods: {
    show () {
      this.canvas = this.$refs.canvas// 指定canvas
      this.ctx = this.canvas.getContext('2d') // 设置2D渲染区域
      this.ctx.lineWidth = 5 // 设置线的宽度
    },
    canvasDown (e) {
      this.canvasMoveUse = true // 通过变量进行判断是否需要进行绘画  true开始绘画  false取消绘画
      const canvasX = e.clientX - e.target.offsetLeft + document.documentElement.scrollLeft // e.clientX 是当前鼠标点击后距离浏览器可视窗口的X轴距离(相当于以中心点出发的距离减掉中心点后)  e.target.offsetLeft获取鼠标在浏览器中固定的位置(相当于中心点)    document.documentElement.scrollLeft获取页面的水平滚动条位置
      const canvasY = e.clientY - e.target.offsetTop + document.documentElement.scrollTop
      this.ctx.beginPath() // 移动的起点
      this.ctx.moveTo(canvasX, canvasY)
    },
    canvasMove (e) {
      // 只在移动是进行绘制图线
      if (this.canvasMoveUse) {
        const t = e.target
        let canvasX
        let canvasY
        canvasX = e.clientX - t.offsetLeft + document.documentElement.scrollLeft
        canvasY = e.clientY - t.offsetTop + document.documentElement.scrollTop
        this.ctx.lineTo(canvasX, canvasY)
        this.ctx.stroke()
      }
    },
    canvasUp () {
      this.canvasMoveUse = false
    },
    canvasLeave () {
      this.canvasMoveUse = false
    },
    clear () {
      this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height)
    },
    save () {
      const imgBase64 = this.$refs.canvas.toDataURL()
	  console.log(imgBase64)
    }
  }
}
</script>

    <style scoped>
        .sign-canvas{
            display: flex;
            flex-direction: column;
            align-items: center;
            width: 100%;
            height: 100%;
            padding: 20px 30px;
        }
        .sign-canvas canvas{
            background-color: #e0e3e5;
        }
        .sign-btn {
            display: flex;
            margin:20px 0;
        }
        .sign-btn div {
            width: 175px;
            text-align: center;
            height: 70px;
            line-height: 70px;
            color: #FFFFFF;
        }
        .sign-btn div:active {
            background-color: #CCCCCC;
            color: #333333;
        }
        .sign-btn .clear {
            background-color: #FF8F58;
        }
        .sign-btn .save {
            background-color: #0599D7;
        }
    </style>

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值