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 相关文章推荐
一个对于Array的简单扩展
Oct 03 Javascript
js格式化时间和js格式化时间戳示例
Feb 10 Javascript
JavaScript cookie的设置获取删除详解
Feb 11 Javascript
JavaScript中创建对象和继承示例解读
Feb 12 Javascript
JavaScript获取当前网页最后修改时间的方法
Apr 03 Javascript
浅谈jQuery中hide和fadeOut的区别 show和fadeIn的区别
Aug 18 Javascript
AngularJS压缩JS技巧分析
Nov 08 Javascript
jstree的简单实例
Dec 01 Javascript
jQuery插件HighCharts绘制2D饼图效果示例【附demo源码下载】
Mar 21 jQuery
对vue.js中this.$emit的深入理解
Feb 23 Javascript
JavaScript中的this妙用实例分析
May 09 Javascript
原生js拖拽功能制作滑动条实例代码
Feb 05 Javascript
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学习资料汇总与网址
2007/03/16 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
php构造函数的继承方法
2015/02/09 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
JS无限树状列表实现代码
2011/01/11 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
js showModalDialog参数的使用详解
2014/01/07 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2016/10/28 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
vue select二级联动第二级默认选中第一个option值的实例
2018/01/10 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
js实现简单图片拖拽效果
2021/02/22 Javascript
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
Python连接PostgreSQL数据库的方法
2016/11/28 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
python如何制作缩略图
2019/04/30 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
浅谈Python 敏感词过滤的实现
2019/08/15 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
python实现logistic分类算法代码
2020/02/28 Python
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
中专毕业自我鉴定
2013/10/16 职场文书
简历自我评价怎么写好呢?
2014/01/04 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
优秀班集体先进事迹材料
2014/05/28 职场文书
英语分层教学实施方案
2014/06/15 职场文书
农村党员对照检查材料
2014/09/24 职场文书
五星级酒店前台接待岗位职责
2015/04/02 职场文书
怎样写好工作计划
2019/04/10 职场文书