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 中,万物皆对象,为什么还要通过 ...
随机推荐
- Linux查看文件大小、磁盘使用情况
1.显示磁盘的可用情况: df -h 2.显示文件夹大小 du -ka folder | sort -rnk 1 | head -n 10
- 【Azure 事件中心】Event Hubs如何获取其中存放的历史消息
问题描述 使用Azure Event Hub服务,除了正常的生产,消费消息以外,如果想拿到Event Hub中存储的历史消息?有什么方法呢? 问题解答 获取 Event Hubs 存储的历史消息,首先 ...
- Python实现ARP攻击
目录 概述 ARP协议 IP转MAC 结构 ARP扫描 开始欺骗 中间人 其他 ARP老化 防御 windows linux 概述 高中的时候,学校有一个商店,会放开WIFI给偷偷带手机去学校的我们使 ...
- Java 从键盘上输入"year"“month”和“day”,要求通过程序输出 输入的日期为第几年的第几天
1 /** 2 * 编写程序: 3 * 从键盘上输入"year""month"和"day",要求通过程序输出 4 * 输入的日期为第几年的第 ...
- Thinkphp6 自定义命令创建类文件
以创建控制器为例 1.先通过 think 命令创建一个make文件,效果如下图: php think make:command make/MyController 2.修改上面创建的文件[MyCont ...
- 如何将应用一键部署至多个环境?丨Walrus教程
在 Walrus 平台上,运维团队在资源定义(Resource Definition)中声明提供的资源类型,通过设置匹配规则,将不同的资源部署模板应用到不同类型的环境.项目等.与此同时,研发人员无需关 ...
- liunx 设置默认python版本方法,
Linux 中把Python3设为默认Python版本的几种方法 由于工作中要用到到python3.6 而服务器是2.7 ,这个低版本的2.7很多系统都要依赖,还不能删,同事建议建一个虚拟环境,但是 ...
- XAF Blazor 中使用 Blazor 组件
前言 文章的标题是不是感觉有点奇怪,但实际我们在XAFBlazor中使用Blazor组件是很繁琐的,我们需要将Blazor组件封装成属性编辑器(PropertyEditor),再用非持久化对象(Non ...
- masscode.io snippets 和 vscode 联动 代码片段
https://masscode.io/ 软件作用 代码片段 vscode 可以联动使用 下载不行 慢的话, 下载 fastgithub,打开后再下载
- pollute 污染 pol=por=pro 向前 lut=释放 结合ps软件里面lut概念记忆
pollute 污染 pol = por = pro = 向前 lut = 释放 (ps里面有lut的概念) e 动词 向前释放 -> 污染 弄脏 简单记忆 poll / ute poll - ...