JS实现canvas简单小画板功能


Posted in Javascript onJune 23, 2020

本文实例为大家分享了JS实现canvas简单小画板的具体代码,供大家参考,具体内容如下

JS实现canvas简单小画板功能

Html部分:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <link rel="stylesheet" href="./index.css" rel="external nofollow" >
  <title>Document</title>
</head>
<body>
  <div class="container">
    <canvas id="cavs" width="700" height="330"></canvas>
    <ul>
      <li> <input type="color" id="color"> </li>
      <li> <input type="button" id="cleanBoard" value="清屏"></li>
      <li> <input type="button" id="eraser" value="橡皮"></li>
      <li> <input type="button" id="rescind" value=撤销></li>
      <li> <input type="button" id="save" value=保存></li>
      <li><input type="range" id="lineRuler" min="1" max="20"> </li>
    </ul>
  </div>
  <script src="./index.js"></script>
</body>
</html>

CSS部分:

*{
  margin: 0;
  padding: 0;
  list-style: none;
}
.container{
  margin: 30px;
}
#cavs{
  border: 1px solid red;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.6);
  border-radius: 10px;
}
.container ul{
  margin-top: 20px;
  width: 700px;
  text-align: center;
}
.container ul li{
  display: inline-block;
  margin-left: 35px;
}
.container ul li input{
  padding: 6px 15px;
  border-radius: 10px;
  border: none;
  outline: none;
  cursor: pointer;
  transition: box-shadow 0.3s cubic-bezier(0.6, -0.28, 0.735, 0.045);
}
.container ul li input:hover{
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.6);
}

JS部分:

var drawingBoard = {
  cavs: document.getElementById('cavs'),
  ctx: document.getElementById('cavs').getContext('2d'),
  ul_node: document.getElementsByTagName('ul')[0],
  colorBoard: document.getElementById('color'),
  lineRuler: document.getElementById('lineRuler'),
  imgArr: [],//存放图片
  init: function () {
    this.ctx.lineCap = 'round';
    this.ctx.lineJoin = 'round';
    this.drawing();//开始画画
    this.btnsFnAll();
  },
  drawing: function () {
    var self = this;
    var left = this.cavs.offsetLeft;
    this.cavs.onmousedown = function (e) {
      var e_x = e.pageX;//鼠标在画布上的x点
      var e_y = e.pageY;
      self.ctx.beginPath();//开始绘制
      self.ctx.moveTo(e_x - left, e_y - left);//落笔点,开始点
      var imgData = self.ctx.getImageData(0, 0, self.cavs.offsetWidth, self.cavs.offsetHeight);
      self.imgArr.push(imgData)
      document.onmousemove = function (e) {
        self.ctx.lineTo(e.pageX - left, e.pageY - left);//落笔点,开始点
        self.ctx.stroke();
      }
      document.onmouseup = function () {
        document.onmousemove = null;
        self.ctx.closePath();//闭合当前的路径 结束绘制
      }
      this.onpointerleave = function () {
        document.onmousemove = null;
      }
    }
  },
  btnsFnAll: function () {
    var self = this;
    this.ul_node.addEventListener('click', function (e) {
      console.log(e.target.id);
      switch (e.target.id) {
        case 'cleanBoard'://清屏
          self.ctx.clearRect(0, 0, self.cavs.offsetWidth, self.cavs.offsetHeight)
          break;
        case 'eraser'://橡皮
          self.ctx.strokeStyle = "#ffffff";
          break;
        case 'save'://保存
          let url = self.cavs.toDataURL('image/jpg');
          let a = document.createElement('a');
          document.body.appendChild(a);
          a.href = url;
          a.download = '草稿纸';
          a.target = '_blank';
          a.click()
          break;
        case 'rescind'://撤销
          console.log(self.imgArr)
          if (self.imgArr.length > 0) {
            self.ctx.putImageData(self.imgArr.pop(), 0, 0)
          }
          break;
      }
    });
    this.colorBoard.onchange = function () {
      self.ctx.strokeStyle = this.value;
    };
    this.lineRuler.onchange = function () {
      self.ctx.lineWidth = this.value
    }
  }
}
drawingBoard.init();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js Array操作的最简短最容易理解方法
Dec 09 Javascript
JavaScript中的闭包(Closure)详细介绍
Dec 30 Javascript
简易的投票系统以及js刷票思路和方法
Apr 07 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
Jun 05 Javascript
jquery可定制的在线UEditor编辑器
Nov 17 Javascript
jQuery.Form上传文件操作
Feb 05 Javascript
详细分析jsonp的原理和实现方式
Nov 20 Javascript
vue scroller返回页面记住滚动位置的实例代码
Jan 29 Javascript
Vue二次封装axios为插件使用详解
May 21 Javascript
Vue监听滚动实现锚点定位(双向)示例
Nov 13 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
Aug 06 Javascript
javascript canvas实现雨滴效果
Jun 09 Javascript
javascript+Canvas实现画板功能
Jun 23 #Javascript
vue.js实现照片放大功能
Jun 23 #Javascript
vue实现点击按钮切换背景颜色的示例代码
Jun 23 #Javascript
vue.js实现双击放大预览功能
Jun 23 #Javascript
vue实现分页的三种效果
Jun 23 #Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
Jun 23 #Javascript
weui上传多图片,压缩,base64编码的示例代码
Jun 22 #Javascript
You might like
Terran热键控制
2020/03/14 星际争霸
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
2013/04/24 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
2015/04/20 PHP
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
jquery offset函数应用实例
2012/11/14 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
js停止冒泡和阻止浏览器默认行为的简单方法
2016/05/15 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
vue-loader教程介绍
2017/06/14 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
JS实现简单日历特效
2020/01/03 Javascript
Python的Flask框架与数据库连接的教程
2015/04/20 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
Django实现基于类的分页功能
2019/10/31 Python
python实现银行实战系统
2020/02/26 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
公立医院改革实施方案
2014/03/14 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
护士实习自荐信
2015/03/06 职场文书
SpringBoot深入分析讲解监听器模式下
2022/07/15 Java/Android
MySQL数据管理操作示例讲解
2022/12/24 MySQL