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 相关文章推荐
IE与FireFox的兼容性问题分析
Apr 22 Javascript
JS获取键盘上任意按键的值(实例代码)
Nov 12 Javascript
JS刷新当前页面的几种方法总结
Dec 24 Javascript
Jquery实现自定义窗口随意的拖拽
Mar 12 Javascript
javascript实现checkbox全选的代码
Apr 30 Javascript
jquery.cookie.js用法实例详解
Dec 25 Javascript
Vue 换肤的示例实践
Jan 23 Javascript
vue使用vue-i18n实现国际化的实现代码
Apr 08 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
Aug 29 Javascript
JavaScript设计模式之观察者模式实例详解
Jan 16 Javascript
小程序实现筛子抽奖
May 26 Javascript
使用javascript解析二维码的三种方式
Nov 11 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
把77A收信机改造成收音机
2021/03/02 无线电
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
WordPress中调试缩略图的相关PHP函数使用解析
2016/01/07 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
jQuery示例收集
2010/11/05 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
2016/12/08 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Python的Urllib库的基本使用教程
2015/04/30 Python
Python回调函数用法实例详解
2015/07/02 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
Python urls.py的三种配置写法实例详解
2017/04/28 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
python绘制散点图并标记序号的方法
2018/12/11 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
python适合做数据挖掘吗
2020/06/16 Python
keras K.function获取某层的输出操作
2020/06/29 Python
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
应届生法律求职信
2013/10/22 职场文书
校本教研工作制度
2014/01/22 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
工资证明范本
2015/06/12 职场文书
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS