摘要:爆炸動(dòng)效分享前言此次分享是一次自我組件開發(fā)的總結(jié),還是有很多不足之處,望各位大大多提寶貴意見,互相學(xué)習(xí)交流。粒子實(shí)現(xiàn)實(shí)現(xiàn)思路希望在粒子管控組件時(shí),使用的方式創(chuàng)建粒子,每個(gè)粒子存在自己的動(dòng)畫開始方法,動(dòng)畫結(jié)束回調(diào)。
爆炸動(dòng)效分享 前言
此次分享是一次自我組件開發(fā)的總結(jié),還是有很多不足之處,望各位大大多提寶貴意見,互相學(xué)習(xí)交流。
分享內(nèi)容介紹通過原生js代碼,實(shí)現(xiàn)粒子爆炸效果組件效果預(yù)覽 效果分析
組件開發(fā)過程中,使用到了公司內(nèi)部十分高效的工程化環(huán)境,特此打個(gè)廣告: 新浪移動(dòng)誠(chéng)招各種技術(shù)大大!可以私聊投簡(jiǎn)歷哦!
點(diǎn)擊作為動(dòng)畫開始的起點(diǎn),自動(dòng)結(jié)束
每次效果產(chǎn)生多個(gè)拋物線粒子運(yùn)動(dòng)的元素,方向隨機(jī),展示內(nèi)容不一樣,有空間上Z軸的大小變化
需求上可以無間隔點(diǎn)擊,即第一組動(dòng)畫未結(jié)束可播放第二組動(dòng)畫
動(dòng)畫基本執(zhí)行時(shí)長(zhǎng)一致
不可取,效果可多次連點(diǎn),css狀態(tài)變換與需求不符
不可取,單次執(zhí)行動(dòng)畫沒有問題,但是存在效果的固定,以及無法連續(xù)執(zhí)行動(dòng)畫
實(shí)現(xiàn)層面來說,行得通,但是評(píng)論列表長(zhǎng)的時(shí)候,dom數(shù)量巨大,且css大量動(dòng)畫造成代碼量沉重、無隨機(jī)性
可行,但是canvas維護(hù)成本略高,且自定義功能難設(shè)計(jì),屏幕適配也有一定成本
可行,但是創(chuàng)建style樣式表,引發(fā)css重新渲染頁(yè)面,會(huì)導(dǎo)致頁(yè)面的性能下降,且拋物線css的復(fù)雜度不低,暫不作為首選
可行,但是刷幀操作會(huì)造成性能壓力
canvas雖說可行,但由于其開發(fā)弊端 本次分享不以canvas為分享內(nèi)容,而是使用最后一種 js刷幀的dom操作
組件結(jié)構(gòu)由截圖分享,動(dòng)畫可以分為兩個(gè)模塊,首先,隨機(jī)發(fā)散的粒子具有共性:拋物線動(dòng)畫,淡出,渲染表情
而例子數(shù)量變多之后則為截圖中的效果
但是,由于性能原因,我們需要做到粒子的掌控,實(shí)現(xiàn)資源再利用,那么還需要第二個(gè)模塊,作為粒子的管控組件
所以: 此功能可使用兩個(gè)模塊進(jìn)行開發(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)畫開始方法,動(dòng)畫結(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)畫元素的容器 用于設(shè)置位置等樣式 dom = null; // 動(dòng)畫開始時(shí)間 StartTime = -1; // 當(dāng)前粒子的動(dòng)畫方向,區(qū)別上拋運(yùn)動(dòng)與下拋運(yùn)動(dòng) direction = "UP"; // 動(dòng)畫延遲 delay = 0; // 三方向位移值 targetZ = 0; targetY = 0; targetX = 0; // 縮放倍率 scaleNum = 1; // 是否正在執(zhí)行動(dòng)畫 animating = false; // 粒子的父容器,標(biāo)識(shí)此粒子被渲染到那個(gè)元素內(nèi) parent = null; // 動(dòng)畫結(jié)束的回調(diào)函數(shù)列表 animEndCBList = []; // 粒子渲染的內(nèi)容容器 slot con = null; constructor(){ //創(chuàng)建動(dòng)畫粒子dom this.dom = document.createElement("div"); this.dom.classList.add("Boom-Partical_Holder"); this.dom.innerHTML = `Boom`; } // 在哪里渲染 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)畫,需要此粒子執(zhí)行動(dòng)畫的角度,動(dòng)畫的力度,以及延遲時(shí)間 animate({ deg, pow, delay } = {}){ // 后續(xù)補(bǔ)全 } // 動(dòng)畫結(jié)束回調(diào)存儲(chǔ) onAnimationEnd(cb) { if (typeof cb !== "function") return; this.animEndCBList.push(cb); } // 動(dòng)畫結(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)畫方法
有動(dòng)畫結(jié)束回調(diào)函數(shù)的存儲(chǔ)和執(zhí)行
設(shè)置粒子的父元素: renderIn 方法
父元素刪除粒子: deleteEl 方法
為了更好的展示粒子內(nèi)容,我們特意在constructor里創(chuàng)建了一個(gè) Boom-Partical_con 元素用于模擬slot功能: insertChild方法,用于使用者展示不同的內(nèi)容進(jìn)行爆炸
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/53156.html
摘要:爆炸動(dòng)效分享前言此次分享是一次自我組件開發(fā)的總結(jié),還是有很多不足之處,望各位大大多提寶貴意見,互相學(xué)習(xí)交流。粒子實(shí)現(xiàn)實(shí)現(xiàn)思路希望在粒子管控組件時(shí),使用的方式創(chuàng)建粒子,每個(gè)粒子存在自己的動(dòng)畫開始方法,動(dòng)畫結(jié)束回調(diào)。 爆炸動(dòng)效分享 前言 此次分享是一次自我組件開發(fā)的總結(jié),還是有很多不足之處,望各位大大多提寶貴意見,互相學(xué)習(xí)交流。 分享內(nèi)容介紹 通過原生js代碼,實(shí)現(xiàn)粒子爆炸效果組件組件開發(fā)...
摘要:爆炸動(dòng)效分享前言此次分享是一次自我組件開發(fā)的總結(jié),還是有很多不足之處,望各位大大多提寶貴意見,互相學(xué)習(xí)交流。粒子實(shí)現(xiàn)實(shí)現(xiàn)思路希望在粒子管控組件時(shí),使用的方式創(chuàng)建粒子,每個(gè)粒子存在自己的動(dòng)畫開始方法,動(dòng)畫結(jié)束回調(diào)。 爆炸動(dòng)效分享 前言 此次分享是一次自我組件開發(fā)的總結(jié),還是有很多不足之處,望各位大大多提寶貴意見,互相學(xué)習(xí)交流。 分享內(nèi)容介紹 通過原生js代碼,實(shí)現(xiàn)粒子爆炸效果組件組件開發(fā)...
閱讀 3563·2021-10-09 09:43
閱讀 6178·2021-09-07 10:15
閱讀 2763·2019-08-30 14:03
閱讀 3091·2019-08-29 11:01
閱讀 1728·2019-08-29 10:56
閱讀 1092·2019-08-28 17:52
閱讀 3511·2019-08-26 11:42
閱讀 2567·2019-08-26 10:33