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 相关文章推荐
客户端脚本中常常出现的一些问题和调试技巧
Jan 09 Javascript
纯Javascript实现Windows 8 Metro风格实现
Oct 15 Javascript
Tab切换组件(选项卡功能)实例代码
Nov 21 Javascript
Lab.js初次使用笔记
Feb 28 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
Nov 25 Javascript
JS实现日期时间动态显示的方法
Dec 07 Javascript
微信开发 js实现tabs选项卡效果
Oct 28 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
Jan 03 Javascript
react 实现页面代码分割、按需加载的方法
Apr 03 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
Jun 10 Javascript
javascript实现的字符串转换成数组操作示例
Jun 13 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
Aug 18 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
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
jQuery插件开发全解析
2012/10/10 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
AngularJS中watch监听用法分析
2016/11/04 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
react配置antd按需加载的使用
2019/02/11 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
在Python的Django框架中创建和使用模版
2015/07/15 Python
TensorFlow saver指定变量的存取
2018/03/10 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
Python os.access()用法实例
2019/02/18 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
营销主管自我评价怎么写
2013/09/19 职场文书
外贸业务员工作职责
2014/01/06 职场文书
元旦晚会邀请函
2014/02/01 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
借名购房协议书范本
2014/10/06 职场文书
市场营销计划书范文
2015/01/16 职场文书
大学生年度个人总结
2015/02/15 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
水浒传读书笔记
2015/06/25 职场文书
消夏晚会主持词
2015/06/30 职场文书
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers