先看效果(完整代码在底部):

因为录屏软件的原因,动画看着有点迟钝,其实是动画很顺畅的~

https://space.bilibili.com/176586698

实现过程(可一步一步实现):

1.定义标签与基本css样式:

    <h1>北极光之夜。</h1><canvas id="canvas"></canvas>
#canvas{position: fixed;top: 0;left: 0;/*  filter: contrast(30); */}

主要是canvas重力小球部分,h1标题文字等的css部分就不细写了,看源码即可。

2.开始js部分实现,先获取画布:

        var canvas = document.querySelector("#canvas");var ctx = canvas.getContext("2d");

3. 定义变量(看注释):

// w为画布宽 ,h为画布高var w=0,h=0;        // 存放小球颜色数组,给点好看的颜色 ╭(●`∀´●)╯var colour = ["#00BFFF","#00FFFF","#3CB371","#FFFF00","#FF8C00","#7B68EE"];// 存放每个小球的基本信息,位置半径等等...var arr = [];// 小球数量var num = 66;

4.画布自适应屏幕大小函数,这个直接复制便可,以后做画布背景都可以用:

 window.onresize=resizeCanvas;function resizeCanvas(){w=canvas.width = window.innerWidth;h=canvas.height = window.innerHeight;// 窗口大小改变时,arr数组重新初始化arr.length = 0;chushi();}resizeCanvas();

5. 定义一个函数后面用,作用是随机返回mix与max间的一个值,也直接复制:

 function getRandomArbitrary(min, max) {return Math.random() * (max - min) + min;}

Math.random() 返回0到1之间的数。

6. arr数组初始化,每个小球的初始信息:

 function chushi(){for(let i=0;i<num;i++){arr.push({// x为在画布水平方向位置x:getRandomArbitrary(15,w-15),// y为在画布垂直方向位置y:getRandomArbitrary(-h/2,h/2),// 小球半径r:getRandomArbitrary(5,15),//  小球水平方向移动距离大小dx:getRandomArbitrary(-3,3),//  小球垂直方向移动距离大小dy:0.5,// 随机颜色color: colour[parseInt(Math.random() * (colour.length-1))] })}}

parseInt()返回整数。

7.绘制画布每一帧小球 ≖‿≖✧:

function draw(){for(let i=0;i<arr.length;i++){let circle = arr[i];// 开始绘制ctx.beginPath();// 颜色ctx.fillStyle = circle.color;// 画圆ctx.arc(circle.x,circle.y,circle.r,0,Math.PI*2,false);// 定义阴影ctx.shadowOffsetx=0;ctx.shadowOffsetY=0;ctx.shadowBlur= 20;ctx.shadowColor = circle.color;// 填充ctx.fill();// 结束绘制ctx.closePath();}}

8. 更新,小球信息要进行的变化:

function updates(){// 循环数组for(let i=0;i<arr.length;i++){// 如果小球垂直位置+半径+dy+0.3 将要大于屏幕高度,就是小球要超出屏幕底部时if(arr[i].y + arr[i].r + arr[i].dy + 0.3>=h){// 垂直移动距离大小变负数,这样小球会往反方向移动arr[i].dy = -arr[i].dy;// 同时垂直移动距离大小×0.9,逐渐变小,不能一直动个不停arr[i].dy *= 0.9;// 水平方向同上arr[i].dx *= 0.9;}else{// 垂直移动距离大小+0.3,这样可以有加速度效果,0.3是我觉得合适,也可以其它arr[i].dy += 0.3;}              // 如果小球水平位置+半径+dx 将要大于屏幕宽度,就是小球要超出屏幕左右侧部时if(arr[i].x + arr[i].r + arr[i].dx > w ||  arr[i].x - arr[i].r  <=0){// 水平移动距离大小变负数,这样小球会往反方向移动arr[i].dx = -arr[i].dx;                  }//小球位置改变arr[i].x += arr[i].dx;arr[i].y += arr[i].dy;}} 

9.设置动画:

// arr初始化chushi();setInterval(function(){ctx.clearRect(0, 0, w , h); //绘制draw();//更新updates(); },10)

ctx.clearRect():清除画布。

10.给body绑定点击事件,鼠标点击窗口某一位置后小球上升一段距离:

var body =document.querySelector("#body");body.addEventListener('click',function(event){     for(let i=0;i<arr.length;i++){// 如果arr[i].y - arr[i].r 还大于0,0就是屏幕顶部if(arr[i].y - arr[i].r>=0){ // dy给一个随机值arr[i].dy = getRandomArbitrary(-10,-5);// dx给一个随机值arr[i].dx=getRandomArbitrary(-3,3);}}})

完整代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>*{padding: 0;margin: 0;}body{overflow: hidden;background-color: rgb(5, 7, 24);}#canvas{position: fixed;top: 0;left: 0;/*  filter: contrast(30); */}.yuan{position: absolute;width: 5px;height: 5px;border: 2px solid rgb(11, 147, 211);border-radius: 50%;animation: big 1s linear;box-shadow:inset 0 0 200px rgb(11, 147, 211);}@keyframes big{100%{width: 1000px;height: 1000px;       box-shadow:inset 0 0 0px rgb(11, 147, 211);      border: 2px solid transparent;          /* background-color: rgb(11, 147, 211); */}}h1{position: absolute;top: 50%;left: 50%;transform: translate(-45%,-50%);font-size: 8vw;color: transparent;-webkit-background-clip: text;background-image: url(img/star.gif);filter: drop-shadow(0 0 60px rgb(0, 132, 255));}</style>
</head>
<body id="body"><h1>北极光之夜。</h1><canvas id="canvas"></canvas><script>var canvas = document.querySelector("#canvas");var ctx = canvas.getContext("2d");// w为画布宽 ,h为画布高var w=0,h=0;        // 存放小球颜色数组,给点好看的颜色 ╭(●`∀´●)╯var colour = ["#00BFFF","#00FFFF","#3CB371","#FFFF00","#FF8C00","#7B68EE"];// 存放每个小球的基本信息,位置半径等等...var arr = [];// 小球数量var num = 66;window.onresize=resizeCanvas;function resizeCanvas(){w=canvas.width = window.innerWidth;h=canvas.height = window.innerHeight;// 窗口大小改变时,arr数组重新初始化arr.length = 0;chushi();}resizeCanvas(); function getRandomArbitrary(min, max) {return Math.random() * (max - min) + min;}  function chushi(){for(let i=0;i<num;i++){arr.push({// x为在画布水平方向位置x:getRandomArbitrary(15,w-15),// y为在画布垂直方向位置y:getRandomArbitrary(-h/2,h/2),// 小球半径r:getRandomArbitrary(5,15),//  小球水平方向移动距离大小dx:getRandomArbitrary(-3,3),//  小球垂直方向移动距离大小dy:0.5,// 随机颜色color: colour[parseInt(Math.random() * (colour.length-1))]
/*               color: `rgb(${Math.random() * 255},${Math.random() * 255},${Math.random() * 255})`*/            })}}     function draw(){for(let i=0;i<arr.length;i++){let circle = arr[i];// 开始绘制ctx.beginPath();// 颜色ctx.fillStyle = circle.color;// 画圆ctx.arc(circle.x,circle.y,circle.r,0,Math.PI*2,false);// 定义阴影ctx.shadowOffsetx=0;ctx.shadowOffsetY=0;ctx.shadowBlur= 20;ctx.shadowColor = circle.color;// 填充ctx.fill();// 结束绘制ctx.closePath();}}function updates(){// 循环数组for(let i=0;i<arr.length;i++){// 如果小球垂直位置+半径+dy+0.3 将要大于屏幕高度,就是小球要超出屏幕底部时if(arr[i].y + arr[i].r + arr[i].dy + 0.3>=h){// 垂直移动距离大小变负数,这样小球会往反方向移动arr[i].dy = -arr[i].dy;// 同时垂直移动距离大小×0.9,逐渐变小,不能一直动个不停arr[i].dy *= 0.9;// 水平方向同上arr[i].dx *= 0.9;}else{// 垂直移动距离大小+0.3,这样可以有加速度效果,0.3是我觉得合适,也可以其它arr[i].dy += 0.3;}              // 如果小球水平位置+半径+dx 将要大于屏幕宽度,就是小球要超出屏幕左右侧部时if(arr[i].x + arr[i].r + arr[i].dx > w ||  arr[i].x - arr[i].r  <=0){// 水平移动距离大小变负数,这样小球会往反方向移动arr[i].dx = -arr[i].dx;                  }//小球位置改变arr[i].x += arr[i].dx;arr[i].y += arr[i].dy;}} chushi();setInterval(function(){ctx.clearRect(0, 0, w , h); draw();updates(); },10) var body =document.querySelector("#body");body.addEventListener('click',function(event){     let left = event.clientX,top = event.clientY;console.log(left,top);let yuan = document.createElement('div');yuan.classList.add('yuan');yuan.style.cssText = `left:${left}px;top:${top}px; transform: translate(-50%,-50%); `body.appendChild(yuan);setTimeout(function(){body.removeChild(yuan);},999);for(let i=0;i<arr.length;i++){if(arr[i].y - arr[i].r>=0){ arr[i].dy = getRandomArbitrary(-10,-5);arr[i].dx=getRandomArbitrary(-3,3);}}})</script>
</body>
</html>

其它:

物转星移,花开花落,周而复始,生生不息,但今昔已非昨日,然今日花容依旧。- - -《虫师》

这是我的B站账号~:https://space.bilibili.com/176586698
敲锣打鼓~
关注一波~
会有更多有意思的东西~
大概~
╭(●`∀´●)╯╰(●’◡’●)╮

canvas重力小球 html+css+js相关推荐

  1. #网页动画# 重力小球

    网页重力小球动画 网页canvas重力小球动画 动画效果链接 <!DOCTYPE html> <html lang="zh"> <head>&l ...

  2. canvas小球连线碰撞效果 html+css+js

    先看效果(完整代码在底部): canvas小球连线碰撞完整源代码 html+css+js 这是我的B站地址~热烈欢迎 实现(看注释,可一步一步跟着实现): 0:定义标签: <h1>北极光之 ...

  3. canvas文字粒子效果 html+css+js 3点饮茶,7点放工,美滋滋~

    先言:  今天3点多在饮茶的时候,发现有好几天没水文章了,但是太难的玩意又不会啊,咋办,突然想起电脑里还有存着一个文字粒子特效,好家伙,这不就来了,先看效果如下: 因为gif图最大5m,但是这东西演示 ...

  4. canvas黑客帝国数字雨背景 html+css+js

    效果(完整源码在最后): [html+css+js]黑客帝国数字雨源码分享 可拿来作页面背景 制作: 定义canvas标签: <canvas id="canvas">& ...

  5. html5 (canvas) +css+js 实现画图工具

    效果图: js: var canvas= document.getElementById("cans"); var cxt=canvas.getContext("2d&q ...

  6. web版拳皇,使用html,css,js来制作一款拳皇游戏

    web版拳皇,使用html,css,js来制作一款拳皇游戏 游戏简介 <拳皇>是1994年日本SNK公司旗下在MVS游戏机板上发售的一款著名对战型格斗街机游戏,简称"KOF&qu ...

  7. html5使用canvas实现小球碰撞反弹实例

    使用 html5 中的 canvas, 实现小球相互碰撞并反弹,反弹算法比较简单. index.html <!DOCTYPE html> <html lang="en&qu ...

  8. html+css+js实现点球球小游戏

    html+css+js实现点球球小游戏 简介:这是一款休闲类的小游戏,在这款游戏里面你可以通过鼠标点击屏幕中生成的小球,小球爆炸是有特效的,小球的运行方向和生成位置也是随机的,可以通过修改代码来控制, ...

  9. 上传身份证照片js_html+css+js 实现拍照预览上传图片功能

    前言:我们在做网页时经常会需要有上传图片的需求,可能是选择图片或者拍照上传,如果简单的使用这种方式虽然也能实现功能,但用户体验上可能会差了一些,所以本文记录了使用css+js实现图片选中后的预览及压缩 ...

最新文章

  1. 聚类分析案例:探究用户对物品类别的喜好细分降维
  2. CO-类的本质、description方法
  3. python先序、中序、后序排序
  4. 与虫子尾交3d动画网站_PPT中最酷的效果 —— 3D模型全解
  5. mysql blob图片_使用mysql的Blob字段存取图片
  6. 应用开发之WinForm开发
  7. Java注解参数类型枚举值_EffectiveJava-5-枚举和注解
  8. 2020最新android教程,Android教程2020
  9. scala 基础 ——关键字与特殊符号
  10. STM32:配置定时器为PWM输出模式以及编码器接口模式
  11. edius裁剪快捷键_edius5.0常用快捷键 edius快捷键使用大全
  12. php hprose扩展1.5.5,Laravel框架RPC解决方案--Hprose
  13. 经典BBS语录100条
  14. 酷睿i7 12700k核显相当于什么显卡 i712700k参数 i7 12700k什么水平
  15. pion/ion搭建
  16. PWM控制电机转速的原理
  17. 网页验证码显示在输入框input上的方法
  18. 轻松实现富文本编辑器
  19. john the ripper跑多核多cpu
  20. Linux系统怎么使用扫描仪,Linux系统中Nmap扫描命令的使用方法 -电脑资料

热门文章

  1. 计算机视觉(2)随记
  2. AJAX基础入门实例教程(含代码)
  3. 你后悔进入IT行业吗?IT行业到底如何?
  4. linux没有写的权限问题
  5. 高权重、PR域名哪里找?用什么工具查询域名权重?
  6. Redis 学习笔记(1)—— Redis安装,String 类型测试
  7. (he)的平方等于she
  8. 计算机中丢失repo,我的本地git repo有“未上演”的已删除文件,远程是文件,如何删除丢失的文件?...
  9. python画正方形的代码drawingpanel_Python shapes.Drawing方法代码示例
  10. 软考笔记第五天之系统安全分析与设计