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 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.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)
}

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

(0)

相关推荐

  • 原生JS实现烟花效果

    原生JS实现烟花效果,点击页面生成烟花,向四周扩散,然后再坠落下去.(这里的烟花我是用的特殊字符爱心形状) 基础css代码 /* 设置基础的css样式 */ body{background: #000;overflow: hidden;} .fire{position: absolute;width: 4px;height: 30px;} js代码: 1.给页面添加点击事件,生成主体烟花 //给页面设置点击事件 document.onclick = function(eve){ var e =

  • js模拟实现烟花特效

    本文实例为大家分享了js实现烟花特效的具体代码,供大家参考,具体内容如下 如下图 首先描绘圆周运动 // d1 /*css*/ div{ height: 4px; width: 4px; background: red; position: absolute; } //js var div = document.getElementById('div'); // 画运动点 document.getElementsByTagName('body')[0].appendChild(tdiv); //

  • js实现点击烟花特效

    代码: <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", "#14FFE

  • JavaScript实现五种不同烟花特效

    目录 一.简单大气的烟花 二.在农村看到的烟花 三.可点击的烟花 四.3D旋转烟花 五.可拖动视角的自定义烟花 一.简单大气的烟花 演示地址:http://haiyong.site/fireworks1 HTML代码: 这里的HTML代码很简短 <div> <canvas id="canvas"></canvas> </div> CSS代码 css也只有这两段内容 body{ background:black; overflow:hidd

  • JavaScript实现带音效的烟花特效

    花了半个小时写的代码,这个html5 canvas新年烟花一定不会让大家失望! 首先我们看下静态的效果图: 文章末尾有动态的效果图,滑动即可看到!  JavaScript代码如下: $(function() { var canvas = $('#canvas')[0]; canvas.width = $(window).width(); canvas.height = $(window).height(); var ctx = canvas.getContext('2d'); // resize

  • 非常漂亮的js烟花效果

    本文实例为大家分享了js实现漂亮烟花效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>烟花</title> <style type="text/css"> div>div{ width:10px; height:10px; border-radius: 50%; po

  • js实现炫酷的烟花效果

    本文实例为大家分享了js实现炫酷的烟花效果的具体代码,供大家参考,具体内容如下 我们要理清整个流程的思路. 首先建立一块画布,用于展示烟花的效果,然后就要去思考烟花燃放的流程,我们都知道烟花通常都是先有一份飞上天,然后再分散成很多个小烟花,并且每一个小烟花都有不同的样式以及运动方式. 所有整体思路就是先建立一个div作为我们的大烟花,当大烟花运动到我们鼠标点击的位置的时候,大烟花就会消失,然后就会产生更多的小烟花,并且这些小烟花的运动轨迹样式各不相同. 1.建立一块画布(div)用于展示烟花的效

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

    本文实例为大家分享了JavaScript实现烟花特效的具体代码,供大家参考,具体内容如下 本特效使用面向对象编程 分析 OOA 点击触发事件 烟花运动分成两个阶段 向上飞           爆炸 OOD class FireWork{ constructor(){ } bindEvent(){ let _this = this; ele.onclick = function(){ //fly结束再去调用boom函数 _this.fly(_this.boom); } } fly(boom){ }

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

    本文实例为大家分享了JavaScript实现烟花特效的具体代码,供大家参考,具体内容如下 本特效使用面向对象编程 分析 OOA 点击触发事件 烟花运动分成两个阶段 向上飞          爆炸 OOD class FireWork{ constructor(){ } bindEvent(){ let _this = this; ele.onclick = function(){ //fly结束再去调用boom函数 _this.fly(_this.boom); } } fly(boom){ }

  • JavaScript实现的简单烟花特效代码

    本文实例讲述了JavaScript实现的简单烟花特效代码.分享给大家供大家参考,具体如下: 这是一款JavaScript烟花特效,过年的时候放到你的网页上祝贺大家牛年大吉吧,是不是很不错? 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-yh-explode-style-demo/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &

  • 新年快乐! javascript实现超级炫酷的3D烟花特效

    本文实例为大家分享了javascript实现3D烟花特效的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <meta charset="utf-8"> <title>3D烟花</title> <style> html,b

  • JavaScript实现烟花和福字特效

    目录 超能力一:放烟花 超能力二:写福字 隐藏能力:只有程序员能看懂的祝福 虎虎生威.虎年大吉. 事事都如意,虎虎有生气…… 都2022了你还在从网上复制粘贴这些2002年就烂大街的四句成语群发给你的亲朋好友? 不会吧不会吧,这也太敷衍了吧? 在这个辞旧迎新的美好时刻,一恩姐姐教你如何通过代码放烟花,写春联.用程序员特有的超能力 “卷死” 别人家的孩子们. 超能力一:放烟花 先带大家看看实现后超级酷炫的3D烟花效果图. 怎么样,是不是瞬间逼格暴涨?话不多说,着手整活: 在电脑上创建一个文本文档,

  • jquery实现烟花效果(面向对象)

    本文实例为大家分享了jquery实现烟花效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>烟花效果(面向对象)</title> <style type="text/css"&g

随机推荐