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日

相关文章

  • Javascript Math tan() 方法

    JavaScript中的Math.SQRT2属性是一个常数,表示2的平方根。以下是关于Math.SQRT2属性的完整攻略,含两个示例。 JavaScript Math对象的SQRT2属性 JavaScript的SQRT2属性是一个常数,表示2的平方根。下面是SQRT2属性的语法: Math.SQRT2 下面是一个SQRT2属性的示例: console.log…

    JavaScript 2023年5月11日
    00
  • 一些你可能不熟悉的JS知识点总结

    一些你可能不熟悉的JS知识点总结 理解JS中的this指向 在 Javascript 中,“this”是一个关键字,它指向函数执行时的上下文对象。在全局作用域中,“this”指向全局对象(window / global),在函数内部,“this”指向函数调用时的“拥有者”(即调用该函数的对象)。更多的用法和示例请参考以下代码: let obj = { nam…

    JavaScript 2023年5月28日
    00
  • 解决JS请求服务器gbk文件乱码的问题

    当我们使用JavaScript从服务器请求文本数据时,可能会遇到文本编码不符合UTF-8(如GBK)的情况,导致在浏览器端显示出错了,我们需要对此进行处理。 1. 了解传统的字符编码方式 在 Web 开发初期,世界各地的计算机都有自己的字符编码规范,因此引起了字符编码混乱的情况。后来,Unicode 规范提出来,尝试解决全球字符集的问题,UTF-8 字符编码…

    JavaScript 2023年5月19日
    00
  • 微信小程序实现表单验证源码

    准备工作首先需要准备微信小程序开发环境,下载并安装微信web开发者工具。在微信开发者工具中新建一个小程序项目。 创建表单页面在微信开发者工具中,创建一个新的页面作为表单页面。可以使用 WXML 语言编写页面结构,使用 WXSS 语言编写页面样式。 表单验证使用 JavaScript 代码对表单进行验证。可以在表单提交时将数据传递给验证函数。 示例代码: //…

    JavaScript 2023年6月10日
    00
  • Javascript Math PI 属性

    JavaScript中的Math.PI属性是一个常数,表示圆周率π的值。以下是关于Math.PI属性的完整攻略,含两个示例。 Math对象的PI属性 JavaScript对象中的PI属性是一个常数,表示圆周率π的值。 下面是PI属性语法: Math.PI 下面是一个PI属性的示例: console.log(Math.PI); // 输出 3.14159265…

    JavaScript 2023年5月11日
    00
  • JavaScript中的eval()函数使用介绍

    下面是关于“JavaScript中的eval()函数使用介绍”的完整攻略。 什么是eval()函数 eval() 函数执行 JavaScript 代码,可以将字符串转换为可执行的代码。它接受一个参数,这个参数是一个字符串,可以是任何 JavaScript 代码,包括变量、函数、表达式、语句等。 eval()函数的使用方法 eval() 函数的语法如下: ev…

    JavaScript 2023年5月27日
    00
  • 详解如何在vue项目中使用eslint+prettier格式化代码

    以下是在Vue项目中使用ESLint和Prettier的完整攻略: 安装和配置ESLint 安装ESLint 在终端中进入项目文件夹,并运行以下命令安装ESLint: npm i eslint –save-dev 创建ESLint配置文件 继续在项目文件夹中运行以下命令,创建名为.eslintrc.js的ESLint配置文件: npx eslint –i…

    JavaScript 2023年6月10日
    00
  • JS闭包原理及其使用场景解析

    JS闭包原理及其使用场景解析 什么是闭包? 闭包(Closure)指的是有权访问另外一个函数作用域内变量的函数。 用更通俗易懂的话来说,闭包就是函数内部定义的函数,它可以访问自己的变量,还可以访问父级函数的变量。 闭包的原理 在JavaScript中,如果两个函数嵌套的话,内部函数就可以访问外部函数的变量。这是因为在JavaScript中函数会形成一个作用域…

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