我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript实现烟花特效(面向对象)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript实现烟花特效(面向对象)

本文实例为大家分享了JavaScript实现烟花特效的具体代码,供大家参考,具体内容如下

本特效使用面向对象编程

分析

OOA

  • 点击触发事件
  • 烟花运动分成两个阶段

          向上飞
          爆炸

OOD


class FireWork{
    constructor(){
        
    }
    bindEvent(){
        let _this = this;
        ele.onclick = function(){
            //fly结束再去调用boom函数
            _this.fly(_this.boom);
        }
    }
    fly(boom){
        
    }
    boom(){
        
    }
}

CSS设计实现

CSS代码


 *{
        margin: 0;
        padding: 0;
    }
    #box{
        width:800px;
        height:600px;
        position: relative;
        margin: 100px auto;
        background:#000000;
        border:2px solid red;
        overflow: hidden;
    }
    .ball{
        width: 40px;
        height: 40px;
        border-radius: 50%;
        position: absolute;
        bottom: 0;
    }

JS编程实现

javascript代码


<script class="lazy" data-src="./utils.js"></script>
<script>
// 
class FireWork{
    constructor(){
        this.box = document.getElementById("box");
        this.box_offset = {
              left : box.offsetLeft,
              top  : box.offsetTop
        }
    }
    bindEvent(){
        let _this = this;
        this.box.onclick = function( e ){
              e = e || event;
              _this.x = e.clientX - _this.box_offset.left; 
              _this.y = e.clientY - _this.box_offset.top; 
    
              _this.fly(_this.boom);
        }     
    }     
    fly( boom ){
        let ele = this.createEle();
        let _this = this;
        // 放入box之中; 
        ele.style.left = this.x + "px";
    
        let _left = this.x ; 
        let _top  = this.y ; 
    
        animate( ele , {
              top : this.y 
        } , function(){
              ele.remove();
              _this.boom( _left , _top );
        });
    }
    boom( x , y ){
        let r = 100;
        let count = 0 ; 
        let _this = this;
    
        for(let i = 0 ; i < 20 ; i ++){
              let ele = this.createEle();
              ele.style.left = x +"px";
              ele.style.top  = y + "px";
              let _left =  parseInt(Math.cos( Math.PI / 10 * i ) * r ) + x ;
              let _top =  parseInt(Math.sin(  Math.PI / 10 * i ) * r) + y
              animate( ele , {
                    left : _left,
                    top  : _top,
                    opacity : 0 
              } , function(){
                    ele.remove();
              })
        }
    }
    createEle(){
        let ele = document.createElement("div");
        ele.className = "ball";
        ele.style.backgroundColor = `rgb(${parseInt(Math.random() * 255)},${parseInt(Math.random() * 255)},${parseInt(Math.random() * 255)})`;
        this.box.appendChild( ele );
        return ele ; 
    }
}

new FireWork().bindEvent();
</script>

引用的utils.js文件


function on(dom, event_name, handler_selector, delegation_handler) {
    if( typeof handler_selector === "string" && typeof delegation_handler === "function"){
        return delegation(dom, event_name, handler_selector, delegation_handler);
    }
    // 在dom对象里面建立一个事件名 : 事件处理函数对应的数组; 
    // 判定当前事件处理函数是否在dom对象之中;
    var event_type = "_" + event_name;
    if (event_type in dom) {
        dom[event_type].push(handler_selector);
    } else {
        dom[event_type] = [handler_selector];
    }
    // 如果直接用事件名当成对象之中的key值,那么会和原有的dom功能名称冲突; 
    // 因为特殊的事件名会导致事件无法触发,所以我们在这里要对事件名进行拆分处理; 
    dom.addEventListener(event_name.split(".")[0], handler_selector)
}
function off(dom, event_name) {
    // 获取到dom对象里面事件名对应的一组事件处理函数; 
    var callback_list = dom["_" + event_name];
    // 根据列表里面的所有函数进行事件移除 ; 
    callback_list.forEach(function (event_handler) {
        dom.removeEventListener(event_name.split(".")[0], event_handler);
    })
    // 清空dom对象里面的事件处理函数组; 
    dom["_" + event_name].length = 0;
}
    
function trigger(dom, event_type) {
    dom.dispatchEvent(new Event(event_type));
}
    
function delegation(dom, event_name, selector, event_handler) {
    dom.addEventListener(event_name, function (e) {
        e = e || event;
        var target = e.target || e.class="lazy" data-srcElement;
        while (target !== dom) {
              switch (selector[0]) {
                    case ".":
                          if (selector.slice(1) === target.className) {
                                event_handler.call(target , e )
                                return;
                          }
                    case "#":
                          if (selector.slice(1) === target.id) {
                                event_handler.call(target, e)
                                return;
                          }
                    default:
                          if (selector.toUpperCase() === target.nodeName) {
                                event_handler.call(target, e)
                                return;
                          }
              }
              target = target.parentNode;
        }
    })
}


function animate( dom , attrs , callback , transition = "buffer", speed = 10 ){
    // transition : 有两种动画方式 "buffer" , "liner"
    var _style = getComputedStyle( dom );
    
    // - 1. 数据变形 ; 
    for(var attr in attrs ){
        attrs[attr] = {
              target : attrs[attr],
              now    : _style[attr]
        }
        // - 2. 速度 : 匀速运动速度正负 ; 
        if( transition === "liner" ){
              attrs[attr].speed = attrs[attr].target > attrs[attr].now ? speed : - speed;
        }
    
        if( attr === "opacity"){
              attrs[attr].target *= 100 
              attrs[attr].now    *= 100
        }else{
              attrs[attr].now = parseInt(attrs[attr].now) 
        }
    }
    // - 关闭开启定时器;    
    clearInterval( dom.interval );
    dom.interval = setInterval( function(){
        for(var attr in attrs ){
              // 取出当前值和属性值 ; 
              // attrs[attr].target : 目标值; 
              // attrs[attr].now    : 当前值; 
    
              let { target , now } = attrs[attr];
    
              // 缓冲运动时候的速度; 
              if( transition === "buffer" ){
                    var speed = (target - now ) / 10 ;
                    speed = speed > 0 ? Math.ceil( speed ) : Math.floor( speed );
              }else if(transition === "liner"){
                    var speed =  attrs[attr].speed; 
              }
    
              
              if( Math.abs(target - now) <= Math.abs( speed ) ){
                    
                    if( attr === "opacity"){
                          dom.style[attr] = target / 100;
                    }else{
                          dom.style[attr] = target  + "px";
                    }
    
                    delete attrs[attr];
                    for(var attr in attrs ){
                          // 如果有数据循环会执行至少一次; 
                          return false;
                    }
                    clearInterval(dom.interval);
                    typeof callback === "function" ? callback() : "";
              }else{
                    now += speed;
    
                    if( attr === "opacity"){
                          dom.style[attr] = now / 100;
                    }else{
                          dom.style[attr] = now  + "px";
                    }
                    // 给对象赋值; 
                    attrs[attr].now = now;
              }
        }
    } , 30)
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript实现烟花特效(面向对象)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript怎么实现带音效的烟花特效

这篇文章主要介绍“JavaScript怎么实现带音效的烟花特效”,在日常操作中,相信很多人在JavaScript怎么实现带音效的烟花特效问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript怎么实
2023-06-22

JavaScript怎么实现烟花和福字特效

这篇文章主要讲解了“JavaScript怎么实现烟花和福字特效”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript怎么实现烟花和福字特效”吧!超能力一:放烟花先带大家看看实现后
2023-06-26

JavaScript如何实现五种不同烟花特效

本文将为大家详细介绍“JavaScript如何实现五种不同烟花特效”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“JavaScript如何实现五种不同烟花特效”能够给你意想不到的收获,请大家跟着小编的思路慢慢深
2023-06-26

怎么使用html和JavaScript实现3D烟花特效

今天小编给大家分享一下怎么使用html和JavaScript实现3D烟花特效的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。效
2023-07-04

怎么使用canvas实现烟花特效

小编给大家分享一下怎么使用canvas实现烟花特效,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!canvas可以实现不同动画效果,本文主要记录几种不同节日烟花效果
2023-06-09

JS怎么实现酷炫的烟花特效

这篇文章主要介绍“JS怎么实现酷炫的烟花特效”,在日常操作中,相信很多人在JS怎么实现酷炫的烟花特效问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS怎么实现酷炫的烟花特效”的疑惑有所帮助!接下来,请跟着小编
2023-06-27

HTML5和Canvas怎么实现烟花绽放特效

这篇文章给大家分享的是有关HTML5和Canvas怎么实现烟花绽放特效的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果如下:undefinedundefinedundefined代码如下:XML/HTML Co
2023-06-09

基于JavaScript实现在线网页烟花效果

这篇文章主要为大家详细介绍了如何利用JavaScript实现简单的在线网页烟花效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2023-02-03

JavaScript实现雪花飘落效果特效

雪,是冬天的灵魂,为大地铺好背景,之后发生的都如梦似幻,就像童话般的存在。冬天没有雪,能难倒程序猿吗,没有雪自己造,这篇文章主要介绍了JavaScript实现雪花飘落效果特效,需要的朋友可以参考下
2023-01-01

JavaScript面向对象编程实现模拟

面向对象编程(ObjectOrientedProgramming)将现实世界中的复杂关系抽象成一个个对象,通过对象之间的分工合作对现实世界进行模拟
2022-11-13

JavaScript面向对象的支持怎么实现

本篇内容介绍了“JavaScript面向对象的支持怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在JavaScript中,我们需要通
2023-06-03

编程热搜

目录