canvas实例:绚丽小球
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实例:绚丽小球的更多相关文章
- 超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等
超多经典 canvas 实例 普及:<canvas> 元素用于在网页上绘制图形.这是一个图形容器,您可以控制其每一像素,必须使用脚本来绘制图形. 注意:IE 8 以及更早的版本不支持 &l ...
- (canvas)两小球碰撞后的速度问题研究
这两天在研究canvas碰撞 先把小球开始运动的图拿出来 参考了一下别的的代码,在两个小球碰撞处理上,我觉得不完善 怎么样处理才算完善呢,当然是要用高中物理学的动量守恒了和机械能守恒了 机械能守恒我其 ...
- 第七讲:HTML5中的canvas两个小球全然弹性碰撞
<html> <head> <title>小球之间的碰撞(全然弹性碰撞)</title> <script src="../js/jsce ...
- ES6与canvas实现鼠标小球跟随效果
最近闲来无聊,看了下ES6的语法,结合canvas实现了动画特效--随着鼠标的移动,会有小球跟随且自动消失的动画. 首先,html部分,目前就一个canvas标签. <canvas id=&qu ...
- canvas学习之小球动画
项目地址:http://pan.baidu.com/s/1skZGPgL 最近学习使用canvas做动画效果,主要原理就是创建一个小球对象,然后小球对象有一个moveball方法,每次让小球沿着随机路 ...
- js+canvas(H5)实现小球移动小demo
*canvas提供画布,大小自定义,js得到画布,从画布对象通过getContext('2d')来得到画笔,然后就可以开始画了 代码: <!DOCTYPE html> <html l ...
- canvas实例 ---- 制作简易迷宫(一)
这个系列分为两部分,第一部分为迷宫的生成及操作,第二部分为自动寻路算法. 我们先看效果: See the Pen QGKBjm by fanyipin (@fanyipin) on CodePen. ...
- Canvas实例
<!doctype html> <html> <head> <meta charset="utf-8" /> <title&g ...
- canvas之----浮动小球
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- canvas绘制弹跳小球
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
随机推荐
- 03 Transformer 中的多头注意力(Multi-Head Attention)Pytorch代码实现
3:20 来个赞 24:43 弹幕,是否懂了 QKV 相乘(QKV 同源),QK 相乘得到相似度A,AV 相乘得到注意力值 Z 第一步实现一个自注意力机制 自注意力计算 def self_attent ...
- Oracle ASM 常用巡检脚本
1.查看磁盘组 sqlplus "/ as sysasm" set line 200 set pagesize 200 select group_number,name,state ...
- SaaS架构:应用服务、应用结构设计
大家好,我是汤师爷~ 应用架构设计通常包括以下步骤: 根据业务架构,将业务需求转化为IT系统,识别核心应用服务. 划分应用结构,设计应用结构与业务流程.数据之间的关系. 设计应用结构之间的交互和集成关 ...
- 开发者故事:基于 KubeSphere LuBan 架构打造下一代云交付平台
前言 在 KubeSphere Marketplace,个人开发者的创意和才能正在逐渐崭露头角.今日,我们荣幸地向大家介绍 Shipper 云交付平台的开发者--凌波,一位云原生领域的资深专家. 凌波 ...
- 最新Sql语句来啦
创建数据库 CREATE DATABASE 数据库名称; 删除数据库 DROP DATABASE 数据库名称; 创建新表 create table 表名(列 类型 ,列 类型 ,..); 根据已有的表 ...
- css flex布局的使用
felx弹性布局 display:flex; 属性值 flex-direction 属性定义容器要在哪个方向上堆叠 flex 项目.默认为水平方向 row, column 值设置垂直方向.如:flex ...
- cmd杀死占用端口号的Java进程
下面列出两种杀死进程的方法: 1.根据jps查询.2.根据端口号查询进程. 最后根据进程id杀死进程(注意:进程id不等同于端口号) 根据jps查进程 jps命令,列出Java进程列表 根据进程id杀 ...
- 学习JavaScript第一天
文章目录 1.JavaScript简介 2.JavaScript编写的位置 2.1.内部JavaScript 2.2外部JavaScript 2.3内联JavaScript 3.JavaScript注 ...
- Dash 2.18.2版本更新:模式匹配回调性能大提升
本文示例代码已上传至我的Github仓库:https://github.com/CNFeffery/dash-master Gitee同步仓库地址:https://gitee.com/cnfeffer ...
- 经典强化学习算法:分层强化学习算法—options算法2(理解篇)
论文地址: https://people.cs.umass.edu/~barto/courses/cs687/Sutton-Precup-Singh-AIJ99.pdf 例子: 这是一个寻路问题,该问 ...