js实现电子白板
功能:使用画笔绘制笔迹(线条)、橡皮檫
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>js实现电子白板</title>
</head>
<body>
<canvas id="canvas" width="500px" height="500px" style="border: 3px solid black;"></canvas>
<br>
<button onclick="show()">显示</button>
<button onclick="hide()">隐藏</button>
<button onclick="clearAnnote()">清空</button>
<button id="xiangpicha" onclick="xiangpicha()">橡皮檫</button>
<script>
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var state_bi = true;
var state_press = false;
var lastX, lastY;
var state_xiangpicha = false; function show(){
canvas.style.display = "block";
state_bi = true;
}
function hide(){
canvas.style.display = "none";
state_bi = false;
} function clearAnnote(){
ctx.clearRect(0,0,canvas.width, canvas.height);
} function xiangpicha(){
state_xiangpicha = state_xiangpicha == true ? false : true;
if(state_xiangpicha){
document.getElementById("xiangpicha").innerText = "关闭橡皮檫";
state_bi = false;
}else{
document.getElementById("xiangpicha").innerText = "橡皮檫";
state_bi = true;
}
} canvas.addEventListener("mousedown", (e)=>{
state_press = true; if(state_bi){
[lastX, lastY] = [e.offsetX, e.offsetY];
} if(state_xiangpicha){
ctx.clearRect(e.offsetX - 3, e.offsetY - 3, 6, 6);
}
}) canvas.addEventListener("mousemove", (e)=>{
if(state_bi && state_press){
drawLine(lastX, lastY, e.offsetX, e.offsetY);
[lastX, lastY] = [e.offsetX, e.offsetY];
} if(state_xiangpicha && state_press){
ctx.clearRect(e.offsetX - 3, e.offsetY - 3, 6, 6);
}
}) canvas.addEventListener("mouseup", (e)=>{
state_press = false;
}) function drawLine(x1, y1, x2, y2){
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.lineWidth = 3;
ctx.strokeStyle = "#FF0000";
ctx.stroke();
}
</script>
</body>
</html>
js实现电子白板的更多相关文章
- Vue.js 和 MVVM 小细节
MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...
- js学习笔记:操作iframe
iframe可以说是比较老得话题了,而且网上也基本上在说少用iframe,其原因大致为:堵塞页面加载.安全问题.兼容性问题.搜索引擎抓取不到等等,不过相对于这些缺点,iframe的优点更牛,跨域请求. ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- jquery和Js的区别和基础操作
jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...
- 利用snowfall.jquery.js实现爱心满屏飞
小颖在上一篇一步一步教你用CSS画爱心中已经分享一种画爱心的方法,这次再分享一种方法用css画爱心,并利用snowfall.jquery.js实现爱心满屏飞的效果. 第一步: 利用伪元素before和 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- JS正则表达式常用总结
正则表达式的创建 JS正则表达式的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 var regObj = new RegExp("(^\\s+) ...
- 干货分享:让你分分钟学会 JS 闭包
闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...
- JS核心系列:理解 new 的运行机制
和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...
随机推荐
- DataGear 制作自定义柱状图条目颜色的数据可视化看板
DataGear 看板提供了dg-chart-options图表选项配置功能,可自定义样式.位置.显示内容等图表选项,其中的processUpdateOptions回调函数配置项,可以在图表更新数据前 ...
- 【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
问题描述 使用 .NET Azure.Identity 中的 DefaultAzureCredential 认证并连接到Azure Key Vault中, 在Key Vault 的示例中,并没有介绍如 ...
- 【Azure Developer】示例: 在中国区调用MSGraph SDK通过User principal name获取到User信息,如Object ID
问题描述 示例调用MSGraph SDK通过User principal name获取到User信息,如Object ID. 参考资料 选择 Microsoft Graph 身份验证提供程序 : ht ...
- 【Azure Redis 缓存】Redis连接无法建立问题的排查(注:Azure Redis集成在VNET中)
问题描述 在Azure App Service中部署的应用,需要连接到Redis中,目标Redis已经集成了虚拟网络(VNET)并且在Redis的网络防火墙中已经添加App Service的出站IP地 ...
- 代码随想录算法训练营第三十天| 51. N皇后 37. 解数独 总结
卡哥建议:今天这三道题都非常难,那么这么难的题,为啥一天做三道? 因为 一刷 也不求大家能把这么难的问题解决,所以 大家一刷的时候,就了解一下题目的要求,了解一下解题思路,不求能直接写出 ...
- 导入Excel文件的时候公式为【#Ref!】应该怎么解决?
前言 在我们使用Excel时,经常会遇到一个问题,就是导入Excel时公式显示为[#Ref!]的情况.这通常是因为公式中引用的单元格已被删除或对应的工作表被删除,导致原公式无法识别对应的参数而显示为[ ...
- Java 设计模式----单例模式的几种实现方式
单例模式的几种实现方式 单例模式的实现有多种方式,如下所示: 1.懒汉式,线程不安全 是否 Lazy 初始化:是 是否多线程安全:否 实现难度:易 描述:这种方式是最基本的实现方式,这种实现最大的问题 ...
- Git 如何删除本地分支和远程分支
查看已有的本地及远程分支:git branch -a 删除远程分支(当前删除的是origin/dev分支):git push origin --delete dev 删除后,再次查看分支情况: ...
- elementPlus配合vue-router搭建后台系统菜单模块
设置menuType来区分菜单类型 /** * @params menuType * -1 一般为首页 / -> /home 只显示第一个子项 * -2 为无子菜单的菜单项 /config -& ...
- 用户不在 sudoers 文件中。此事将被报告
在终端,进入root模式 vim /etc/sudoers 在 sudo (ALL:ALL) ALL下 添加 用户名 (ALL:ALL) ALL