javascript利用canvas实现鼠标拖拽功能

下面是关于“javascript利用canvas实现鼠标拖拽功能”的完整攻略:

什么是canvas?

Canvas是HTML5中的一个新特性,是一个可以用脚本(通常为JavaScript)在其中绘制图形的HTML元素。Canvas有两种绘制路径:一种是通过命令式的JavaScript进行绘图;另外一次是通过使用矢量图形编辑器生成并导入路径。

实现鼠标拖拽的步骤

第一步:创建画布和要绘制的图形

为了在画布上实现鼠标拖拽的功能,我们需要先创建一个画布,然后在其上绘制需要被拖拽的图形。这里以绘制一个矩形为例,代码如下:

<canvas id="myCanvas" width="500" height="500"></canvas>
let canvas = document.querySelector('#myCanvas');
let ctx = canvas.getContext('2d');

ctx.fillStyle = '#ff0000';
ctx.fillRect(100, 100, 50, 50);

第二步:监听鼠标事件

在画布上监听鼠标事件,当鼠标按下时记录下鼠标的坐标,当鼠标移动时根据移动距离改变图形的位置,当鼠标松开时停止拖拽。示例代码如下:

let isDragging = false;
let offset = {x: 0, y: 0};
let rect = {x: 100, y: 100, w: 50, h: 50};

canvas.addEventListener('mousedown', function(e) {
  let rectLeft = canvas.offsetLeft;
  let rectTop = canvas.offsetTop;
  let mouseX = e.pageX - rectLeft;
  let mouseY = e.pageY - rectTop;

  if(mouseX >= rect.x && mouseX <= rect.x + rect.w && mouseY >= rect.y && mouseY <= rect.y + rect.h) {
    isDragging = true;
    offset.x = mouseX - rect.x;
    offset.y = mouseY - rect.y;
  }
});

canvas.addEventListener('mousemove', function(e) {
  if(isDragging) {
    let rectLeft = canvas.offsetLeft;
    let rectTop = canvas.offsetTop;
    let mouseX = e.pageX - rectLeft;
    let mouseY = e.pageY - rectTop;
    rect.x = mouseX - offset.x;
    rect.y = mouseY - offset.y;

    draw();
  }
});

canvas.addEventListener('mouseup', function(e) {
  isDragging = false;
});

第三步:重绘图形

当图形的位置发生改变时,需要立即重新绘制图形。示例代码如下:

function draw() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillStyle = '#ff0000';
  ctx.fillRect(rect.x, rect.y, rect.w, rect.h);
}

示例

以下是两个示例,一个是鼠标拖拽矩形,另一个是鼠标拖拽图片:

示例1:鼠标拖拽矩形

<canvas id="myCanvas1" width="500" height="500"></canvas>
<script>
let canvas = document.querySelector('#myCanvas1');
let ctx = canvas.getContext('2d');

let isDragging = false;
let offset = {x: 0, y: 0};
let rect = {x: 100, y: 100, w: 50, h: 50};

canvas.addEventListener('mousedown', function(e) {
  let rectLeft = canvas.offsetLeft;
  let rectTop = canvas.offsetTop;
  let mouseX = e.pageX - rectLeft;
  let mouseY = e.pageY - rectTop;

  if(mouseX >= rect.x && mouseX <= rect.x + rect.w && mouseY >= rect.y && mouseY <= rect.y + rect.h) {
    isDragging = true;
    offset.x = mouseX - rect.x;
    offset.y = mouseY - rect.y;
  }
});

canvas.addEventListener('mousemove', function(e) {
  if(isDragging) {
    let rectLeft = canvas.offsetLeft;
    let rectTop = canvas.offsetTop;
    let mouseX = e.pageX - rectLeft;
    let mouseY = e.pageY - rectTop;
    rect.x = mouseX - offset.x;
    rect.y = mouseY - offset.y;

    draw();
  }
});

canvas.addEventListener('mouseup', function(e) {
  isDragging = false;
});

function draw() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillStyle = '#ff0000';
  ctx.fillRect(rect.x, rect.y, rect.w, rect.h);
}
</script>

示例2:鼠标拖拽图片

<canvas id="myCanvas2" width="500" height="500"></canvas>
<script>
let canvas = document.querySelector('#myCanvas2');
let ctx = canvas.getContext('2d');

let isDragging = false;
let offset = {x: 0, y: 0};
let img;

img = new Image();
img.src = 'https://picsum.photos/200/300';

img.onload = function() {
  ctx.drawImage(img, 100, 100);
};

canvas.addEventListener('mousedown', function(e) {
  let rectLeft = canvas.offsetLeft;
  let rectTop = canvas.offsetTop;
  let mouseX = e.pageX - rectLeft;
  let mouseY = e.pageY - rectTop;

  if(mouseX >= 100 && mouseX <= 100 + img.width && mouseY >= 100 && mouseY <= 100 + img.height) {
    isDragging = true;
    offset.x = mouseX - 100;
    offset.y = mouseY - 100;
  }
});

canvas.addEventListener('mousemove', function(e) {
  if(isDragging) {
    let rectLeft = canvas.offsetLeft;
    let rectTop = canvas.offsetTop;
    let mouseX = e.pageX - rectLeft;
    let mouseY = e.pageY - rectTop;
    ctx.clearRect(0, 0, 500, 500);
    ctx.drawImage(img, mouseX - offset.x, mouseY - offset.y);
  }
});

canvas.addEventListener('mouseup', function(e) {
  isDragging = false;
});

</script>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript利用canvas实现鼠标拖拽功能 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JS中apply()的应用实例分析

    JS中apply()的应用实例分析 什么是apply()? JS中的apply()是Function对象自带的一个方法,它的作用是调用函数并将对象作为第一个参数进行传递,第二个参数是一个包含传递给函数的参数的数组。 语法:function.apply(thisArg, [argsArray]) thisArg:在函数中某个对象将被用作“this”对象。 ar…

    JavaScript 2023年5月28日
    00
  • JS实现的在线调色板实例(附demo源码下载)

    JS实现的在线调色板实例 本篇文章将向您展示如何使用JavaScript创建一个在线调色板实例。本项目使用HTML、CSS和JS,允许用户通过单击颜色选取器调整颜色,然后显示所选颜色的值。 项目代码 请先下载示例代码,然后跟随我们的指导进行实现:在线调色板实例源代码 实现过程 从Github仓库中下载示例代码。 用您最喜欢的编辑器打开index.html文件…

    JavaScript 2023年6月10日
    00
  • 使用BootStrapValidator完成前端输入验证

    使用 BootStrapValidator 完成前端输入验证的完整攻略如下: 步骤一:引入 BootStrap 和 BootStrapValidator 库 首先,需要引入 BootStrap 和 BootStrapValidator 两个库: <!– BootStrap CSS文件 –> <link rel="stylesh…

    JavaScript 2023年6月10日
    00
  • javascript substr和substring用法比较

    JavaScript 中的 substr() 和 substring() 都用于从字符串中提取子字符串。它们之间的区别在于如何指定提取子字符串的开始位置和结束位置。 substr() 方法 substr() 方法接受两个参数,第一个参数是开始提取子字符串的位置,第二个参数是提取子字符串的长度。例如: let str = "hello world&q…

    JavaScript 2023年5月28日
    00
  • 5种方法告诉你如何使JavaScript 代码库更干净

    5种方法告诉你如何使JavaScript 代码库更干净 在开发 JavaScript 代码时,保持代码库干净是非常重要的。这可以提高代码的可读性和可维护性,使代码更易于维护。下面是几种方法可以帮助你保持 JavaScript 代码库的干净。 1. 使用严格模式 JavaScript 的 “use strict” 指令可以让代码在严格模式下执行。这种模式可以避…

    JavaScript 2023年6月11日
    00
  • js将json格式的对象拼接成复杂的url参数方法

    当我们需要向服务器发送一个API请求时,通常会将参数拼接在URL的末尾,这些参数可能来自于用户输入、配置文件、API返回的数据等。而如果参数很多或者有多层嵌套结构,手动拼接URL会变得非常麻烦。这时候,可以使用JavaScript将JSON格式的对象拼接成复杂的URL参数字符串。 方法一:手写递归函数 以下是手写递归函数的示例代码: function bui…

    JavaScript 2023年5月27日
    00
  • JavaScript工具库MyTools详解

    JavaScript工具库MyTools详解 什么是MyTools MyTools是一个JavaScript工具库,提供了常见的JavaScript操作方法,使得开发者在开发过程中能够快速、便捷地实现一些功能,提高开发效率。 如何使用MyTools 使用MyTools需要在项目中引入MyTools的js文件。 以下是一个使用的例子: <script t…

    JavaScript 2023年6月10日
    00
  • Javascript基础知识(三)BOM,DOM总结

    Javascript基础知识(三)BOM,DOM总结 BOM(浏览器对象模型) 浏览器对象模型(BOM)提供了一组与浏览器窗口有关的对象,有助于操作浏览器窗口和屏幕显示。BOM是由浏览器厂商自行定义的,因此不属于W3C标准。 BOM的核心对象是window对象,表示浏览器窗口和页面。window对象还可以通过自身属性和方法来操作浏览器窗口、页面、框架、历史记…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部