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 相关文章推荐
浅谈javascript六种数据类型以及特殊注意点
Dec 20 Javascript
JQuery显示隐藏页面元素的方法总结
Apr 16 Javascript
使用JavaScript制作一个简单的计数器的方法
Jul 07 Javascript
Jquery代码实现图片轮播效果(一)
Aug 12 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
Sep 18 Javascript
每天一篇javascript学习小结(String对象)
Nov 18 Javascript
jquery UI Datepicker时间控件的使用及问题解决
Apr 28 Javascript
基于JavaScript实现在新的tab页打开url
Aug 04 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
Aug 20 Javascript
分析JS中this引发的bug
Dec 12 Javascript
使用Sonarqube扫描Javascript代码的示例
Dec 26 Javascript
解决vue addRoutes不生效问题
Aug 04 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
怎么使 Mysql 数据同步
2006/10/09 PHP
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
javascript中强制执行toString()具体实现
2013/04/27 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
javascript 回调函数详解
2014/11/11 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
vue2.0使用swiper组件实现轮播效果
2017/11/27 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
Python采集腾讯新闻实例
2014/07/10 Python
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
2019/10/23 Python
Python实现AI换脸功能
2020/04/10 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
小学母亲节活动方案
2014/03/14 职场文书
小学师德标兵先进事迹材料
2014/05/25 职场文书
人大代表选举标语
2014/10/07 职场文书
先进工作者事迹材料
2014/12/23 职场文书
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
一文搞懂MySQL索引页结构
2022/02/28 MySQL