js实现点击烟花特效


Posted in Javascript onOctober 14, 2020

代码:

<script type="text/javascript">
function clickEffect() {
  let balls = [];
  let longPressed = false;
  let longPress;
  let multiplier = 0;
  let width, height;
  let origin;
  let normal;
  let ctx;
  const colours = ["#F73859", "#14FFEC", "#00E0FF", "#FF99FE", "#FAF15D"];
  const canvas = document.createElement("canvas");
  document.body.appendChild(canvas);
  canvas.setAttribute("style", "width: 100%; height: 100%; top: 0; left: 0; z-index: 99999; position: fixed; pointer-events: none;");
  const pointer = document.createElement("span");
  pointer.classList.add("pointer");
  document.body.appendChild(pointer);

  if (canvas.getContext && window.addEventListener) {
    ctx = canvas.getContext("2d");
    updateSize();
    window.addEventListener('resize', updateSize, false);
    loop();
    window.addEventListener("mousedown", function(e) {
      pushBalls(randBetween(10, 20), e.clientX, e.clientY);
      document.body.classList.add("is-pressed");
      longPress = setTimeout(function() {
        document.body.classList.add("is-longpress");
        longPressed = true;
      }, 500);
    }, false);
    window.addEventListener("mouseup", function(e) {
      clearInterval(longPress);
      if (longPressed == true) {
        document.body.classList.remove("is-longpress");
        pushBalls(randBetween(50 + Math.ceil(multiplier), 100 + Math.ceil(multiplier)), e.clientX, e.clientY);
        longPressed = false;
      }
      document.body.classList.remove("is-pressed");
    }, false);
    window.addEventListener("mousemove", function(e) {
      let x = e.clientX;
      let y = e.clientY;
      pointer.style.top = y + "px";
      pointer.style.left = x + "px";
    }, false);
  } else {
    console.log("canvas or addEventListener is unsupported!");
  }


  function updateSize() {
    canvas.width = window.innerWidth * 2;
    canvas.height = window.innerHeight * 2;
    canvas.style.width = window.innerWidth + 'px';
    canvas.style.height = window.innerHeight + 'px';
    ctx.scale(2, 2);
    width = (canvas.width = window.innerWidth);
    height = (canvas.height = window.innerHeight);
    origin = {
      x: width / 2,
      y: height / 2
    };
    normal = {
      x: width / 2,
      y: height / 2
    };
  }
  class Ball {
    constructor(x = origin.x, y = origin.y) {
      this.x = x;
      this.y = y;
      this.angle = Math.PI * 2 * Math.random();
      if (longPressed == true) {
        this.multiplier = randBetween(14 + multiplier, 15 + multiplier);
      } else {
        this.multiplier = randBetween(6, 12);
      }
      this.vx = (this.multiplier + Math.random() * 0.5) * Math.cos(this.angle);
      this.vy = (this.multiplier + Math.random() * 0.5) * Math.sin(this.angle);
      this.r = randBetween(8, 12) + 3 * Math.random();
      this.color = colours[Math.floor(Math.random() * colours.length)];
    }
    update() {
      this.x += this.vx - normal.x;
      this.y += this.vy - normal.y;
      normal.x = -2 / window.innerWidth * Math.sin(this.angle);
      normal.y = -2 / window.innerHeight * Math.cos(this.angle);
      this.r -= 0.3;
      this.vx *= 0.9;
      this.vy *= 0.9;
    }
  }

  function pushBalls(count = 1, x = origin.x, y = origin.y) {
    for (let i = 0; i < count; i++) {
      balls.push(new Ball(x, y));
    }
  }

  function randBetween(min, max) {
    return Math.floor(Math.random() * max) + min;
  }

  function loop() {
    ctx.fillStyle = "rgba(255, 255, 255, 0)";
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    for (let i = 0; i < balls.length; i++) {
      let b = balls[i];
      if (b.r < 0) continue;
      ctx.fillStyle = b.color;
      ctx.beginPath();
      ctx.arc(b.x, b.y, b.r, 0, Math.PI * 2, false);
      ctx.fill();
      b.update();
    }
    if (longPressed == true) {
      multiplier += 0.2;
    } else if (!longPressed && multiplier >= 0) {
      multiplier -= 0.4;
    }
    removeBall();
    requestAnimationFrame(loop);
  }

  function removeBall() {
    for (let i = 0; i < balls.length; i++) {
      let b = balls[i];
      if (b.x + b.r < 0 || b.x - b.r > width || b.y + b.r < 0 || b.y - b.r > height || b.r < 0) {
        balls.splice(i, 1);
      }
    }
  }
}
clickEffect();//调用
</script>

效果:

js实现点击烟花特效

以上就是js实现点击烟花特效的详细内容,更多关于js 烟花特效的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
Jan 30 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
May 11 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
May 23 Javascript
Js注册协议倒计时的小例子
Jun 24 Javascript
使用js在页面中绘制表格核心代码
Sep 16 Javascript
jQuery实现可展开合拢的手风琴面板菜单
Sep 15 Javascript
angular.js 路由及页面传参示例
Feb 24 Javascript
vue 动态修改a标签的样式的方法
Jan 18 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
Feb 16 Javascript
vue element ui validate 主动触发错误提示操作
Sep 21 Javascript
解决Vue大括号字符换行踩的坑
Nov 09 Javascript
VUE递归树形实现多级列表
Jul 15 Vue.js
vue使用Sass时报错问题的解决方法
Oct 14 #Javascript
JavaScript原生数组函数实例汇总
Oct 14 #Javascript
如何通过JS实现日历简单算法
Oct 14 #Javascript
浅谈js数组splice删除某个元素爬坑
Oct 14 #Javascript
如何使用JS console.log()技巧提高工作效率
Oct 14 #Javascript
JavaScript Blob对象原理及用法详解
Oct 14 #Javascript
基于javascript原生判断DOM是否加载完毕
Oct 14 #Javascript
You might like
PHP中集成PayPal标准支付的实现方法分享
2012/02/06 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
将CKfinder整合进CKEditor3.0的新方法
2010/01/10 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
js点击出现悬浮窗效果不使用JQuery插件
2014/01/20 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
基于JavaScript实现一定时间后去执行一个函数
2015/12/14 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
BootStrap 弹出层代码
2017/02/09 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
Angular短信模板校验代码
2020/09/23 Javascript
python支持断点续传的多线程下载示例
2014/01/16 Python
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
django反向解析和正向解析的方式
2018/06/05 Python
opencv python 图像去噪的实现方法
2018/08/31 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
Python selenium自动化测试模型图解
2020/04/15 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
如何用Django处理gzip数据流
2021/01/29 Python
高三政治教学反思
2014/02/06 职场文书
锅炉工岗位职责
2015/02/13 职场文书
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA
剧场版《转生恶役只好拔除破灭旗标》公开最新视觉图 2023年上映
2022/04/02 日漫