canvas做签名板

Canvas 做签名板,JS代码

<!DOCTYPE html>
<!-- saved from url=(0056)http://hao2013.cn/canvas-special-master/brush/index.html -->
<html lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>签名板(支持移动端)</title>
</head>
<style type="text/css">
	*{margin: 0;padding: 0;}
	.canvas {
		/*width: 100%;*/
		display: block;
		border: 1px solid red;
	}
	#clear,
	#clear1,
	#save {
		margin: 0 auto;
		display: inline-block;
		padding: 5px 10px;
		width: 50px;
		height: 40px;
		line-height: 40px;
		border: 1px solid #eee;
		background: #e1e1e1;
		border-radius: 10px;
		text-align: center;
		margin: 20px auto;
		cursor: pointer;
	}
	.changecolor{
		margin: 0 auto;
		display: inline-block;
		padding: 5px 10px;
		width: 50px;
		height: 40px;
		line-height: 40px;
		border: 1px solid #eee;
		background: #e1e1e1;
		border-radius: 10px;
		text-align: center;
		margin: 20px auto;
		cursor: pointer;
	}
</style>
<body data-ext-version="1.4.2">
	<canvas id="canvas" class="canvas" width="600" height="600">
    	您的浏览器不支持canvas技术,请升级浏览器!
  	</canvas>
	<div style="text-align: center">
		<span class="changecolor"  onclick="changeColor('blue')">蓝色</span>
		<span class="changecolor"  onclick="changeColor('green')">绿色</span>
		<span class="changecolor"  onclick="changeColor('red')">红色</span>
	</div>
	<div style="text-align: center">
		<span class="changecolor" id="canvasUndo">撤销</span>
		<span class="changecolor" id="canvasRedo">反撤销</span>
	</div>
	<div style="text-align: center">
		<span id="clear">清空</span>
		<span id="save">保存</span>
	</div>
</body>
	<script type="text/javascript">
		function WriteFont(id, options) {
			var self = this;
			let step = -1; 			// 书写次数
			let canvasHistory = [];
			this.canvas = document.getElementById(id);
			width =  document.body.clientWidth;
			var obj = {
				canvas: this.canvas,
				context: this.canvas.getContext("2d"),
				isWrite: false,	//是否开始
				lastWriteTime: -1,	
				lastWriteSpeed: 0,	
				lastWriteWidth: 0,
				canvasWidth: width - 2,	//canvas宽高
				canvasHeight: 600,
				isShowBorder: true,	//是否显示网格
				bgColor: '#fff',	//背景色
				borderWidth: 2,	//	网格线宽度
				borderColor: "#fff",	//网格颜色	
				lastPoint: {},	//
				writeWidth: 2,		//基础轨迹宽度
				maxWriteWidth: 30,	// 写字模式最大线宽
				minWriteWidth: 1,	// 写字模式最小线宽
				writeColor: '#000',	// 轨迹颜色
				isWriteName: false	// 签名模式
			}

			for(var name in options) {
				obj[name] = options[name];
			}
			
			/**
			 * 轨迹宽度
			 */
			this.setLineWidth = function() {
				var nowTime = new Date().getTime();
				var diffTime = nowTime - obj.lastWriteTime;
				obj.lastWriteTime = nowTime;
				var returnNum = obj.minWriteWidth + (obj.maxWriteWidth - obj.minWriteWidth) * diffTime / 30;
				if(returnNum < obj.minWriteWidth) {
					returnNum = obj.minWriteWidth;
				} else if(returnNum > obj.maxWriteWidth) {
					returnNum = obj.maxWriteWidth;
				}
				
				returnNum = returnNum.toFixed(2);
				//写字模式和签名模式
				if(obj.isWriteName){
					obj.context.lineWidth = obj.writeWidth;
				}else{
					obj.context.lineWidth = obj.lastWriteWidth = obj.lastWriteWidth / 4 * 3 + returnNum / 4;
				}
			}
			
			/**
			 * 绘制轨迹
			 */
			this.writing = function(point) {
				obj.context.beginPath();
				obj.context.moveTo(obj.lastPoint.x, obj.lastPoint.y);
				obj.context.lineTo(point.x, point.y);
				self.setLineWidth();
				obj.context.stroke();
				obj.lastPoint = point;
				obj.context.closePath();
			}
		
			/**
			 * 轨迹样式
			 */
			this.writeContextStyle = function() {
				obj.context.beginPath();
				obj.context.strokeStyle = obj.writeColor;
				obj.context.lineCap = 'round';
				obj.context.lineJoin = "round";
			}
			
			/**
			 * 写开始
			 */
			this.writeBegin = function(point) {
				obj.isWrite = true;
				obj.lastWriteTime = new Date().getTime();
				obj.lastPoint = point;
				self.writeContextStyle();
			}
			
			/**
			 * 写结束
			 */
			this.writeEnd = function(point,type = 0) {
				//新增记录
				if (type == 1) {
					step++;
				    if (step < canvasHistory.length) {
				    	canvasHistory.length = step; // 截断数组
				    }
				    canvasHistory.push(this.canvas.toDataURL("image/png")); // 添加新的绘制到历史记录
				    console.log(step);
				}
				
			    //end
				obj.isWrite = false;
			}
			
			/**
			 * 清空画板
			 */
			this.canvasClear = function() {
				obj.context.save();
				obj.context.strokeStyle = '#fff';
				obj.context.clearRect(0, 0, obj.canvasWidth, obj.canvasHeight);
				if(obj.isShowBorder && !obj.isWriteName) {
					obj.context.beginPath();
					var size = obj.borderWidth / 2;
					//画外面的框
					obj.context.moveTo(size, size);
					obj.context.lineTo(obj.canvasWidth - size, size);
					obj.context.lineTo(obj.canvasWidth - size, obj.canvasHeight - size);
					obj.context.lineTo(size, obj.canvasHeight - size);
					obj.context.closePath();
					obj.context.lineWidth = obj.borderWidth;
					obj.context.strokeStyle = obj.borderColor;
					obj.context.stroke();
					//画里面的框
					obj.context.moveTo(0, 0);
					obj.context.lineTo(obj.canvasWidth, obj.canvasHeight);
					obj.context.lineTo(obj.canvasWidth, obj.canvasHeight / 2);
					obj.context.lineTo(obj.canvasWidth, obj.canvasHeight / 2);
					obj.context.lineTo(0, obj.canvasHeight / 2);
					obj.context.lineTo(0, obj.canvasHeight);
					obj.context.lineTo(obj.canvasWidth, 0);
					obj.context.lineTo(obj.canvasWidth / 2, 0);
					obj.context.lineTo(obj.canvasWidth / 2, obj.canvasHeight);
					obj.context.stroke();

				}
				obj.context.restore();
			}
				
			/**
			 * 保存图片 格式base64
			 */
			this.saveAsImg = function() {
				var image = new Image();
				image.src = this.canvas.toDataURL("image/png");
				if(image.src == this.emptyCanvas) {
					alert('请先书写')
				} else {
					console.log('提交的内容===>', image.src)
				}
			};
		
			/**
			 * 初始化画板
			 */
			this.canvasInit = function() {
				this.canvas.width = obj.canvasWidth;
				this.canvas.height = obj.canvasHeight;
				this.emptyCanvas = this.canvas.toDataURL("image/png");
			}
			/** 修改笔画颜色 */
			this.changecolor=function($color){
				console.log('改变颜色');
				obj.writeColor =$color;
				obj.context.restore();
			}
			// 撤销方法
			this.canvasUndo=function() {
			  console.log(step)
			  if (step >= 0) {
			  	step--;
			    obj.context.clearRect(0, 0, obj.canvasWidth, obj.canvasHeight);
			    if (step < 0) { return false;}
			    let canvasPic = new Image();
			    canvasPic.src = canvasHistory[step];
			    canvasPic.addEventListener('load', () => {
			      obj.context.drawImage(canvasPic, 0, 0);
			    });
			    
			  } else {
			    console.log('不能再继续撤销了');
			  }
			}
			// 反撤销方法
			this.canvasRedo=function() {
			  if (step < canvasHistory.length - 1) {
			    step++;
			    let canvasPic = new Image();
			    canvasPic.src = canvasHistory[step];
			    canvasPic.addEventListener('load', () => {
			      obj.context.clearRect(0, 0, obj.canvasWidth, obj.canvasHeight);
			      obj.context.drawImage(canvasPic, 0, 0);
			    });
			  } else {
			    console.log('已经是最新的记录了');
			  }
			}
			this.setWidth=function(){
				//宽度铺满
				width = document.body.clientWidth;
				console.log(width);
				obj.canvasWidth =width;
				obj.context.restore();

			}
			/**======================事件绑定===========================**/
			
			this.canvas.addEventListener('mousedown', function(e) {
				var point = {
					x: e.offsetX || e.clientX,
					y: e.offsetY || e.clientY
				};
				self.writeBegin(point);
			});
			
			this.canvas.addEventListener('mouseup', function(e) {
				var point = {
					x: e.offsetX,
					y: e.offsetY
				};
				self.writeEnd(point,1);
			});
			
			this.canvas.addEventListener('mouseleave', function(e) {
				var point = {
					x: e.offsetX,
					y: e.offsetY
				};
				self.writeEnd(point);
			});
			
			this.canvas.addEventListener('mousemove', function(e) {
				if(obj.isWrite) {
					var point = {
						x: e.offsetX,
						y: e.offsetY
					};

					self.writing(point);
				}
			});
			
			//移动端
			this.canvas.addEventListener('touchstart', function(e) {
				var touch = e.targetTouches[0];
				var point = {
					x: touch.pageX || touch.clientX,
					y: touch.pageY || touch.clientY
				};
				self.writeBegin(point);
			});
			this.canvas.addEventListener('touchend', function(e) {
				var touch = e.changedTouches[0];
				var point = {
					x: touch.pageX,
					y: touch.pageY
				};
				self.writeEnd(point,1);
			});
			this.canvas.addEventListener('touchmove', function(e) {
				var touch = e.targetTouches[0];
				var point = {
					x: touch.pageX,
					y: touch.pageY
				};
				self.writeEnd(point);
			});
			this.canvas.addEventListener('touchmove', function(e) {
				var touch = e.targetTouches[0];
				var point = {
					x: touch.pageX,
					y: touch.pageY
				};
				self.writing(point);
			});
			
			this.canvasInit();
			this.canvasClear();
			this.option = obj;
			obj.control = {
				clearCanvas: self.canvasClear
			};
		}
		
		/**
		 * 初始化调用
		 * 设置参数
		 */
		var writeCanvas = new WriteFont('canvas', {
			borderWidth: 10,
			writeWidth:3,
			borderColor: '#ff6666',
			isWriteName:true	//签名模式
		});

		document.getElementById('clear').onclick = function() {
			writeCanvas.option.control.clearCanvas();
		};
		
		document.getElementById('save').onclick = function() {
			writeCanvas.saveAsImg()
		};
		document.getElementById('canvasUndo').onclick = function() {
			//撤销
			writeCanvas.canvasUndo();
		};
		
		document.getElementById('canvasRedo').onclick = function() {
			//反撤销
			writeCanvas.canvasRedo();
		};
		/*document.getElementById('changecolor').onclick = function(){
			writeCanvas.changecolor('red')
		}*/

		function changeColor($color){
			writeCanvas.changecolor($color);
		}

	</script>
</html>

效果如下
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值