首页 > 其他分享 >canvas线格图形,可移动

canvas线格图形,可移动

时间:2023-03-23 18:34:14浏览次数:18  
标签:function canvas 线格 20 point ctx set 图形

  1. 效果图片

    

 

       其中的小圆可以移动

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      #canvas {
        box-shadow: 0 0 5px #ccc;
        border-radius: 10px;
      }
      .cs {
        height: 100vh;
        display: flex;
        justify-content: center;
        align-items: center;
      }
    </style>
  </head>
  <body>
    <div class="cs">
      <canvas id="canvas" width="600" height="300"></canvas>
    </div>
  </body>
  <script>
    /** @type {HTMLCanvasElement} */
    var canvas = document.querySelector("#canvas");
    var ctx = canvas.getContext("2d");
    var set = {
      point: {
        x: 100,
        y: 100,
        r: 5,
      },
      ePoint: null,
    };

    // 绘制表格
    function drawCell() {
      for (var i = 0; i < 141; i++) {
        ctx.beginPath();
        ctx.moveTo(20 + 4 * i + 0.5, 20);
        ctx.lineTo(20 + 4 * i + 0.5, 280);
        if (i % 5 == 0) {
          ctx.lineWidth = 1;
          ctx.strokeStyle = "red";
        } else {
          ctx.lineWidth = 0.5;
          ctx.strokeStyle = "red";
        }
        ctx.stroke();
      }

      for (var i = 0; i < 66; i++) {
        ctx.beginPath();
        ctx.moveTo(20, 20 + 4 * i + 0.5);
        ctx.lineTo(580, 20 + 4 * i + 0.5);
        if (i % 5 == 0) {
          ctx.lineWidth = 1;
          ctx.strokeStyle = "red";
        } else {
          ctx.lineWidth = 0.5;
          ctx.strokeStyle = "red";
        }
        ctx.stroke();
      }
    }

    function clearCanvas() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
    }

    function drawBall() {
      const { point } = set;
      ctx.beginPath();
      ctx.arc(point.x, point.y, point.r, 0, Math.PI * 2);
      ctx.strokeStyle = "#000";
      ctx.stroke();
    }

    function DragStart(e) {
      const { point } = set;
      const obj = filterPoint(e);
      if (
        obj.x - point.r < point.x &&
        obj.x + point.r > point.x &&
        obj.y - point.r < point.y &&
        obj.y + point.r > point.y
      ) {
        canvas.style.cursor = "move";
        set.ePoint = e;
      }
    }

    function Dragging(e) {
      const { point, ePoint } = set;
      if (
        ePoint &&
        point.x >= 20 &&
        point.y >= 20 &&
        point.x <= 580 &&
        point.y <= 280
      ) {
        point.x += e.pageX - ePoint.pageX;
        point.y += e.pageY - ePoint.pageY;
        if (point.x < 20) {
          point.x = 20;
        }
        if (point.y < 20) {
          point.y = 20;
        }
        if (point.x > 580) {
          point.x = 580;
        }
        if (point.y > 280) {
          point.y = 280;
        }
        set.ePoint = e;
        clearCanvas();
        drawCell();
        drawBall();
      }
    }

    function DragEnd(e) {
      canvas.style.cursor = "default";
      set.ePoint = null;
      clearCanvas();
      drawCell();
      drawBall();
    }

    function filterPoint(e) {
      const top = canvas.offsetTop;
      const left = canvas.offsetLeft;
      return {
        x: e.pageX - left,
        y: e.pageY - top,
      };
    }

    function init() {
      clearCanvas();
      drawCell();
      drawBall();
      canvas.onmousedown = DragStart;
      canvas.onmousemove = Dragging;
      canvas.onmouseup = canvas.onmouseout = DragEnd;
    }

    init();
  </script>
</html>

 

标签:function,canvas,线格,20,point,ctx,set,图形
From: https://www.cnblogs.com/yanjuntao/p/17248458.html

相关文章

  • 一统天下 flutter - 图形: 绘制
    一统天下flutterhttps://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-图形:绘制示例如下:lib\shape\paint.dart/**绘制**CustomPai......
  • Canvas实现画布的缩放
    主要介绍三种方式:首先创建一个index.html文件<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE......
  • SVG、Canvas、WebGL对比
    SVG使用XML描述2D图形SVG中的元素和HTML元素一样,在输出图形前需要经过浏览器引擎的解析、布局计算和生成DOM树(SVG元素太多时非常消耗性能),可以添加事件SVG对象的属性发......
  • Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
    场景上面讲了node-red中获取mqtt数据的调试过程。如果要模拟通过温度传感器的mqtt订阅的主题中获取温度数据并在能显示仪表盘的界面中实时检测刷新数据。node-red支持自定义......
  • js canvas 照片旋转 demo
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width,initial-scale=1.0,maximum-scale=1.0,u......
  • Ubuntu系统中关闭Or开启图形化界面方法
    Ubuntu系统中关闭Or开启图形化界面方法说明:此方法不仅适用于Ubuntu22.04版本,同时也适用于Ubuntu20.04等其它版本。1、关闭图形化界面systemctlset-defaultmulti-u......
  • canvas 中使用跨域的图片
    一张跨域的图片直接在canvas中使用控制台是会给出警告的:Error:SecurityError:Failedtoexecute'toDataURL'on'HTMLCanvasElement':Taintedcanvasesmaynotbeex......
  • winform绘图与前端canvas绘图效率对比
    先说结论:前端canas的绘图效率更高。因为项目使用winform的缘故,最近要实现一些波形展示的功能。涉及到绘制,肯定离不开GDI+的内容,但是还有替代的方案吗?当然是有的,可双用Web......
  • Qt音视频开发26-监控画面各种图形绘制设计
    一、前言视频监控系统做到后面,逐渐需要搭配人工智能算法,将算法计算后的信息以OSD标签以及方框各种图形的信息显示到视频中,这种当然和OSD一样也是有两种方式,一种是源头就贴......
  • canvas
    canvas前言Hello,大家好!我是Atrox......