JS前端使用canvas实现物体的点选示例

下面是“JS前端使用canvas实现物体的点选示例”的完整攻略:

简介

本攻略旨在帮助JS前端开发者使用canvas实现物体的点选功能。点选,即用户点击鼠标后能够判断该处是否落在某个物体上,从而实现交互操作。

准备

在开始编写代码前,需要准备以下工具和材料:
- 编辑器:Visual Studio Code、Sublime Text、Atom等
- 浏览器:Chrome、Safari、Firefox等(建议使用Chrome)
- canvas画板:可以通过HTML中的<canvas>标签创建
- JavaScript库:本攻略使用了jQuery库,也可以使用其他库或不使用库。
- 图形资源:本攻略使用了一个矩形和一个圆形

实现步骤

  1. 创建和初始化canvas画板
    ```html


    通过document.getElementById获取canvas元素,再通过getContext```获取2D画布上下文。

  2. 在画板上绘制图形
    ```js
    context.fillStyle = "#00A0FF";
    context.fillRect(100, 100, 100, 100);

    context.fillStyle = "#FFA500";
    context.beginPath();
    context.arc(300, 300, 50, 0, Math.PI * 2);
    context.fill();
    ```
    这里绘制了一个蓝色的矩形和一个橙色的圆形,具体坐标和半径等可以自行设置。

  3. 监听鼠标点击事件
    js
    $("#canvas").click(function(e) {
    let x = e.pageX - this.offsetLeft;
    let y = e.pageY - this.offsetTop;
    console.log(x, y);
    });

    在canvas上注册鼠标点击事件,通过e.pageXe.pageY获取鼠标点击处相对于画板左上角的横纵坐标。

  4. 判断点击位置是否在图形内
    ```js
    let rectX = 100, rectY = 100, rectW = 100, rectH = 100;
    let radius = 50, centerX = 300, centerY = 300;

    $("#canvas").click(function(e) {
    let x = e.pageX - this.offsetLeft;
    let y = e.pageY - this.offsetTop;

    if (x >= rectX && x <= rectX + rectW && y >= rectY && y <= rectY + rectH) {
    console.log("点击了矩形");
    } else if ((x - centerX) * (x - centerX) + (y - centerY) * (y - centerY) <= radius * radius) {
    console.log("点击了圆形");
    } else {
    console.log("未点击任何图形");
    }
    });
    ```
    通过比较鼠标点击位置和图形位置、大小,判断点击位置是否在图形内。以上代码展示了判断矩形和圆形,其他图形判断方式类似。

示例说明

示例一:小球消失

在这个示例中,我们将在html页面上绘制一个小球,每次点击小球,小球就会消失。

首先,需要在html中创建画板和小球:

<canvas id="canvas" width="500" height="500"></canvas>

<script>
  let canvas = document.getElementById("canvas");
  let context = canvas.getContext("2d");

  let ballX = 100, ballY = 100, ballR = 50;

  context.beginPath();
  context.arc(ballX, ballY, ballR, 0, Math.PI * 2);
  context.fillStyle = "#FFA500";
  context.fill();
</script>

绑定鼠标点击事件,并在事件处理函数中判断点击位置是否在小球内,若在,则清空画板,否则不做任何处理。

$("#canvas").click(function(e) {
  let x = e.pageX - this.offsetLeft;
  let y = e.pageY - this.offsetTop;

  let distance = Math.sqrt((x - ballX) * (x - ballX) + (y - ballY) * (y - ballY));
  if (distance <= ballR) {
    context.clearRect(0, 0, canvas.width, canvas.height);
  }
});

这里通过勾股定理计算鼠标点击位置与小球圆心的距离,若小于等于小球半径,则表示点击在小球内。

示例二:物体跟随鼠标移动

在这个示例中,我们将在html页面上绘制一个矩形和一个圆形,使得物体可以跟随鼠标移动。

首先,需要在html中创建画板和矩形、圆形:

<canvas id="canvas" width="500" height="500"></canvas>

<script>
  let canvas = document.getElementById("canvas");
  let context = canvas.getContext("2d");

  let rectX = 100, rectY = 100, rectW = 100, rectH = 100;
  let radius = 50, centerX = 300, centerY = 300;

  context.fillStyle = "#00A0FF";
  context.fillRect(rectX, rectY, rectW, rectH);

  context.fillStyle = "#FFA500";
  context.beginPath();
  context.arc(centerX, centerY, radius, 0, Math.PI * 2);
  context.fill();
</script>

绑定鼠标移动事件,并在事件处理函数中获取鼠标位置,并通过requestAnimationFrame不断地重绘图形。

let rectLeft, rectTop, circleLeft, circleTop;

$("#canvas").mousemove(function(e) {
  rectLeft = e.pageX - this.offsetLeft - rectW / 2;
  rectTop = e.pageY - this.offsetTop - rectH / 2;
  circleLeft = e.pageX - this.offsetLeft - radius;
  circleTop = e.pageY - this.offsetTop - radius;

  animate();
});

function animate() {
  context.clearRect(0, 0, canvas.width, canvas.height);
  context.fillStyle = "#00A0FF";
  context.fillRect(rectLeft, rectTop, rectW, rectH);

  context.fillStyle = "#FFA500";
  context.beginPath();
  context.arc(circleLeft, circleTop, radius, 0, Math.PI * 2);
  context.fill();

  requestAnimationFrame(animate);
}

这里通过减去图形的一半尺寸,将图形的中心点(即矩形的左上角和圆形的圆心)与鼠标位置对齐。并通过不断地重绘来实现跟随移动。注意需要清空画板,否则图形会留下痕迹。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS前端使用canvas实现物体的点选示例 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • jQuery Attributes(属性)的使用(二、类篇)

    接下来我会详细讲解一下jQuery中Attributes(属性)的使用,特别是二、类篇。 1.使用addClass()方法添加类 jQuery提供了addClass()方法,可以在元素上添加指定的类名。其语法如下: $(selector).addClass(classname); 其中,selector表示需要添加类名的元素选择器,而classname则表示…

    JavaScript 2023年6月10日
    00
  • 关于JavaScript中var声明变量作用域的推断

    首先,需要了解一些JavaScript中变量作用域的相关知识。 在JavaScript中,变量的作用域有全局作用域和局部作用域两种。 在全局作用域中声明的变量可以被程序中任意位置访问,而在局部作用域中声明的变量仅可以在声明该变量的函数内及函数内部任意嵌套的其他函数内访问。 在ES5之前,JavaScript中只有函数作用域,因此无法使用块级作用域。即使在if…

    JavaScript 2023年6月10日
    00
  • js取消单选按钮选中示例代码

    接下来我将详细讲解“js取消单选按钮选中”的完整攻略。首先需要了解一些基础知识。 在HTML中,单选按钮可以用input元素的type属性为radio来定义。当同一组单选按钮中有多个被选中时,只有最后被选中的那个有效。 如果我们想取消单选按钮的选中状态,可以使用JavaScript编写代码操作DOM。 下面是一个示例代码,用于取消id为myRadio的单选按…

    JavaScript 2023年6月11日
    00
  • JavaScript检查子字符串是否在字符串中的方法

    当需要判断一个字符串是否包含某个子字符串时,我们可以使用JavaScript中提供的字符串方法来实现。以下是常用的三种方法: 方法一:indexOf() indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。如果要检查的子字符串在主字符串中不存在,那么该方法会返回 -1。 例如:我们要检查字符串 “hello world” 是否包含 “w…

    JavaScript 2023年5月28日
    00
  • js实现的在线调色板功能完整实例

    下面是“JS实现的在线调色板功能完整实例”的完整攻略: 1. 调色板功能介绍 调色板是一种图形界面控件,常用于用户界面设计中。它提供了一组可供选择的颜色,用户可以通过调整滑块或者输入数值等方式选择颜色。而JavaScript可以通过一些特定的API来实现这样的调色板功能。 2. HTML结构与CSS样式 为了实现调色板功能,首先需要构建一个HTML页面,然后…

    JavaScript 2023年6月10日
    00
  • JS判断两个对象内容是否相等的方法示例

    下面我将详细讲解如何判断两个JavaScript对象的内容是否相等。 1.场景分析 在开发过程中,经常需要判断两个对象的内容是否相等。例如,在使用Vue等MVVM框架时,需要比较当前数据和原始数据是否相等,以便判断是否需要提交更改。此时,判断两个对象内容是否相等就很有必要了。 2.方法一:JSON序列化 一种常用的判断两个对象内容是否相等的方法是使用JSON…

    JavaScript 2023年5月27日
    00
  • webpack 如何解析代码模块路径的实现

    Webpack 是一个模块化打包工具,可以将源代码打包成网页所需的静态资产。其中,模块管理是其最重要的功能之一。在 Webpack 打包过程中,它需要解析模块之间的依赖关系,并将它们转换为能够运行的代码块。本文将详细介绍 Webpack 如何解析代码模块路径的实现。 Webpack 模块解析 在 Webpack 中,模块的解析使用 resolve 属性来配置…

    JavaScript 2023年6月11日
    00
  • JavaScript字符串插入、删除、替换函数使用示例

    关于JavaScript字符串插入、删除和替换函数的使用,以下是完整攻略: 字符串插入 在字符串中插入新的字符或文本是一个常见的需求。在JavaScript中实现这个功能有多种方法,其中最简单的方法是使用字符串的concat()函数。 concat()函数可以将字符串连接到另一个字符串上。例如,我们可以将“Goodman”插入到“hello”字符串之后。示例…

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