
In life, the place where we use electronic signatures the most is probably the bank, which will let you leave your name every time. Today we are going to use vue to implement an electronic signature panel
If you want to draw graphics, the first step that comes to mind is to use the canvas
tag. In the previous article we used canvas
I have implemented a front-end component that generates graphic verification codes. It is criticized as not safe enough, so this electronic signature component will definitely not be criticized~
canvas
1 | <canvas> 标签是 HTML 5 中的新标签。<canvas> 标签只是图形容器,您必须使用脚本来绘制图形。
|
Copy after login
canvas The
tag itself has no drawing capabilities, and all drawing work must be completed within JavaScript.
There are several necessary steps to use canvas
Drawing:
- Get the canvas element
- Create the context object through the canvas element
- Draw graphics through context objects
In the current electronic signature requirements, since the signature is actually composed of lines, we will use the following methods:
- beginPath(): Start a path or reset the current path
- moveTo(): Move the path to the specified point in the canvas without creating a line
- lineTo(): Adds a new point and creates a line in the canvas from that point to the last specified point
- stroke(): Draws a defined path
- closePath(): Creates a line from the current point back to Path to the starting point
Event
If you want to draw in canvas
, you need to bind several specific events, and these events are on the PC side and The mobile version is different
PC version events
- mousedown
- mousemove
- mouseup
Mobile version events
- touchstart
- touchmove
- touchend
Core Code
Initializationcanvas
Tag And bind the event
1 2 3 4 5 6 7 8 9 | <canvas
@touchstart= "touchStart"
@touchmove= "touchMove"
@touchend= "touchEnd"
ref= "canvasF"
@mousedown= "mouseDown"
@mousemove= "mouseMove"
@mouseup= "mouseUp"
></canvas>
|
Copy after login
Get the brush
In mounted
Life cycle initialization
1 2 3 4 5 6 7 8 | mounted() {
let canvas = this. $refs .canvasF;
canvas.height = this. $refs .canvasHW.offsetHeight - 100;
canvas.width = this. $refs .canvasHW.offsetWidth - 10;
this.canvasTxt = canvas.getContext( "2d" );
this.canvasTxt.strokeStyle = this.color;
this.canvasTxt.lineWidth = this.linewidth;
}
|
Copy after login
Event handling
mouseDown
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mouseDown(ev) {
ev = ev || event;
ev.preventDefault();
let obj = {
x: ev.offsetX,
y: ev.offsetY
};
this.startX = obj.x;
this.startY = obj.y;
this.canvasTxt.beginPath();
this.points.push(obj);
this.isDown = true;
},
|
Copy after login
touchStart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | touchStart(ev) {
ev = ev || event;
ev.preventDefault();
if (ev.touches.length == 1) {
this.isDraw = true;
let obj = {
x: ev.targetTouches[0].clientX,
y:
ev.targetTouches[0].clientY -
(document.body.offsetHeight * 0.5 +
this. $refs .canvasHW.offsetHeight * 0.1)
};
this.startX = obj.x;
this.startY = obj.y;
this.canvasTxt.beginPath();
this.points.push(obj);
}
},
|
Copy after login
mouseMove
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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.moveTo(this.startX, this.startY);
this.canvasTxt.lineTo(obj.x, obj.y);
this.canvasTxt.stroke();
this.startY = obj.y;
this.startX = obj.x;
this.points.push(obj);
}
},
|
Copy after login
touchMove
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | touchMove(ev) {
ev = ev || event;
ev.preventDefault();
if (ev.touches.length == 1) {
let obj = {
x: ev.targetTouches[0].clientX,
y:
ev.targetTouches[0].clientY -
(document.body.offsetHeight * 0.5 +
this. $refs .canvasHW.offsetHeight * 0.1)
};
this.moveY = obj.y;
this.moveX = obj.x;
this.canvasTxt.moveTo(this.startX, this.startY);
this.canvasTxt.lineTo(obj.x, obj.y);
this.canvasTxt.stroke();
this.startY = obj.y;
this.startX = obj.x;
this.points.push(obj);
}
},
|
Copy after login
mouseUp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mouseUp(ev) {
ev = ev || event;
ev.preventDefault();
if (1) {
let obj = {
x: ev.offsetX,
y: ev.offsetY
};
this.canvasTxt.closePath();
this.points.push(obj);
this.points.push({ x: -1, y: -1 });
this.isDown = false;
}
},
|
Copy after login
touchEnd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | touchEnd(ev) {
ev = ev || event;
ev.preventDefault();
if (ev.touches.length == 1) {
let obj = {
x: ev.targetTouches[0].clientX,
y:
ev.targetTouches[0].clientY -
(document.body.offsetHeight * 0.5 +
this. $refs .canvasHW.offsetHeight * 0.1)
};
this.canvasTxt.closePath();
this.points.push(obj);
this.points.push({ x: -1, y: -1 });
}
},
|
Copy after login
Rewrite
I found that I made a typo, so I erased the drawing board and rewrote it
1 2 3 4 5 6 7 8 9 10 11 | overwrite() {
this.canvasTxt.clearRect(
0,
0,
this. $refs .canvasF.width,
this. $refs .canvasF.height
);
this.points = [];
this.isDraw = false;
},
|
Copy after login
The data used
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | data() {
return {
points: [],
canvasTxt: null,
startX: 0,
startY: 0,
moveY: 0,
moveX: 0,
endY: 0,
endX: 0,
w: null,
h: null,
isDown: false,
color: "#000" ,
linewidth: 3,
isDraw: false
};
},
|
Copy after login

Related Recommendation:
2020 Summary of front-end vue interview questions (with answers)
vue tutorial recommendation: The latest 5 vue.js in 2020 Video tutorial selection
For more programming-related knowledge, please visit: Introduction to Programming! !
The above is the detailed content of How to implement an electronic signature component in Vue?. For more information, please follow other related articles on the PHP Chinese website!