基于Html+CSS+JS实现手动放烟花效果

 更新时间:2022年01月23日 16:08:39   作者:前端老实人  
这篇文章主要介绍了利用Html+CSS+JavaScript实现的放烟花效果,文中一共实现了两种方式:手动和自动,文中的示例代码讲解详细,感兴趣的可以试一试

雷迪森安的乡亲们,欢迎来到老实人的前端课堂,上次写了一个新春小盲盒,这大过年的,我把烟花都给你们准备好了,今天我们来写个小烟花吧。

效果展示

注意看有两种模式哦,可以自由切换,鼠标点哪里哪里有烟花,还可以自动放烟花

视频演示:html+css写一个烟花,源码请你直接拿走!

实现代码

Html

  <div id="tips">
    <a id="manual" href="javascript:;" rel="external nofollow"  rel="external nofollow" >手动放烟花</a>
    <a id="auto" href="javascript:;" rel="external nofollow"  rel="external nofollow" >自动放烟花</a>
  </div>

Css

以下样式大部分是js代码渲染上dom后表现出来的

    html,
    body {
      overflow: hidden;
    }

    body,
    div,
    p {
      margin: 0;
      padding: 0;
    }

    body {
      background: #000;
      font: 12px/1.5 arial;
      color: #7A7A7A;
    }

    a {
      text-decoration: none;
      outline: none;
    }

    #tips,
    #copyright {
      position: absolute;
      width: 100%;
      height: 50px;
      text-align: center;
      background: #171717;
      border: 2px solid #484848;
    }

    #tips {
      top: 0;
      border-width: 0 0 2px;
    }

    #tips a {
      font: 14px/30px arial;
      color: #FFF;
      background: #F06;
      display: inline-block;
      margin: 10px 5px 0;
      padding: 0 15px;
      border-radius: 15px;
    }

    #tips a.active {
      background: #FE0000;
    }

    #copyright {
      bottom: 0;
      line-height: 50px;
      border-width: 2px 0 0;
    }

    #copyright a {
      color: #FFF;
      background: #7A7A7A;
      padding: 2px 5px;
      border-radius: 10px;
    }

    #copyright a:hover {
      background: #F90;
    }

    p {
      position: absolute;
      top: 55px;
      width: 100%;
      text-align: center;
    }

JavaScript

  var fgm = {
    on: function (element, type, handler) {
      return element.addEventListener ? element.addEventListener(type, handler, false) : element.attachEvent("on" + type, handler)
    },
    un: function (element, type, handler) {
      return element.removeEventListener ? element.removeEventListener(type, handler, false) : element.detachEvent("on" + type, handler)
    },
    bind: function (object, handler) {
      return function () {
        return handler.apply(object, arguments)
      }
    },
    randomRange: function (lower, upper) { //产生范围在lower~upper的随机数
      return Math.floor(Math.random() * (upper - lower + 1) + lower)
    },
    getRanColor: function () { //随机获得十六进制颜色
      var str = this.randomRange(0, 0xFFFFFF).toString(16);
      while (str.length < 6) str = "0" + str;
      return "#" + str
    }
  };
  //初始化对象
  function FireWorks() {
    this.type = 0;
    this.timer = null;
    this.fnManual = fgm.bind(this, this.manual)
  }
  FireWorks.prototype = {
    initialize: function () {
      clearTimeout(this.timer);
      fgm.un(document, "click", this.fnManual);
      switch (this.type) {
        case 1:
          fgm.on(document, "click", this.fnManual);
          break;
        case 2:
          this.auto();
          break;
      };
    },
    manual: function (event) {
      event = event || window.event;
      this.__create__({
        x: event.clientX,
        y: event.clientY
      });
    },

    auto: function () {
      var that = this;
      that.timer = setTimeout(function () {
        that.__create__({
          x: fgm.randomRange(50, document.documentElement.clientWidth - 50),
          y: fgm.randomRange(50, document.documentElement.clientHeight - 150)
        })
        that.auto();
      }, fgm.randomRange(900, 1100))
    },
    __create__: function (param) {
      //param即鼠标点击点(即烟花爆炸点)
      var that = this;
      var oEntity = null;
      var oChip = null;
      var aChip = [];
      var timer = null;
      var oFrag = document.createDocumentFragment();

      oEntity = document.createElement("div");
      with (oEntity.style) { //烟花上升过程实体初始化
        position = "absolute";
        //初始位置距网页顶部为:整个网页的高度(处于网页底部)
        top = document.documentElement.clientHeight + "px";
        left = param.x + "px";
        width = "4px";
        height = "30px";
        borderRadius = "4px";
        background = fgm.getRanColor();
      };
      document.body.appendChild(oEntity);
      //window.setInterval方法 该方法使得一个函数每隔固定时间被调用一次
      //                console.log(param.y);
      oEntity.timer = setInterval(function () {
        //                    console.log(oEntity.offsetTop);
        //                    console.log(oEntity.style.top);
        oEntity.style.top = oEntity.offsetTop - 20 + "px";
        //判断烟花是否上升到或者第一次超过上次鼠标点击位置
        if (oEntity.offsetTop <= param.y) {
          //烟花爆炸
          clearInterval(oEntity.timer);
          document.body.removeChild(oEntity);
          (function () {
            //在50-100之间随机生成碎片
            //由于IE浏览器处理效率低, 随机范围缩小至20-30
            //自动放烟花时, 随机范围缩小至20-30
            var len = (/msie/i.test(navigator.userAgent) || that.type == 2) ? fgm.randomRange(20, 30) : fgm.randomRange(50, 100)
            //产生所有烟花爆炸颗粒实体
            for (i = 0; i < len; i++) {
              //烟花颗粒形态实体
              oChip = document.createElement("div");
              with (oChip.style) {
                position = "absolute";
                top = param.y + "px";
                left = param.x + "px";
                width = "4px";
                height = "4px";
                overflow = "hidden";
                borderRadius = "4px";
                background = fgm.getRanColor();
              };
              oChip.speedX = fgm.randomRange(-20, 20);
              oChip.speedY = fgm.randomRange(-20, 20);
              oFrag.appendChild(oChip);
              aChip[i] = oChip
            };
            document.body.appendChild(oFrag);
            timer = setInterval(function () {
              for (i = 0; i < aChip.length; i++) {
                var obj = aChip[i];
                with (obj.style) {
                  top = obj.offsetTop + obj.speedY + "px";
                  left = obj.offsetLeft + obj.speedX + "px";
                };
                obj.speedY++;
                //判断烟花爆炸颗粒是否掉落至窗体之外,为真则remove
                //splice() 方法可删除从 index 处开始的零个或多个元素
                (obj.offsetTop < 0 || obj.offsetLeft < 0 || obj.offsetTop > document.documentElement.clientHeight || obj.offsetLeft > document.documentElement.clientWidth) && (document.body.removeChild(obj), aChip.splice(i, 1))
              };
              //判断烟花爆炸颗粒是否全部remove,为真则clearInterval(timer);
              !aChip[0] && clearInterval(timer);
            }, 30)
          })()
        }
      }, 30)
    }
  };

  fgm.on(window, "load", function () {
    var oTips = document.getElementById("tips");
    var aBtn = oTips.getElementsByTagName("a");
    var oFireWorks = new FireWorks();

    fgm.on(oTips, "click", function (event) {
      var oEvent = event || window.event;
      var oTarget = oEvent.target || oEvent.srcElement;
      var i = 0;
      if (oTarget.tagName.toUpperCase() == "A") {
        for (i = 0; i < aBtn.length; i++) aBtn[i].className = "";
        switch (oTarget.id) {
          case "manual":
            oFireWorks.type = 1;
            break;
          case "auto":
            oFireWorks.type = 2;
            break;
          case "stop":
            oFireWorks.type = 0;
            break;
        }
        oFireWorks.initialize();
        oTarget.className = "active";
        //阻止浏览器默认的事件冒泡行为
        oEvent.stopPropagation ? oEvent.stopPropagation() : oEvent.cancelBubble = true
      }
    });
  });
  fgm.on(document, "contextmenu", function (event) {
    var oEvent = event || window.event;
    oEvent.preventDefault ? oEvent.preventDefault() : oEvent.returnValue = false
  });

关键代码,满满注释哦,这我可够意思了哈,不懂的话再私下问我吧。

到此这篇关于基于Html+CSS+JS实现手动放烟花效果的文章就介绍到这了,更多相关JS放烟花内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js实现Tab选项卡切换效果

    js实现Tab选项卡切换效果

    这篇文章主要为大家详细介绍了js实现Tab选项卡切换效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • uniapp封装小程序雷达图组件的完整代码

    uniapp封装小程序雷达图组件的完整代码

    组件是一个单独且可复用的功能模块的封装,每个组件,包括如下几个部分:以组件名称为标记的开始标签和结束标签、组件内容、组件属性、组件属性值,这篇文章主要给大家介绍了关于uniapp封装小程序雷达图组件的相关资料,需要的朋友可以参考下
    2021-07-07
  • 微信小程序如何调用json数据接口并解析

    微信小程序如何调用json数据接口并解析

    这篇文章主要介绍了微信小程序如何调用json数据接口并解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • js实现星星海特效的示例

    js实现星星海特效的示例

    这篇文章主要介绍了js实现星星海特效的示例,帮助大家制作网页特效,感兴趣的朋友可以了解下
    2020-09-09
  • 浅谈js函数中的实例对象、类对象、局部变量(局部函数)

    浅谈js函数中的实例对象、类对象、局部变量(局部函数)

    下面小编就为大家带来一篇浅谈js函数中的实例对象、类对象、局部变量(局部函数)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • 微信小程序页面返回传值的4种解决方案汇总

    微信小程序页面返回传值的4种解决方案汇总

    这篇文章主要给大家介绍了关于微信小程序页面返回传值的4种解决方案,小程序开发中经常会遇到这种场景,比如提交问题,然后需要返回之前页面,本文通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • 一篇文章深入了解JavaScript中的fetch方法

    一篇文章深入了解JavaScript中的fetch方法

    这篇文章主要给大家介绍了关于JavaScript中fetch方法的相关资料,JavaScript中的fetch()方法用于向服务器请求并加载网页中的信息,请求可以是返回JSON或XML格式数据的任何API,需要的朋友可以参考下
    2023-10-10
  • javascript中UMD规范的代码推演

    javascript中UMD规范的代码推演

    这篇文章给大家分享了javascript中UMD规范的代码推演的相关的知识点内容,有兴趣的朋友们学习下。
    2018-08-08
  • 微信小程序实现长按 识别图片二维码(两种方案)

    微信小程序实现长按 识别图片二维码(两种方案)

    这篇文章主要介绍了微信小程序实现长按 识别图片二维码(两种方案),第一种方案只需要在image里面加一个属性就可以了,本文结合实例代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • JS写的数字拼图小游戏代码[学习参考]

    JS写的数字拼图小游戏代码[学习参考]

    昨天没事做,就用JS写了个数字拼图的小游戏,自娱自乐。 可惜关于逆序数的问题还没解决,现在有时是拼不成的,大家见谅了。
    2008-10-10

最新评论