canvas制作电子白板签名功能

news2025/1/22 8:33:17

Canvas是html5主要的画图工具,用户可以利用js在里面构思自己的创意,页面上很多手写签名是通过这个来完成的,让我们来用一个简单的例子作为抛砖引玉。

效果图

在这里插入图片描述

源代码

							<html>  
    <head>  
        <meta charset="utf-8">  
        <title>canvas制作电子白板签名功能</title>  
        <style type="text/css">  
          #container { position: relative;}  
          #imageView { border: 1px solid #b00; background-color: #fff; margin:0 auto; }  
       </style>  
  </head>  
  <body>  
    <div id="container">  
      <canvas id="imageView" width="680" height="400">  
      </canvas>  
    </div>  
<script type="text/javascript">  
    var canvas;  
    var context;  
     var tool;  
  
/**  
 * called on window load.  
 */  
if(window.addEventListener){  
    window.addEventListener('load',  
            init(),  
            false);  
}  
  
/**  
 * init.  
 */  
function init(){  
    /**  
     * find the canvas element.  
     */  
    canvas = document.getElementById('imageView');  
    if(!canvas){  
        return;  
    }  
    if(!canvas.getContext){  
        return;  
    }  
  
    /**  
     * get the 2D canvas context.  
     */  
    context = canvas.getContext('2d');  
    if(!context){  
        return;  
    }  
  
    /**  
     * pencil tool instance.  
     */  
    tool = new tool_pencil();  
  
    /**  
     * attach the mousedown, mousemove and mouseup event listeners.  
     */  
    canvas.addEventListener('mousedown', ev_canvas, false);  
    canvas.addEventListener('mousemove', ev_canvas, false);  
    canvas.addEventListener('mouseup',   ev_canvas, false);  
      
}  
  
/**  
 * This painting tool   
 * works like a drawing pencil   
 * which tracks the mouse movements.  
 *   
 * @returns {tool_pencil}  
 */  
function tool_pencil(){  
    var tool = this;  
    this.started = false;  
  
    /**  
     * This is called when you start holding down the mouse button.  
     * This starts the pencil drawing.  
     */  
    this.mousedown = function (ev){  
        /**  
         * when you click on the canvas and drag your mouse  
         * the cursor will changes to a text-selection cursor  
         * the "ev.preventDefault()" can prevent this.  
         */  
        ev.preventDefault();  
        context.beginPath();  
        context.moveTo(ev._x,ev._y);  
        tool.started = true;  
    };  
  
    /**  
     * This is called every time you move the mouse.  
     * Obviously, it only draws if the tool.started state is set to true  
     */  
    this.mousemove = function (ev){  
        if(tool.started){  
            context.lineTo(ev._x,ev._y);  
            context.stroke();  
        }  
    };  
  
    /**  
     * This is called when you release the mouse button.  
     */  
    this.mouseup = function (ev) {  
        if(tool.started){  
            tool.mousemove(ev);  
            tool.started = false;  
        }  
    };  
}  
  
/**  
 * general-purpose event handler.  
 * determines the mouse position relative to the canvas element.  
 *   
 * @param ev  
 */  
function ev_canvas(ev){  
    var x,y;  
    if(ev.offsetX || ev.offsetY == 0){  
        ev._x = ev.offsetX;  
        ev._y = ev.offsetY;  
    }  
      
    /**  
     * call the event handler of the tool.  
     */  
    var func = tool[ev.type];  
    if (func) {  
      func(ev);  
    }  
}  
      
    </script>  
  </body>  
</html>  
							


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1165232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【脚本工具】视频抽帧、添加srt字幕朗读、添加背景音频

1.文章目录 看完本文章&#xff0c;你将能学会一下内容&#xff1a; 批量视频抽帧&#xff1b;添加srt字幕&#xff1b;添加srt配音&#xff1b;添加背景音乐&#xff1b;多视频片段合成一个新视频&#xff1b; 效果&#xff1a; 2.安装依赖 首先安装视频处理库opencv-pyth…

ERR invalid password

E:\Document_Redis_Windows\redis-2.4.5-win32-win64\64bit redis.conf

前端实现调用打印机和小票打印(TSPL )功能

Ⅰ- 壹 - 使用需求 前端 的方式 点击这个按钮&#xff0c;直接让打印机打印我想要的东西 Ⅱ - 贰 - 小票打印 目前比较好的方式就是直接用 TSPL 标签打印指令集, 基础环境就不多说了,这个功能的实现就是利用usb发送指令,现在缺少个来让我们能够和usb沟通的工具,下面这就是推…

代码随想录 Day35 动态规划04 01背包问题和完全背包问题 LeetCode T416 分割等和子集

背包问题 说到背包问题大家都会想到使用动规的方式来求解,那么为什么用动规呢,dp数组代表什么呢?初始化是什么,遍历方式又是什么,这篇文章笔者将详细讲解背包问题的经典例题0-1背包问题和完全背包问题的解题方式,希望能帮助到大家 1.暴力方式 有人一提到背包问题就只会使用动态…

C++之队列queue

1.知识百科 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。进行插入操作的…

Idea - Apifox Helper 插件的安装、配置令牌、导出

第一步&#xff1a;先安装插件&#xff08;其他EASY API 、Api docx同理&#xff09; 等待安装完毕 第二步&#xff1a; 导出你想导出的API 提示我们没有找到配置文件&#xff0c;需要到设置里面设置Personal Access Token 第三步&#xff1a;到设置里面设置Personal Access T…

AI:50-基于深度学习的柑橘类水果分类

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

城市内涝解决方案:实时监测,提前预警,让城市更安全

城市内涝积水问题是指城市地区在短时间内遭遇强降雨后&#xff0c;地面积水过多&#xff0c;导致城市交通堵塞、居民生活不便、财产损失等问题。近年来&#xff0c;随着全球气候变化和城市化进程的加速&#xff0c;城市内涝积水问题越来越突出&#xff0c;成为城市发展中的一大…

C++之初始化列表详细剖析

一、初始化列表定义 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括号中的初始值或表达式。 class Date { public:Date(int year, int month, int day): _year(year), _month(mont…

tauri 访问静态资源,响应头为Content-Type:‘text/html‘

现象 报错&#xff1a; Error: THREE.FBXLoader: Unknown format. at FBXLoader.parse (index-f8291142.js:22050:15) at Object.onLoad (index-f8291142.js:22033:22) at index-f8291142.js:19769:20 使用threejs 加载fbx模型文件时&#xff0c;返回头中Content-…

《C++ Primer》第6章 函数(一)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 6.1 函数基础&#xff08;P182&#xff09; 典型的函数定义包括&#xff1a;返回类型&#xff08; return type &#xff09;、函数名字、0 个或多个形参&#xff08; parameter &#xff09;组成的列表、函…

使用HttpClient库的爬虫程序

使用HttpClient库的爬虫程序&#xff0c;该爬虫使用C#来抓取内容。 using System; using System.Net.Http; using System.Threading.Tasks; ​ namespace CrawlerProgram {class Program{static void Main(string[] args){// 创建HttpClient对象using (HttpClient client new…

数据结构 - 顺序表ArrayList

目录 实现一个通用的顺序表 总结 包装类 装箱 / 装包 和 拆箱 / 拆包 ArrayList 与 顺序表 ArrayList基础功能演示 add 和 addAll &#xff0c;添加元素功能 ArrayList的扩容机制 来看一下&#xff0c;下面的代码是否存在缺陷 模拟实现 ArrayList add 功能 add ind…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第七章 muduo编程示例(上)

本章将介绍如何用muduo网络库完成常见的TCP网络编程任务。内容如下&#xff1a; 1.[UNP]中的五个简单协议&#xff0c;包括echo、daytime、time、discard、chargen等。 2.文件传输&#xff0c;示范非阻塞TCP网络程序中如何完整地发送数据。 3.Boost.Asio中的示例&#xff0c;…

新手学习两种不同的存储方式(不喜勿喷)

localStorage.setItem(sid,res.info.id)console.log(sid,res.info.id)sessionStorage.setItem(uid,res.info.id) sid和uid&#xff0c;也可以写其他的只来替代&#xff1b;而res.info.id是接口的数据可替换成自己的 一次性传的id值刷新页面就没有 永久性传的id 这是Javascript…

Linux——切换CUDA版本

一、查看本地cuda版本 cd /usr/local/ ls当前cuda为软连接&#xff0c;指向指定的cuda版本 stat cuda # 查看当前cuda状态信息二、切换CUDA版本 # 删除原有软连接 sudo rm -rf /usr/local/cuda # 建立需要切换的cuda软连接版本 sudo ln -s /usr/local/cuda-**.* /usr/l…

【GitLab、GitLab Runner、Docker】GitLab CI/CD 应用

安装Gitlab开源版 官方文档-安装Gitlab 使用Docker安装 sudo docker run --detach \--hostname gitlab.example.com \--env GITLAB_OMNIBUS_CONFIG"external_url http://${ip}:9999/; gitlab_rails[gitlab_shell_ssh_port] 8822;" \--publish 443:443 --publish 99…

Circos图绘制

Circos图其实是一个用途非常广泛的图形&#xff0c;可以用于表征基本上任何类型的数据&#xff0c;包括把我们常见的散点图、折线图和柱状图等都可以整合到Circos当中。特别是&#xff0c;Circos尤其适合用来描述生物信息学和基因组学的数据。 1.绘制Circos图 目前绘制Circos图…

单元测试一(理论)-云计算2023.11-云南农业大学

实验《 ECS数据管理实践-备份与恢复》 https://developer.aliyun.com/adc/scenario/7ad13e326c924d07a1ddb4e88cb26ce4 数据盘挂载到 /alidata&#xff0c;alidata改为自己姓名全拼&#xff0c;数据盘上创建文件test.txt&#xff0c;改为test接自己姓名全拼.txt&#xff0c;快…

根据Word模板,使用POI生成文档

突然想起来有个小作业&#xff1a;需要根据提供的Word模板填充数据。这里使用POI写了一个小demo验证下。 测试用模板&#xff1a; 执行结果 1.引入依赖坐标 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId&…