不碰撞彈幕研究和實現
現在網路上有很多彈幕的實現代碼,主要分為以上兩類:
1.js或者jq
下載過幾個來看,它們無疑都存在這幾個特點。
要麼是划過一段彈幕後,中間間隔很長時間出現第二段彈幕,原因是為了控制不重疊;
要麼是都是按著順序來播放,所有的彈幕都有且只出現一次;
絕大多數都是通過改變絕對定位的top,left值來執行運動軌跡,無疑增大性能損耗;
都只是一個超簡單的小demo,只供參考,提供一下理解思路。
2.canvas畫布
這個方法網路上並不多,個人認為還是比上面那種好很多,重要的是它不是像上面js或者jq那樣是通過改變left的逐步遞減來操作的,而是在畫布上不斷重繪,減少了一些性能損耗,但還是有弊端的。
js方法可以對dom節點進行各種監聽,但canvas不行;
js方法可以控制不重疊,但不能真正實現重複無限循環,canvas可以控制重複循環,但不能實現不重疊。
我總結出來的也就這些,如果有異議的,我會虛心學習的~~~
接下來,我要說的是我自己在各位前輩的文獻上整理的一個關於「不碰撞重複循環彈幕」,顧名思義,你懂。
實現後的效果圖如下:
具體運用的技術:
彈幕從右邊滑到左邊,用到的是css3中的transform動畫,當然不是去改變translate3d的值,而是改變animation中的duration屬性,來控制每個彈幕的運行時間,以及animation中的delay來控制下一個彈幕出現的時間。
你有多少個彈幕,頁面element就幾個節點,不會特地去生成新的一批節點來循環,所有的順序都是無序的。
增加了「暫停」「開始」按鈕,為了在有些項目中,特別是我目前做的單頁面項目,作為切換其他路由時,能暫停住當前的彈幕,返回時,開啟彈幕,位置一直都沒改變,就是那種很自然的混合型app,很聽話的那種。
插件入口配置:
考慮到非同步獲取數據,增加了幾個配置,如圖所示,我們可以控制。
road_high彈幕的行高可固定可隨機,默認隨機;
road_per_runner每一行中彈幕最多的數量,意思是如果你設置20的話,你設置的越大,每條彈幕越密集,但是插件內部做了處理,它不管你設置的多大,他們都不會互相碰撞,只會按照他們自己的速度慢慢的滾完一條又一條;
duration速度如果設為1,超級快,簡直跟火箭一樣,不傳就默認插件本身設置的隨機;
click_call是一個回調函數,當你點擊了彈幕中的任何一條,它會返回element節點。
不碰撞彈幕-純JS實現鏈接
不碰撞彈幕-純JS實現
不碰撞彈幕-Vue單頁面實現鏈接
不碰撞彈幕-Vue組件實現
推薦閱讀:
※Vue.js 的官方文檔是不是太簡略了點?
※為什麼到2017年7月,知乎上已經很少見到討論angular了?
※Angular2 相比 Vue 有什麼優勢?
※各位,來談談用element-ui遇到的bug吧?
※前端來防止csrf,這個做法是否有漏洞?