<template>
<div class=\"hello\">
<!--touchstart,touchmove,touchend,touchcancel 这-->
<button type=\"\" v-on:click=\"clear\">清除</button>
<button v-on:click=\"save\">保存</button>
<canvas id=\"canvas\" width=\"300\" height=\"600\" style=\"border:1px solid black\">Canvas画板</canvas>
<img v-bind:src=\"url\" alt=\"\">
</div>
</template>
< >
var draw;
var preHandler = function(e){e.preventDefault();}
class Draw {
constructor(el) {
this.el = el
this.canvas = document.getElementById(this.el)
this.cxt = this.canvas.getContext(\'2d\')
this.stage_info = canvas.getBoundingClientRect()
this.path = {
beginX: 0,
beginY: 0,
endX: 0,
endY: 0
}
}
init(btn) {
var that = this;
this.canvas.addEventListener(\'touchstart\', function(event) {
document.addEventListener(\'touchstart\', preHandler, false);
that.drawBegin(event)
})
this.canvas.addEventListener(\'touchend\', function(event) {
document.addEventListener(\'touchend\', preHandler, false);
that.drawEnd()
})
this.clear(btn)
}
drawBegin(e) {
var that = this;
window.getSelection() ? window.getSelection().removeAllRanges() : document.selection.empty()
this.cxt.strokeStyle = \"#000\"
this.cxt.beginPath()
this.cxt.moveTo(
e.changedTouches[0].clientX - this.stage_info.left,
e.changedTouches[0].clientY - this.stage_info.top
)
this.path.beginX = e.changedTouches[0].clientX - this.stage_info.left
this.path.beginY = e.changedTouches[0].clientY - this.stage_info.top
canvas.addEventListener(\"touchmove\",function(){
that.drawing(event)
})
}
drawing(e) {
this.cxt.lineTo(
e.changedTouches[0].clientX - this.stage_info.left,
e.changedTouches[0].clientY - this.stage_info.top
)
this.path.endX = e.changedTouches[0].clientX - this.stage_info.left
this.path.endY = e.changedTouches[0].clientY - this.stage_info.top
this.cxt.stroke()
}
drawEnd() {
document.removeEventListener(\'touchstart\', preHandler, false);
document.removeEventListener(\'touchend\', preHandler, false);
document.removeEventListener(\'touchmove\', preHandler, false);
//canvas.ontouchmove = canvas.ontouchend = null
}
clear(btn) {
this.cxt.clearRect(0, 0, 300, 600)
}
save(){
return canvas.toDataURL(\"image/png\")
}
}
export default {
data () {
return {
msg: \'Welcome to Your Vue.js App\',
val:true,
url:\"\"
}
},
mounted() {
draw=new Draw(\'canvas\');
draw.init();
},
methods:{
clear:function(){
draw.clear();
},
save:function(){
var data=draw.save();
this.url = data;
console.log(data)
},
mutate(word) {
this.$emit(\"input\", word);
},
}
}
</ >
<!-- Add \"scoped\" attribute to limit CSS to this component only -->
<style scoped>
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
#canvas {
background: pink;
cursor: default;
}
#keyword-box {
margin: 10px 0;
}
</style>
继续阅读与本文标签相同的文章
王坚博士:挑战离年轻人更近,未来才离我们更近
干货 | 那些你不知道的爬虫反爬虫套路
-
有关厂商都在积极布局功率碳化硅
2026-05-18栏目: 教程
-
反向链接对网站权重有影响吗?
2026-05-18栏目: 教程
-
国内首创:海南台风灾害影响评估三维模拟系统投入试运行
2026-05-18栏目: 教程
-
大智能时代,需要什么样的产品经理
2026-05-18栏目: 教程
-
怎样才能让用户更喜欢你的APP应用
2026-05-18栏目: 教程
