1.思路分析

  • 监听页面尺寸变化(防抖),动态设置canvas大小
  • 监听鼠标移动事件(节流),动态创建小球,小球包含大小,原点坐标,移动方向等信息,其内部方法支持移动和缩小
  • 开启定时器,更新画布内容(清屏后根据数据重新渲染)

2.主函数

  • 事件监听以及全局变量设定
  • 开启循环定时器实时渲染,过滤无效小球(尺寸小于0)
<script>
//存储小球的数组
var balls = []
//定时器
var timer = null //监听加载
window.onload = function(){
//宽高初始化
setCanvasSize() //开启定时器渲染
timer = setInterval(()=>{
//遍历小球,使其动起来
balls.forEach(ball=>{
//更新小球信息
ball.update()
})
//移除无效的小球(体积小于0就移除)
balls = balls.filter(ball=>{
return ball.size > 0
}) //如果小球已经没有,则移除循环定时器
// if(balls.length == 0){
// clearInterval(timer)
// } //根据数据渲染小球
renderCanvas(balls)
},30)
}
//监听页面尺寸变化(防抖)
window.addEventListener('resize', debounce(setCanvasSize,200))
//监听鼠标移动(节流),创建小球
var canvas = document.querySelector('canvas')
canvas.addEventListener('mousemove', throttle(createBall,20)) //设定画布大小
function setCanvasSize(){
//获取canvas元素
var canvas = document.querySelector('canvas')
//设定宽高(全屏,保证根标签高度是100%)
canvas.setAttribute('width',document.documentElement.clientWidth)
canvas.setAttribute('height',document.documentElement.clientHeight)
} //防抖函数
function debounce(fn, wait) {
//默认情况下 没有延时定时器
var timeout = null
//定义内部函数并返回,形成闭包,缓存 timeout
return function() {
//获取函数调用时的上下文
var context = this
//获取参数(事件对象)
var event = arguments[0] //如果已经存在延时定时器 则尝试清除
if(timeout !== null) {
clearTimeout(timeout)
}
//开启新的延时计时器
timeout = setTimeout(fn.bind(context,event), wait)
}
} //节流函数
function throttle(cb,delay){
//记录上次回调执行时的时间戳
var prev = 0
//定义内部函数并返回,形成闭包,缓存prev
return function(){
//获取函数调用时的上下文
var context = this
//获取参数(事件对象)
var event = arguments[0]
//对比时间差 超过时间间隔则执行回调
if(Date.now() - prev >= delay){
//执行回调(绑定this,传递参数)
cb && cb.call(context,event)
//更新prev
prev = Date.now()
}
} }
</script>

3.创建动感小球的类

  • 使用构造函数创建小球,包括其初始大小,坐标,颜色
  • 为其定义更新方法(大小变化,位置移动)
<script>
//创建小球
function createBall(e){
//小球尺寸
var size = 50
//小球原点坐标
var x = e.offsetX
var y = e.offsetY
//创建小球
var ball = new DynamicBall(size,x,y)
//将小球添加到数组(待渲染)
balls.push(ball)
}
//小球构造函数(自动移动和缩小)
class DynamicBall{
//构造器
constructor(size = 50,x = 0,y = 0){
//初始化
this.init(size,x,y)
} //初始化
init(size,x,y){
//保存坐标与大小信息
this.size = size
this.x = x
this.y = y
//颜色
this.color = this.getRandomColor()
//移动角度
this.move_deg = Math.random() * Math.PI * 2
//每次移动距离
//this.distanca = 2
//this.distanca_x = this.distanca * Math.cos(this.move_deg)
//this.distanca_y = this.distanca * Math.sin(this.move_deg)
} //获取随机颜色
getRandomColor() {
var r = Math.round(Math.random() * 255)
var g = Math.round(Math.random() * 255)
var b = Math.round(Math.random() * 255)
return 'rgb(' + r + ',' + g + ',' + b + ')'
} //小球更新(大小和位置)
update(scale = 1,distanca = 2){
//更新大小
this.size -= Number(scale)
//更新位置
this.x += (distanca * Math.cos(this.move_deg))
this.y += (distanca * Math.sin(this.move_deg))
}
}
</script>

4.根据数据渲染小球

  • 渲染前清屏
  • 根据小球的尺寸,坐标进行渲染
<script>
function renderCanvas(balls){
//获取canvas元素
var canvas = document.querySelector('canvas')
//获取画笔
var ctx = canvas.getContext('2d')
//清屏
ctx.clearRect(0,0,canvas.width,canvas.height)
//遍历小球数据进行渲染
balls.forEach(ball=>{
//开启新路径
ctx.beginPath()
//绘制圆弧
ctx.arc(ball.x,ball.y,ball.size,0,Math.PI*2)
//设置填充颜色
ctx.fillStyle = ball.color
//填充
ctx.fill()
})
}
</script>

5.效果展示

canvas实例:绚丽小球的更多相关文章

  1. 超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等

    超多经典 canvas 实例 普及:<canvas> 元素用于在网页上绘制图形.这是一个图形容器,您可以控制其每一像素,必须使用脚本来绘制图形. 注意:IE 8 以及更早的版本不支持 &l ...

  2. (canvas)两小球碰撞后的速度问题研究

    这两天在研究canvas碰撞 先把小球开始运动的图拿出来 参考了一下别的的代码,在两个小球碰撞处理上,我觉得不完善 怎么样处理才算完善呢,当然是要用高中物理学的动量守恒了和机械能守恒了 机械能守恒我其 ...

  3. 第七讲:HTML5中的canvas两个小球全然弹性碰撞

    <html> <head> <title>小球之间的碰撞(全然弹性碰撞)</title> <script src="../js/jsce ...

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

    最近闲来无聊,看了下ES6的语法,结合canvas实现了动画特效--随着鼠标的移动,会有小球跟随且自动消失的动画. 首先,html部分,目前就一个canvas标签. <canvas id=&qu ...

  5. canvas学习之小球动画

    项目地址:http://pan.baidu.com/s/1skZGPgL 最近学习使用canvas做动画效果,主要原理就是创建一个小球对象,然后小球对象有一个moveball方法,每次让小球沿着随机路 ...

  6. js+canvas(H5)实现小球移动小demo

    *canvas提供画布,大小自定义,js得到画布,从画布对象通过getContext('2d')来得到画笔,然后就可以开始画了 代码: <!DOCTYPE html> <html l ...

  7. canvas实例 ---- 制作简易迷宫(一)

    这个系列分为两部分,第一部分为迷宫的生成及操作,第二部分为自动寻路算法. 我们先看效果: See the Pen QGKBjm by fanyipin (@fanyipin) on CodePen. ...

  8. Canvas实例

    <!doctype html> <html> <head> <meta charset="utf-8" /> <title&g ...

  9. canvas之----浮动小球

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. canvas绘制弹跳小球

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

随机推荐

  1. CSS – min(), max(), clamp()

    介绍 它们类似 calc(). 用来通过 formula 输出一个值. 用于 font-size, width, height 之类的, 这些地方. 非常适合用来做 RWD 哦 (特别是 font-s ...

  2. Nuxt Kit 中的布局管理

    title: Nuxt Kit 中的布局管理 date: 2024/9/18 updated: 2024/9/18 author: cmdragon excerpt: 摘要:本文详述了在Nuxt.js ...

  3. Spring —— 注解开发(总结)

    XML配置与注解配置对比   

  4. 信创环境经典版SuperMap iManager监控外部SuperMap iServer资源失败,无法监控目标GIS服务器CPU与内存使用情况

    一.问题环境 操作系统:银河麒麟kylin V10 CPU:鲲鹏920 SuperMap iServer 10.2.0 SuperMap iManager 10.2.1 二.现象 部署完经典版Supe ...

  5. SpringBoot 集成 LDAP

    LDAP协议具体是什么可以自行查看,简单来说就是单点登录的一种实现方式 LDAP只是一种协议,实现的有 openLDAP ,Microsoft active directory 等 openLDAP部 ...

  6. Trace32 simulator调试以及简单实用命令介绍

    目录 Trace32 Simulator debug Trace32工具配置 Trace32命令简介 memory class 常见命令索引 v.v使用实例 不同CPU运行信息查看 Trace32 S ...

  7. 利用3Dnii标签文件,生成png图片

    为了便于直观的看到2D标签,通常会将其转化为png图像,具体代码如下: # coding:utf-8 from glob import glob import os import SimpleITK ...

  8. element的图片上传预处理函数

    /** 图片格式和大小的控制 */ beforeAvatarUpload (file) { // 允许上传 jpg 和 png 格式的图片 const isJPG = file.type === &q ...

  9. .NET使用Graphql的演示

    Graphql是什么?先来一段AI给的回答: GraphQL是一种为API设计的查询语言,与REST相比,它提供了更高效.强大和灵活的方法来与数据交互.GraphQL由Facebook于2012年开发 ...

  10. Machine Learning Week_1 Introduction 5-8

    目录 1.5 Vedio: Supervised Learning unfamiliar words 1.6 Reading: Supervised Learning unfamiliar words ...