做移动端电子签名发现canvas的 一些坑
做移动端收集电子签名项目的时候发现了一些坑:
1. 移动端的手指按下、移动、抬起事件跟PC端的鼠标按下、移动、弹起事件是不一样的
2. canvas它的属性宽高和样式宽高是不一样的,通过CSS来设置canvas的宽高会导致一些奇怪的问题
3. canvas的间距(如果有)会造成手指落点和实际绘画的点有偏移,所以在开始绘画的时候要先把画笔移动到正确的位置
<canvas id="ESCanvas" width="400" height="400">该浏览器不支持canvas画布</canvas>
//PC端鼠标绘画代码
var canvas = document.getElementById('ESCanvas');
var ctx = canvas.getContext('2d');
var paint = false; canvas.onmousedown =function (e) {
paint = true;
ctx.moveTo(e.pageX - this.offsetLeft, e.pageY - this.offsetTop);
canvas.onmousemove = function (e) {
if (paint) {
ctx.lineTo(e.pageX - this.offsetLeft, e.pageY - this.offsetTop);
ctx.stroke();
}
}
canvas.onmouseup = function (e) {
paint = false;
}
}
//移动端手绘代码 //阻止页面拖动
document.body.addEventListener('touchmove', function (e) {
e.preventDefault();
}, { passive: false }); var canvas = document.getElementById("ESCanvas");
var ctx = canvas.getContext("2d"); //页面样式
canvas.width = window.screen.width - 42;//左边距20,右边为对齐左边留20,边框左右各1
canvas.height = window.screen.height - 130;//顶边距20,底边距20,边框左右各1,按钮组68,按钮组底边距20 var l = canvas.offsetLeft;
var t = canvas.offsetTop; canvas.ontouchstart = function (e) {
ctx.beginPath();
ctx.moveTo(e.touches[0].pageX - l, e.touches[0].pageY - t);
} canvas.ontouchmove = function (e) {
ctx.lineTo(e.touches[0].pageX - l, e.touches[0].pageY - t);
ctx.stroke();
} canvas.ontouchend = function (e) {
ctx.closePath();
}
最后的页面效果图:

做移动端电子签名发现canvas的 一些坑的更多相关文章
- 如何使用Vue2做服务端渲染
花费了一个月时间,终于在新养车之家项目中成功部署了vue2服务端渲染(SSR),并且使用上了Vuex 负责状态管理,首屏加载时间从之前4G网络下的1000ms,提升到了现在500-700ms之间,SS ...
- vue2.0做移动端开发用到的相关插件和经验总结1.0
最近在用vue2.0做微信公众号相关的前端开发,经过这次开发实践,现将项目中用到的相关比较实用的插件及遇到的相关问题进行整理,希望和大家共同交流...... cssrem:一个CSS值转REM的VSC ...
- appium+python做移动端自动化测试
1 导言 1.1 编制目的 该文档为选用Appium作为移动设备原生(Native).混合(Hybrid).移动Web(Mobile Web)应用UI自动化测试的相关自动化测试人员.开发人员等提供 ...
- vue+vue-cli+淘宝lib-flexible做移动端自适应
总结用vue+vue-cli+淘宝lib-flexible做移动端自适应方案: 1.安装淘宝lib-flexible npm install lib-flexible --save 2.在入口文价ma ...
- 干货分享:vue2.0做移动端开发用到的相关插件和经验总结(2)
最近一直在做移动端微信公众号项目的开发,也是我首次用vue来开发移动端项目,前期积累的移动端开发经验较少.经过这个项目的锻炼,加深了对vue相关知识点的理解和运用,同时,在项目中所涉及到的微信api( ...
- vue2.0做移动端开发用到的相关插件和经验总结
最近一直在做移动端微信公众号项目的开发,也是我首次用vue来开发移动端项目,前期积累的移动端开发经验较少.经过这个项目的锻炼,加深了对vue相关知识点的理解和运用,同时,在项目中所涉及到的微信api( ...
- snkrs web端分析,canvas中的fingerpint
snkrs web端分析,canvas中的fingerpint 代码如下 (()=>{ const canvas = document.createElement("canvas&qu ...
- react-navigation 做导航栏,发现 Android 上的标题不居中
在做 React Native 应用的时候,我们常常使用 react-navigation 做导航栏,发现 Android 上的标题不居中,IOS 上没问题. 1 如果只有标题,那就在 headerT ...
- 如何实现 Https拦截进行 非常规“抓包” 珍惜Any 看雪学院 今天 前段时间在自己做开发的时候发现一个很好用的工具,OKHttp的拦截器(何为拦截器?就是在每次发送网络请求的时候都会走的一个回调)大概效果如下:
如何实现 Https拦截进行 非常规“抓包” 珍惜Any 看雪学院 今天 前段时间在自己做开发的时候发现一个很好用的工具,OKHttp的拦截器(何为拦截器?就是在每次发送网络请求的时候都会走的一个回调 ...
随机推荐
- [Swift]LeetCode977. 有序数组的平方 | Squares of a Sorted Array
Given an array of integers A sorted in non-decreasing order, return an array of the squares of each ...
- Spring Data Jpa接口简介
Repository接口 public interface Repository<T, ID> {....} 提供了按方法名称的查询方式: 提供了@Query的查询方式 可能遇到的错误: ...
- AutoFac - 将 autofac 应用于MVC多层项目
一.前言 AutoFac是.NET平台下的一款著名的IoC Container,它可以让我们很轻松的解除项目中服务类的接口与客户类的接口实现类之间的依赖关系,从而降低系统各模块之间耦合程度以提高系统的 ...
- .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
本篇我将带着大家一起来对Dapper进行下封装并实现基本的增删改查.分页操作的同步异步方法的实现(已实现MSSQL,MySql,PgSQL).同时我们再实现一下仓储层的代码生成器,这样的话,我们只需要 ...
- gdb常用命令记录
gdb常用命令 最近在研究nginx源码,gdb用于调试非常方便,之前这篇有研究过如何使用gdb调试nginx:https://www.cnblogs.com/yjf512/archive/2012/ ...
- .NET Core下的Spring Cloud——前言和概述
前言 前几年一直在写类似dubbo,Srping Cloud的微服务框架辗辗转转重复了多次,也重构推翻了很多次,其中诞生了"Rabbit.Rpc","Go",& ...
- [五]java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用
reduce-归约 看下词典翻译: 好的命名是自解释的 reduce的方法取得就是其中归纳的含义 java8 流相关的操作中,我们把它理解 "累加器",之所以加引号是因为他并不仅仅 ...
- Mac homebrew-1.5以后安装php扩展的方法
一.以前Mac安装php及php扩展的方式 用Mac的童鞋都知道,我们以前都是用brew install php70,brew install php71 这样来安装php的,用brew instal ...
- python之字符串反转
def main(): a = "abcdefg" a = a[::-1] print(a) if __name__ == '__main__': main()
- break,return和continue三者区别(Java)
一.break用于完全结束一个循环,跳出循环体. 不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码. class Demo3 { public static v ...