溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

原生JS怎么實(shí)現(xiàn)爆炸的動(dòng)態(tài)效果

發(fā)布時(shí)間:2020-10-20 16:48:02 來(lái)源:億速云 閱讀:235 作者:小新 欄目:web開(kāi)發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)原生JS怎么實(shí)現(xiàn)爆炸的動(dòng)態(tài)效果,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

通過(guò)原生js代碼,實(shí)現(xiàn)粒子爆炸效果組件
組件開(kāi)發(fā)過(guò)程中,使用到了公司內(nèi)部十分高效的工程化環(huán)境,特此打個(gè)廣告: 新浪移動(dòng)誠(chéng)招各種技術(shù)大大!可以私聊投簡(jiǎn)歷哦!

效果預(yù)覽

原生JS怎么實(shí)現(xiàn)爆炸的動(dòng)態(tài)效果

效果分析

點(diǎn)擊作為動(dòng)畫(huà)開(kāi)始的起點(diǎn),自動(dòng)結(jié)束

每次效果產(chǎn)生多個(gè)拋物線粒子運(yùn)動(dòng)的元素,方向隨機(jī),展示內(nèi)容不一樣,有空間上Z軸的大小變化

需求上可以無(wú)間隔點(diǎn)擊,即第一組動(dòng)畫(huà)未結(jié)束可播放第二組動(dòng)畫(huà)

動(dòng)畫(huà)基本執(zhí)行時(shí)長(zhǎng)一致

由以上四點(diǎn)分析后,動(dòng)畫(huà)實(shí)現(xiàn)有哪些實(shí)現(xiàn)方案呢?

css操作態(tài)變換(如focus)使子元素執(zhí)行動(dòng)畫(huà)

不可取,效果可多次連點(diǎn),css狀態(tài)變換與需求不符

Js 控制動(dòng)畫(huà)開(kāi)始,事先寫(xiě)好css動(dòng)畫(huà)預(yù)置,通過(guò)class 包含選擇器切換動(dòng)畫(huà) 例如: .active .items{animation:xxx ...;}

不可取,單次執(zhí)行動(dòng)畫(huà)沒(méi)有問(wèn)題,但是存在效果的固定,以及無(wú)法連續(xù)執(zhí)行動(dòng)畫(huà)

事先寫(xiě)好大量動(dòng)畫(huà),隱藏大量dom元素,動(dòng)畫(huà)開(kāi)始隨機(jī)選取dom元素執(zhí)行自己唯一的動(dòng)畫(huà)keyframes

實(shí)現(xiàn)層面來(lái)說(shuō),行得通,但是評(píng)論列表長(zhǎng)的時(shí)候,dom數(shù)量巨大,且css大量動(dòng)畫(huà)造成代碼量沉重、無(wú)隨機(jī)性

拋棄css動(dòng)畫(huà),使用canvas 繪制動(dòng)畫(huà)

可行,但是canvas維護(hù)成本略高,且自定義功能難設(shè)計(jì),屏幕適配也有一定成本

js做dom創(chuàng)建,生成隨機(jī)css @keyframes

可行,但是創(chuàng)建style樣式表,引發(fā)css重新渲染頁(yè)面,會(huì)導(dǎo)致頁(yè)面的性能下降,且拋物線css的復(fù)雜度不低,暫不作為首選

js 刷幀 做dom渲染

可行,但是刷幀操作會(huì)造成性能壓力

結(jié)論

canvas雖說(shuō)可行,但由于其開(kāi)發(fā)弊端 本次分享不以canvas為分享內(nèi)容,而是使用最后一種 js刷幀的dom操作

組件結(jié)構(gòu)

由截圖分享,動(dòng)畫(huà)可以分為兩個(gè)模塊,首先,隨機(jī)發(fā)散的粒子具有共性:拋物線動(dòng)畫(huà),淡出,渲染表情

而例子數(shù)量變多之后則為截圖中的效果

但是,由于性能原因,我們需要做到粒子的掌控,實(shí)現(xiàn)資源再利用,那么還需要第二個(gè)模塊,作為粒子的管控組件

所以: 此功能可使用兩個(gè)模塊進(jìn)行開(kāi)發(fā): partical.js 粒子功能 與 boom.js 粒子管理

實(shí)現(xiàn) Partical.js

前置資源:拋物線運(yùn)動(dòng)的物理曲線需要使用Tween.js提供的速度函數(shù)

若不想引入Tween.js 可以使用以下代碼

 
      * Tween.js
      * t: current time(當(dāng)前時(shí)間);
      * b: beginning value(初始值);
      * c: change in value(變化量);
      * d: duration(持續(xù)時(shí)間)。
      * you can visit 'http://easings.net/zh-cn' to get effect
        *
    
        const Quad = {
            easeIn: function(t, b, c, d) {
                return c * (t /= d) * t + b;
            },
            easeOut: function(t, b, c, d) {
                return -c *(t /= d)*(t-2) + b;  
            },
            easeInOut: function(t, b, c, d) {
                if ((t /= d / 2) < 1) return c / 2 * t * t + b;
                return -c / 2 * ((--t) * (t-2) - 1) + b;
            }
        }
        const Linear = function(t, b, c, d) { 
            return c * t / d + b; 
        }

粒子實(shí)現(xiàn)
實(shí)現(xiàn)思路:
希望在粒子管控組件時(shí),使用new partical的方式創(chuàng)建粒子,每個(gè)粒子存在自己的動(dòng)畫(huà)開(kāi)始方法,動(dòng)畫(huà)結(jié)束回調(diào)。
由于評(píng)論列表可能存在數(shù)量巨大的情況,我們希望只全局創(chuàng)建有限個(gè)數(shù)的粒子,那么則提供呢容器移除粒子功能以及容器添加粒子的功能,實(shí)現(xiàn)粒子的復(fù)用

partical_style.css

     
     //粒子充滿粒子容器,需要容器存在尺寸以及relative定位
     .Boom-Partical_Holder{
         position: absolute;
         left:0;
         right:0;
         top:0;
         bottom:0;
         margin:auto;
     }

particle.js

 
 import "partical_style.css";
 
 class Partical{
     // dom為裝載動(dòng)畫(huà)元素的容器 用于設(shè)置位置等樣式
     dom = null;
     // 動(dòng)畫(huà)開(kāi)始時(shí)間
     StartTime = -1;
     // 當(dāng)前粒子的動(dòng)畫(huà)方向,區(qū)別上拋運(yùn)動(dòng)與下拋運(yùn)動(dòng)
     direction = "UP";
     // 動(dòng)畫(huà)延遲
     delay = 0;
     // 三方向位移值
     targetZ = 0;
     targetY = 0;
     targetX = 0;
     // 縮放倍率
     scaleNum = 1;
     // 是否正在執(zhí)行動(dòng)畫(huà)
     animating = false;
     // 粒子的父容器,標(biāo)識(shí)此粒子被渲染到那個(gè)元素內(nèi)
     parent = null;
     // 動(dòng)畫(huà)結(jié)束的回調(diào)函數(shù)列表
     animEndCBList = [];
     // 粒子渲染的內(nèi)容容器 slot
     con = null;
     
     constructor(){
         //創(chuàng)建動(dòng)畫(huà)粒子dom
         this.dom = document.createElement("p");
         this.dom.classList.add("Boom-Partical_Holder");
         this.dom.innerHTML = `
             <p class="Boom-Partical_con">
                 Boom
             </p>
         `;
     }
     
     // 在哪里渲染
     renderIn(parent) {
         // dom判斷此處省略
         parent.appendChild(this.dom);
         this.parent = parent;
         // 此處為初始化 slot 容器
         !this.con && ( this.con = this.dom.querySelector(".Boom-Partical_con"));
     }
     
     // 用于父容器移除當(dāng)前粒子
     deleteEl(){
         // dom判斷此處省略
         this.parent.removeChild(this.dom);
     }
     
     // 執(zhí)行動(dòng)畫(huà),需要此粒子執(zhí)行動(dòng)畫(huà)的角度,動(dòng)畫(huà)的力度,以及延遲時(shí)間
     animate({ deg, pow, delay } = {}){
         // 后續(xù)補(bǔ)全
     }
     
     // 動(dòng)畫(huà)結(jié)束回調(diào)存儲(chǔ)
     onAnimationEnd(cb) {
         if (typeof cb !== 'function') return;
         this.animEndCBList.push(cb);
     }
     
     // 動(dòng)畫(huà)結(jié)束回調(diào)執(zhí)行
     emitEndCB() {
         this.dom.style.cssText += `;-webkit-transform:translate3d(0,0,0);opacity:1;`;
         this.animating = false;
         try {
             for (let cb  of this.animEndCBList) {
                 cb();
             }
         } catch (error) {
             console.warn("回調(diào)報(bào)錯(cuò):",cb);
         }
     }
     
     // 簡(jiǎn)易實(shí)現(xiàn)slot功能,向粒子容器內(nèi)添加元素
     insertChild(child){
         this.con.innerHTML = '';
         this.con.appendChild(child);
     }
 }

致此,我們先創(chuàng)建了一個(gè)粒子對(duì)象的構(gòu)造函數(shù),現(xiàn)在考慮一下我們實(shí)現(xiàn)了我們的設(shè)計(jì)思路嗎?

  • 使用構(gòu)造函數(shù)new Partical( )粒子

  • 粒子實(shí)力對(duì)象存在 animate 執(zhí)行動(dòng)畫(huà)方法

  • 有動(dòng)畫(huà)結(jié)束回調(diào)函數(shù)的存儲(chǔ)和執(zhí)行

  • 設(shè)置粒子的父元素: renderIn 方法

  • 父元素刪除粒子: deleteEl 方法

為了更好的展示粒子內(nèi)容,我們特意在constructor里創(chuàng)建了一個(gè) Boom-Partical_con 元素用于模擬slot功能:  insertChild方法,用于使用者展示不同的內(nèi)容進(jìn)行爆炸

關(guān)于原生JS怎么實(shí)現(xiàn)爆炸的動(dòng)態(tài)效果就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

js
AI