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中splice()的强大(插入、删除或替换数组的元素)

    下面详细讲解一下“体验js中splice()的强大(插入、删除或替换数组的元素)”的攻略: 1. 什么是splice() splice()是JavaScript中的一个数组方法,可以在数组中插入、删除或替换元素。它有三个参数,分别是: start:操作开始的索引位置; deleteCount:要删除的元素个数; items:要插入到数组中的元素。 其中,st…

    JavaScript 2023年5月27日
    00
  • android WebView加载html5介绍

    下面我将为您详细讲解android WebView加载html5的攻略。 简介 WebView是Android提供的一个用于显示网页的控件,其底层使用的是Chrome浏览器内核,因此支持HTML5技术。HTML5是一种用于Web开发的标准,增加了很多新的功能,如音视频播放、Canvas绘图、自适应布局等。本文将介绍如何使用WebView来加载HTML5页面。…

    JavaScript 2023年6月11日
    00
  • JavaScript中本地存储(LocalStorage)和会话存储(SessionStorage)的使用

    当涉及到JavaScript中本地存储(LocalStorage)和会话存储(SessionStorage)时,我们需要首先了解这两种存储方式的概念和用途。 本地存储(LocalStorage)和会话存储(SessionStorage) 本地存储(LocalStorage)和会话存储(SessionStorage)都是HTML5中Web StorageAPI…

    JavaScript 2023年6月11日
    00
  • 关于JS控制代码暂停的实现方法分享

    请听我仔细讲解。 关于JS控制代码暂停的实现方法分享 在JS编写过程中,有时需要控制代码的暂停,可以通过以下几种方法实现。 1. setTimeout setTimeout 方法可以在指定延时后执行一个函数,可以通过在该函数中添加代码暂停的逻辑来控制代码的暂停。 示例代码: function pauseAfter3s() { console.log(‘开始执…

    JavaScript 2023年6月10日
    00
  • 原生js操作checkbox用document.getElementById实现

    原生JS操作checkbox用document.getElementById实现的步骤如下: 1.在HTML页面中添加checkbox元素: <input type="checkbox" id="myCheckbox">My Checkbox</input> 2.在JS文件中使用document…

    JavaScript 2023年6月10日
    00
  • JS实现一个简单的日历

    下面是JS实现一个简单的日历的完整攻略。 步骤一:在HTML中添加日历的框架 我们先在HTML文件中添加一个日历的框架,可以采用表格的形式来呈现日历。以下是示例代码: <table> <thead> <tr> <th colspan="7"><span id="year&qu…

    JavaScript 2023年5月27日
    00
  • JavaScript易错知识点整理

    JavaScript易错知识点整理 本文将整理出JavaScript中经常易错的知识点,包括但不限于变量作用域、数据类型、语法注意点等。通过阅读本文,你将能够更加熟练地使用JavaScript。 变量作用域 var声明变量的作用域 在JavaScript中,使用var声明的变量,其作用域为函数级作用域。这意味着在函数内部声明的变量,在函数外部是无法访问的。但…

    JavaScript 2023年5月18日
    00
  • python迭代器与生成器详解

    Python迭代器与生成器详解 本文将介绍Python中的迭代器和生成器的基础知识、定义方法、实现方式、常见用法以及注意事项等方面内容。 什么是迭代器? 迭代器是Python中一种数据访问方式。迭代器是一个可以记住遍历位置的对象,迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完毕。迭代器只能往前遍历,不能后退。 Python的迭代器有两个基本的方法…

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