当前位置:网站首页>使用Canvas实现网页鼠标签名效果
使用Canvas实现网页鼠标签名效果
2022-08-01 15:57:00 【霍先生的虚拟宇宙网络】
电脑签名效果:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>签名</title>
<style>
* {
margin: 0;
padding: 0;
}
#canvas {
border: 1px solid black;
}
</style>
<script type="text/javascript" src="./lib/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="./js/xadmin.js"></script>
<script type="text/javascript" src="./data/sensor.js"></script>
<script src="js/jquery.min.js"></script>
</head>
<body>
<div class="container">
<fieldset class="layui-elem-field" style="width: 610px; margin-left: 5px;">
<legend style="font-size: 12px;">预览</legend>
<div class="layui-field-box">
<div class="imgs" id="imgs">
<img id="imgOld" src="" style="height: 50px; width: 200px;"/>
</div>
</div>
</fieldset>
<canvas id="canvas" width="610px" height="280px" style="margin-left: 5px;" ></canvas>
<div>
<button id="clear">清空签名</button>
线条粗细
<select id="selWidth">
<option value="2">2</option>
<option value="4">4</option>
<option value="6">6</option>
<option value="9">9</option>
</select>
线条颜色
<select id="selColor">
<option value="red">red</option>
<option value="blue">blue</option>
<option value="pink">pink</option>
<option value="orange">orange</option>
</select>
<button id="imgInfo">保存签名</button>
</div>
<!-- <div class="imgs" id="imgs"></div>-->
</div>
</body>
<script type="text/javascript">
//1.获取canvas
var myCanvas = document.getElementById("canvas");
//获取2d对象
var ctx = myCanvas.getContext("2d");
//清空画布
var clear = document.getElementById("clear");
//线条
var selWidth = document.getElementById("selWidth");
// 颜色
var selColor = document.getElementById("selColor");
// 保存签名
var imgInfo = document.getElementById("imgInfo");
// 保存的盒子
var imgs = document.getElementById("imgs");
//控制线条是否画
var isMouseMove = false;
//线条位置
var lastX, lastY;
var widthVal = selWidth[0].value, colorVal = selColor[0].value;
window.onload = function () {
initCanvas();
};
//初始化
function initCanvas() {
//PC端
var down = (e) => {
isMouseMove = true;
drawLine(
event.pageX - myCanvas.offsetLeft,
event.pageY - myCanvas.offsetTop,
false
);
};
let move = (e) => {
if (isMouseMove) {
drawLine(
event.pageX - myCanvas.offsetLeft,
event.pageY - myCanvas.offsetTop,
true
);
}
};
let up = (e) => {
isMouseMove = false;
};
let leave = (e) => {
isMouseMove = false;
};
myCanvas.addEventListener("mousedown", down);
myCanvas.addEventListener("mousemove", move);
myCanvas.addEventListener("mouseup", up);
myCanvas.addEventListener("mouseleave", leave);
}
//画线
function drawLine(x, y, isT) {
if (isT) {
ctx.beginPath();
ctx.lineWidth = widthVal; //设置线宽状态
ctx.strokeStyle = colorVal; //设置线的颜色状态
ctx.lineCap = 'round'
ctx.lineJoin = "round";
ctx.moveTo(lastX, lastY);
ctx.lineTo(x, y);
ctx.stroke();
ctx.closePath();
}
// 每次移动都要更新坐标位置
lastX = x;
lastY = y;
}
//清空画图
function clearCanvas() {
imgs.innerHTML = ""
ctx.beginPath();
ctx.clearRect(0, 0, myCanvas.width, myCanvas.height);
ctx.closePath(); //可加入,可不加入
}
//线条粗细
function lineCrude() {
let activeIndex = selWidth.selectedIndex;
widthVal = selWidth[activeIndex].value;
}
//改变颜色
function setColor() {
let activeIndex = selColor.selectedIndex;
colorVal = selColor[activeIndex].value;
}
//保存图片
function saveImgInfo() {
var images = myCanvas.toDataURL('image/png');
imgs.innerHTML = `<img id="image1" src='${images}'>`
uploadAutograph();
}
clear.addEventListener("click", clearCanvas);
selWidth.addEventListener("change", lineCrude);
selColor.addEventListener("change", setColor);
imgInfo.addEventListener("click", saveImgInfo);
function dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, {type:mime});
}
//上传签名
function uploadAutograph(imgData) {
let formData = new FormData();
let imagesName=new Date().getUTCMinutes()+".png";
let fileData=document.getElementById('image1');
let fileOfBlob=dataURLtoFile(fileData.src,imagesName);
formData.append("file",fileOfBlob);
let url=sensorServer.getUploadFileUrl1();
$.ajax({
url:url,
type:"post",
data:formData,
processData:false,
contentType:false,
success:function(data){
console.log(JSON.stringify(data));
if(data.msg=="操作成功"&&data.data!=null){
let uploadSuccessData=data.data;
if(uploadSuccessData!=null) {
let fileName=imagesName ; //;document.getElementById('file_1').files[0].name;
let serverUrl=uploadSuccessData.url;
let params={"fileUrl":serverUrl,"fileName":fileName};
let parm={"id":curInfo.id,"autographAttachmentId":uploadSuccessData.attachmentId};
let result=sensorServer.updateAccount(parm);//上传保存数据逻辑
if(result==1)
{
layer.alert("上传成功!", {
icon: 6
},
function () {
//关闭当前frame
xadmin.close();
// 可以对父窗口进行刷新
xadmin.father_reload();
});
} else
{
layer.alert("上传失败!", {
icon: 6
},
function () {
//关闭当前frame
xadmin.close();
// 可以对父窗口进行刷新
xadmin.father_reload();
});
}
}else{
layer.msg("保存失败!");
}
}else{
alert(JSON.stringify(data));
layer.msg("上传失败!");
}
},
error:function(e){
alert("错误!!");
}
});
}
function getQueryVariable(variable)
{
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");
if(pair[0] == variable){return pair[1];}
}
return(false);
}
var curInfo;
$(function () {
let pid = getQueryVariable("id");
var accountInfo = sensorServer.getAccountInfoById({"id": parseInt(pid)});
curInfo=accountInfo;
if(curInfo.autographAttachmentUrl!=null&&curInfo.autographAttachmentUrl!=""){
$("#imgOld")[0].src=curInfo.autographAttachmentUrl;
}
});
</script>
</html>
边栏推荐
- 南京科技大学、中国电子科技第28研究所等联合|MLRIP: Pre-training a military language representation model with informative factual knowledge and professional knowledge base(预训练具有丰富事实知识和专业知识库的军事语言表示模型)
- 27英寸横置大屏+实体按键,全新探险者才是安全而合理的做法!
- VIM实用指南(-1)VIM的前世今生
- VIM使用指南(7)单词移动/删除技巧
- 五分钟带你上手ShardingJDBC实现MySQL分库分表
- MySQL中字符串比较大小(日期字符串比较问题)
- 设计专业第一台笔记本 华硕灵耀Pro16 2022 新品首发超值入手
- MySQL data processing of authorization 】 【
- SSM入门
- Slider/Carousel图片切换支持触摸屏
猜你喜欢
IronOS, an open source system for portable soldering irons, supports a variety of portable DC, QC, PD powered soldering irons, and supports all standard functions of smart soldering irons
LeetCode50天刷题计划(Day 8—— 盛最多水的容器(23.00-1.20)
面试必问的HashCode技术内幕
p5js炫酷网页流光动画
canvas粒子雨动画js特效
gconf/dconf编程实战(1)gconf和dconf介绍
2.8K 120Hz touch dual-screen blessing Lingyao X dual-screen Pro 2022 makes the office without fear of imagination
2022年5月20日最全摸鱼游戏导航
通胀持续 肯尼亚粮食安全引关注
Inflation continues, Kenya's food security a concern
随机推荐
便携烙铁开源系统IronOS,支持多款便携DC, QC, PD供电烙铁,支持所有智能烙铁标准功能
2022年5月20日最全摸鱼游戏导航
打破文件锁限制,以存储力量助力企业增长新动力
Spark: Cluster Computing with Working Sets
SQL查询语句之查询数据
布隆过滤器bloom
未来小间距竞争的着力点在哪里
Grafana9.0发布,Prometheus和Loki查询生成器、全新导航、热图面板等新功能!
Flink - SQL can separate a certain parallelism of operator node configuration?
珠海市生物安全P3实验室主体结构封顶
全网最全音视频媒体流
指针进阶(二)
Timezone setting in MySQL
选择合适的 DevOps 工具,从理解 DevOps 开始
尾牙宴是什么
LeetCode50天刷题计划(Day 9—— 整数转罗马数字(20.40-22.10)
CSDN配置功能总结
SyntaxHighlighter带来的字符转义问题
Row locks in MySQL
VIM实用指南(3)复制,粘贴 ,删除,撤销,重做指令速记