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 相关文章推荐
Dom 结点创建 基础知识
Oct 01 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
Aug 29 Javascript
JS图像无缝滚动脚本非常好用
Feb 10 Javascript
javascript实现可全选、反选及删除表格的方法
May 15 Javascript
使用JavaScript实现ajax的实例代码
May 11 Javascript
jQuery 操作input中radio的技巧
Jul 18 Javascript
js 定义对象数组(结合)多维数组方法
Jul 27 Javascript
js 定位到某个锚点的方法
Nov 19 Javascript
原生Javascript插件开发实践
Jan 09 Javascript
jQuery操作复选框(CheckBox)的取值赋值实现代码
Jan 10 Javascript
node实现定时发送邮件的示例代码
Aug 26 Javascript
js面向对象编程OOP及函数式编程FP区别
Jul 07 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 数组二分法查找函数代码
2010/02/16 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
云网广告中的代码,提示出错,大家找找
2006/11/21 Javascript
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
2010/03/20 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
jQuery中index()方法用法实例
2014/12/27 Javascript
jQuery学习笔记之Ajax用法实例详解
2015/12/01 Javascript
js选择器全面解析
2016/06/27 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
jQuery实现表格隔行换色
2018/09/01 jQuery
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
浅谈python 线程池threadpool之实现
2017/11/17 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
机械电子工程毕业生自荐信
2013/11/23 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
教师批评与自我批评发言稿
2014/10/15 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang