• canvas的常用功能(电脑版)


    前言:

      canvas可以单独算为前端的一大知识模块, 今天就研究一下.

      先做下前文铺垫:

        ①创建canvas

    <canvas id="myCanvas" width="200" height="100" style="border:1px solid #000000;"></canvas>

        ②获取canvas

        var cavs = document.getElementById("cavs");           //获取canvas
        var ctx = cavs.getContext("2d");                     //可以理解为生成一个2d画笔
            ctx.moveTo(100, 100);                           //落笔点
            ctx.lineTo(200, 200);                          //结束点

        ③常用样式

             ctx.strokeStyle = "#f00"                 //线条的颜色2
             ctx.lineWidth = 10;                    //线条粗细

        ④绘制线条

          ctx.stroke();            //绘制线条

        ⑤填充图案

         ctx.fillStyle = "yellow";            //填充颜色
         ctx.fill(); //进行填充

        ⑥开始结束

             ctx.beginPath();    //开始
             ctx.closePath();    //结束

        ⑦其他

             var img = ctx.getImageData(x, y, width, height);     //截取canvas中图案
             ctx.putImageData(img, width, height)            //将img放到canvas中
             ctx.clearRect(x,y,canvas.width,canvas.height)         //清除画布

    正文:

      说再多也没用, 最终还是进行实战, 终于进入正文了;

      HTML部分

    <div class="wrapper">
        <canvas id="cavs" width="1000" height="500"></canvas>
        <ul class="btn-list">
            <li><input type="color" id="colorBoard"></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="range" id="lineRuler" value="线条" min="1" max="30"></li>
        </ul>
    </div>

      css部分

    *{
      padding: 0;
      margin: 0;
    }
    .wrapper{
      margin: 15px;
    }
    .wrapper canvas{
      border:1px solid #000;
      border-radius: 25px;
      box-shadow:10px 10px 5px #999;
      margin-bottom: 20px;
    }
    .wrapper ul{
      width: 1000px;
      text-align: center;
    }
    .wrapper ul li{
      display: inline-block;
      margin-left: 40px;
    }
    .wrapper ul li input{
      display: block;
      background: #ddd;
      color: #000;
      border-radius: 25px;
      border:none;
      padding: 10px 20px;
      font-size: 15px;
      transition-duration: 0.2s;
    }
    .wrapper ul li input:hover{
      background: #999;
      border: 1px solid #f00;
      box-shadow: 0 12px 16px 0 rgba(0,0,0,0.3);
    }

      js部分

    function ID(str) {
      return document.getElementById(str);
    }
    
    var darwingLineObj = {
      cavs:this.ID("canvas"),
      color:this.ID("color"),
      clear:this.ID("clear"),
      eraser:this.ID("eraser"),
      rescind:this.ID("rescind"),
      weight:this.ID("weight"),
      bool:false,
      arrImg:[],
      //初始化
      init:function(){
        this.draw();
      },
      draw:function(){ 
        var cavs = this.cavs,
            self = this,
            ctx = cavs.getContext("2d");
            ctx.lineWidth = 15;
            ctx.lineCap = "round";          //线条始终的样式
            ctx.lineJoin = "round";         //转弯的圆角
    
        var c_x = cavs.offsetLeft,          //元素距离左侧的位置
            c_y = cavs.offsetTop;           //canvas距离顶部
            
    
        cavs.onmousedown = function(e){
          e = e || window.event;
          self.bool = true;
          var m_x = e.pageX - c_x;
          var m_y = e.pageY - c_y;
          ctx.beginPath();
          ctx.moveTo(m_x,m_y);   //鼠标在画布上的触点
    
          var imgData = ctx.getImageData(0, 0, cavs.width, cavs.height);  //将每次画完拷贝到数组中
          self.arrImg.push(imgData);
        }
    
        cavs.onmousemove = function(e){
            if(self.bool){
              ctx.lineTo(e.pageX-c_x, e.pageY-c_y);
              ctx.stroke();
            }
          }
    
        cavs.onmouseup = function(e){
          self.bool = false;
          ctx.closePath();
        }
    
        self.color.onchange = function(e){      //设置颜色
          e = e || window.event;
          //console.log(e.target.value)
          ctx.strokeStyle = e.target.value;
        }
    
        self.clear.onclick = function(){
          ctx.clearRect(0,0,cavs.width,cavs.height)
        }
    
        self.eraser.onclick = function(){
          ctx.strokeStyle = "#fff";
        }
    
        self.rescind.onclick = function(){            //撤销的重点难点
          if (self.arrImg.length>0) {
            ctx.putImageData(self.arrImg.pop(),0,0)
          }
        }
    
        self.weight.onchange = function(e){       //设置线条粗细
          //console.log(e.target.value)
          ctx.lineWidth = e.target.value;     
        }
    
       }//draw end
    
    }
    
    darwingLineObj.init();

    结语:

      本文还有不足之处, 欢迎大家指正.

    声明:

      参考: 渡一教育

        

  • 相关阅读:
    ios -- 教你如何轻松学习Swift语法(一)
    collectionView,tableView的细节处理
    主流界面搭建原理(类似百思不得姐主界面)
    ios--时间格式化(cell业务逻辑处理)
    test
    Mac下安装Matlab R2015b
    最大奇约数
    编码问题
    最优二叉查找树
    二维数组和二级指针
  • 原文地址:https://www.cnblogs.com/xihailong/p/11640834.html
Copyright © 2020-2023  润新知