ES6与canvas实现鼠标小球跟随效果

Stella981
• 阅读 500

               最近闲来无聊,看了下ES6的语法,结合canvas实现了动画特效——随着鼠标的移动,会有小球跟随且自动消失的动画。

首先,html部分,目前就一个canvas标签。

1 <canvas id="canvas">
2         当前浏览器不支持!
3 </canvas>

其次,css部分,没有考虑美观,大家喜欢的话,可以自己添加样式

1 <style>
2         body{
3             margin: 90px;
4         }
5         #canvas{
6             box-shadow: 0 0 5px;
7         }
8     </style>

最后,看下js实现部分

 1 <script>
 2     const canvas = document.getElementById("canvas");
 3     canvas.height = 600;
 4     canvas.width = 1000;
 5     canvas.style.backgroundColor = "#000";
 6     const ctx = canvas.getContext("2d");
 7 
 8     //小球类
 9     class Ball{
10         constructor(x, y, color){
11             this.x = x;
12             this.y = y;
13             this.color = color;
14             //小球半径默认40
15             this.r = 40;
16         }
17         //绘制小球
18         render(){
19             ctx.save();
20             ctx.beginPath();
21             ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);
22             ctx.fillStyle = this.color;
23             ctx.fill();
24             ctx.restore();
25         }
26     }
27     //移动小球
28     class MoveBall extends Ball{
29         constructor(x, y, color){
30             super(x, y, color);
31 
32             this.dX = Math.floor(Math.random()*5+1);
33             this.dY = Math.floor(Math.random()*5+1);
34             this.dR = Math.floor(Math.random()*5+1);
35         }
36 
37         upData(){
38             this.x += this.dX;
39             this.y += this.dY;
40             this.r -= this.dR;
41             if(this.r < 0){
42                 this.r = 0;
43             }
44         }
45     }
46 
47     let ballArry = [];
48     let colorArry = ['red', 'green', 'pink', 'yellow', 'blue'];
49 
50     canvas.addEventListener("mousemove",function(e){
51         ballArry.push(new MoveBall(e.offsetX, e.offsetY, colorArry[Math.floor(Math.random()*5)]));
52     })
53 
54     setInterval(function(){
55         ctx.clearRect(0, 0, canvas.width, canvas.height);
56 
57         for(let i=0;i<ballArry.length;i++){
58             ballArry[i].render();
59             ballArry[i].upData();
60         }
61     },50);
62     </script>

稍作解释下我的设计思路:

首先,获取canvas对象,获取上下文,设置一些基本的属性。(canvas不做过多描述,具体的可以去w3自己研究)。然后,先定义一个Ball的类,里面有小球的圆心坐标位置,以及半径和颜色。在定义一个画小球的方法,具体的画圆实现,不懂的可以去canvas文档自己去看。

在定义一个会变的小球类并继承Ball类。里面会有更新小球状态的方法,用来改变小球的半径以及颜色属相。

最后,开启一个定时器,当鼠标移动时,把生成的小球存储到数组中,然后遍历循环读取小球,并改变小球的样式,达到最终的效果。

最后附上完整代码。直接拷贝浏览器运行。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>会动的小球</title>
 6     <style>
 7         body{
 8             margin: 90px;
 9         }
10         #canvas{
11             box-shadow: 0 0 5px;
12         }
13     </style>
14 </head>
15 <body>
16     <canvas id="canvas">
17         当前浏览器不支持!
18     </canvas>
19     <script>
20     const canvas = document.getElementById("canvas");
21     canvas.height = 600;
22     canvas.width = 1000;
23     canvas.style.backgroundColor = "#000";
24     const ctx = canvas.getContext("2d");
25 
26     //小球类
27     class Ball{
28         constructor(x, y, color){
29             this.x = x;
30             this.y = y;
31             this.color = color;
32             //小球半径默认40
33             this.r = 40;
34         }
35         //绘制小球
36         render(){
37             ctx.save();
38             ctx.beginPath();
39             ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);
40             ctx.fillStyle = this.color;
41             ctx.fill();
42             ctx.restore();
43         }
44     }
45     //移动小球
46     class MoveBall extends Ball{
47         constructor(x, y, color){
48             super(x, y, color);
49 
50             this.dX = Math.floor(Math.random()*5+1);
51             this.dY = Math.floor(Math.random()*5+1);
52             this.dR = Math.floor(Math.random()*5+1);
53         }
54 
55         upData(){
56             this.x += this.dX;
57             this.y += this.dY;
58             this.r -= this.dR;
59             if(this.r < 0){
60                 this.r = 0;
61             }
62         }
63     }
64 
65     let ballArry = [];
66     let colorArry = ['red', 'green', 'pink', 'yellow', 'blue'];
67 
68     canvas.addEventListener("mousemove",function(e){
69         ballArry.push(new MoveBall(e.offsetX, e.offsetY,         colorArry[Math.floor(Math.random()*5)]));
70     })
71 
72     setInterval(function(){
73         ctx.clearRect(0, 0, canvas.width, canvas.height);
74 
75         for(let i=0;i<ballArry.length;i++){
76             ballArry[i].render();
77             ballArry[i].upData();
78         }
79     },50);
80     </script>
81 </body>
82 </html>
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Python进阶者 Python进阶者
2年前
手把手教你使用CanvasAPI打造一款拼图游戏
一、canvas简介1.canvas是HTML5提供的一种新标签,双标签;2.HTML5 canvas标签元素用于图形的绘制,通过脚本(通常是JavaScript)来完成;3.canvas标签只是图形容器,必须使用脚本来绘制图形;Canvas是一个矩形区域的画布,可以用JavaScript在上面绘画;二、案例目标我们今天的目标是使用HTML5
Python进阶者 Python进阶者
1年前
Canvas之鼠标滑动特效
大家好,我是皮皮。我们会看到很多网页的粒子特效;如上图所示,这些都是借助HTML新特性,使用新增标签Canvas得到的效果;那么我们来了解下canvas。什么是Canvas在MDN中是这样定义  的: 是HTML5新增的元素,可用于通过使用JavaScript中的脚本来绘制图形。例如,它可以用于绘制图形、制作照片、创建动画,甚至可以进行实时
Stella981 Stella981
2年前
Canvas绘制不规则图形,实现可拖动,编辑
目前的工作在做在线的标注工具,接触canvas一年了,各种绘制,基本上图像的交互canvas都可以完成,也写了几篇关于canvas的文章,遇到的问题也写博客上了,对于canvas有问题的朋友可以去看看。一直想写一个关于canvas系列的东西,也没时间。正好最近再捣鼓canvas,有时间就写一点,一个功能一个功能的写,争取写一个系列。以前都是绘制矩形,
Stella981 Stella981
2年前
CococsCreator 常用UI组件(Canvas、Widget、Button、Layout、EditBox、RichText、ScrollView)(第十三篇)
一、Canvas组件这个Canvas组件在前面篇章有讲过的。!在这里插入图片描述(https://oscimg.oschina.net/oscnet/up7e35da59f73f899db7689319ddd07379.png)属性说明DesignResolution设计分辨率(内容生产者在制作场景时使
Stella981 Stella981
2年前
H5中canvas和svg绘图方式介绍
在HTML5中包括了两种绘图方式,canvas和svg(矢量呈现),而与canvas不同的是,svg是一种XML标记语言,它既可以单独保存以“.svg”为后缀的文件在浏览器中打开显示,也支持建立svg标签直接嵌入在网页中显示,还可以通过<embedsrc"文件.svg"name"name自命"type"image/svgxml"height
Wesley13 Wesley13
2年前
Canvas 3D engine_HTML5动画引擎
!Canvas3Dengine_HTML5动画引擎(http://static.oschina.net/uploads/img/201403/22152537_1gkA.jpg)HTML5尚在发展当中,说替代Flash还言之过早,但它所实现的炫目功能大家也是有目共睹的,一个canvas可以做成如此效果,那我们为什么
Stella981 Stella981
2年前
HTML5 canvas标签详解
转载:<canvas\是html5当中的一个标签,通过Javascript来画图。<canvasid”canvas”width”150″height”150″</canvas<scriptvarcanvasdocument.getElementById(”canvas”);varctxc
Stella981 Stella981
2年前
HTML5 & CSS3 初学者指南(4) – Canvas使用
介绍传统的HTML主要用于文本的创建,可以通过<img标签插入图像,动画的实现则需要第三方插件。在这方面,传统的HTML极其缺乏满足现代网页多媒体需求的能力。HTML5的到来,带来了新的成员<canvas标签。什么是Canvas?HTML5的Canvas 元素使用JavaScript在网页上绘制图像。
Wesley13 Wesley13
2年前
Canvas笔画向量交互动画效果,随着鼠标描绘轨迹
!Canvas笔画向量交互动画效果,随着鼠标描绘轨迹(http://static.oschina.net/uploads/img/201403/22152543_6VxR.jpg)今天为大家介绍的是一个挺有趣的交互动画。用户可通过鼠标移动来复刻鼠标的轨迹。用户可长按鼠标左键,然后向某方向快速滑动,之前描绘出的路径会随着滑动的方向而进行旋转