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>
阅读剩余 73%

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

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

相关文章

  • JavaScript获取当前时间向前推三个月的方法示例

    获取当前时间向前推三个月可以使用JavaScript中的Date对象和相关方法来实现。下面是具体的攻略: 获取当前时间 使用JavaScript中的Date对象可以获取当前的时间。代码如下: var currentTime = new Date(); console.log(currentTime); 输出结果如下: Sun Jul 11 2021 15:4…

    JavaScript 2023年5月27日
    00
  • js实现各种复制到剪贴板的方法(分享)

    下面是js实现各种复制到剪贴板的方法的攻略: 一、前置知识 为了实现复制到剪贴板的功能,必须要掌握以下前置知识: Clipboard API:一种新的Web API,提供了操作剪贴板的标准接口,并且被主流浏览器所支持。 execCommand()方法:一种旧的Web API,已经被废弃,但是在Clipboard API出现之前是实现复制到剪贴板的常用方法。 …

    JavaScript 2023年6月11日
    00
  • JS字典Dictionary类定义与用法示例

    JS字典Dictionary类是一种以键和值的形式存储数据的集合。在JS中,我们可以使用对象字面量或者Map来创建字典,但是使用Dictionary类可以更好地利用类的特性,对字典进行更加灵活的操作。 定义Dictionary类 我们先来看一下如何定义JS字典Dictionary类。 class Dictionary { constructor() { th…

    JavaScript 2023年5月28日
    00
  • 由 JavaScript 的 with 引发的探索

    标题:由 JavaScript 的 with 引发的探索 背景 JavaScript 中的 with 关键字让你可以在代码中使用更简洁的语法来访问一个对象的属性。然而,使用 with 带来的优雅语法留下的是性能问题。本文将介绍如何使用 JavaScript 的基本概念和语法,避免 with 带来的问题。 问题 使用 with 增加了用于作用域查找的代码,导致…

    JavaScript 2023年6月11日
    00
  • js HTML5上传示例代码完整版

    关于“js HTML5上传示例代码完整版”的完整攻略,以下是我整理的内容: 一、前言 在讲如何使用“js HTML5上传示例代码完整版”之前,我们先来了解一下什么是HTML5文件上传。HTML5文件上传是一种现代化、快速、可靠的文件上传方式,与之前的Flash上传相比具有更高效的上传速度和更高的可靠性。 二、主要步骤 使用“js HTML5上传示例代码完整版…

    JavaScript 2023年6月10日
    00
  • Javascript核心读书有感之语言核心

    请允许我对Javascript核心读书有感之语言核心进行详细讲解。在这份攻略中,我将为大家介绍Javascript语言核心的主要知识点,帮助读者更好的掌握该语言。 为什么要学习Javascript语言核心? Javascript是一种非常流行的脚本语言,广泛应用于Web开发、移动端开发和桌面应用程序开发等领域。对于想要从事前端开发、全栈开发、移动端开发等方向…

    JavaScript 2023年6月10日
    00
  • javascript异步编程的六种方式总结

    JavaScript异步编程的六种方式总结 随着现代Web应用程序变得越来越复杂,异步编程成为了必不可少的开发模式。在JavaScript中,我们可以通过多种方式来实现异步编程。本文将介绍JavaScript中的六种常见方式来处理异步编程。 1. 回调函数 回调函数是这六种方式中应用最广泛的一种方式。回调函数是将一个函数作为参数传递给另一个函数,在异步操作完…

    JavaScript 2023年5月27日
    00
  • javascript 在firebug调试时用console.log的方法

    下面是详细讲解 JavaScript 在 Firebug 调试时用 console.log 的方法的攻略: 1.安装 Firebug 要使用 Firebug 进行 JavaScript 调试,首先需要安装 Firebug 插件,可以在 Firefox 插件商店中搜索并安装即可。 2.启用 Firebug 安装完成后,在 Firefox 中按下 F12 键或者…

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