推廣-Vue3.x實(shí)現(xiàn)彈幕功能

前言

彈幕功能在大伙刷視頻、直播的時(shí)候肯定都有遇到過,可以讓觀看者之間有一個(gè)很好的互動(dòng)效果赃泡。我想用在vue3.X里用這個(gè)功能但是沒找到,就拿了2版本的改了下乘盼,在這推廣推廣升熊,歡迎大家來用!绸栅!

使用介紹

安裝

$ npm install vue3-barrage --save

導(dǎo)入

// main.ts
import vue3Barrage from 'vue3-barrage';
app.use(vue3Barrage);

案例

<template>
  <vue3-barrage ref="barrage" :lanesCount="6" :boxHeight="data.stageHeight" :isShow="data.barrageIsShow" :list="data.list" :loop="data.barrageLoop" :speed="data.speed" attachId="barrage" :fontSize="data.fontSize">
    <!-- 自定義彈幕樣式 -->
    <template #barrage="list">
      <span style="color: #00099">{{ list.item.msg }}</span>
    </template>
  </vue3-barrage>
</template>

<script setup lang="ts">
import { ref, reactive } from 'vue';
type PositionStatus = 'normal' | 'top' | 'bottom';

interface BarrageList {
  msg: string | undefined;
  position: PositionStatus;
}

// 響應(yīng)式數(shù)據(jù)
let data = reactive({
  barrageList: [] as Array<BarrageList>,
  msg: [
    '禮',
    '老子',
    '孔子云:',
    '何陋之有',
    '談笑有鴻儒',
    '孔子云:何陋之有级野?',
    '山不在高,有仙則名',
    '予謂菊阴幌,花之隱逸者也',
    '無絲竹之亂耳勺阐,無案牘之勞形',
    'Hello! vue3-barrage 0.0.1',
    '崇禎五年十二月卷中,余住西湖',
    '莫說相公癡,更有癡似相公者渊抽。',
    '先天下之憂而憂蟆豫,后天下之樂而樂',
    '是進(jìn)亦憂,退亦憂懒闷。然則何時(shí)而樂耶十减?',
    '居廟堂之高則憂其民,處江湖之遠(yuǎn)則憂其君愤估。',
    '嗟夫帮辟!予嘗求古仁人之心,或異二者之為玩焰,何哉由驹?',
    '是日更定矣,余拏一小舟昔园,擁毳衣爐火蔓榄,獨(dú)往湖心亭看雪',
    '惟長堤一痕、湖心亭一點(diǎn)默刚、與余舟一芥甥郑、舟中人兩三粒而已。',
    '醉翁之意不在酒荤西,在乎山水之間也澜搅。山水之樂,得之心而寓之酒也邪锌。',
    '然而禽鳥知山林之樂勉躺,而不知人之樂;人知從太守游而樂秃流,而不知太守之樂其樂也赂蕴。',
  ],
  position: 'normal',
  fontSize: 12,
  stageHeight: 300,
  barrageIsShow: true,
  currentId: 0,
  barrageLoop: true,
  speed: 10
});
const addToList = () => {
  if (data.position === 'bottom') {
    const arr: Array<BarrageList> = Array.from({ length: 3 }, (e) => {
      return {
        id: ++data.currentId,
        msg: data.msg[Math.floor(Math.random() * 20)],
        position: 'bottom',
      };
    });
    data.barrageList.push(...arr);
  } else if (data.position === 'top') {
    const arr: Array<BarrageList> = Array.from({ length: 3 }, (e) => {
      return {
        id: ++data.currentId,
        msg: data.msg[Math.floor(Math.random() * 20)],
        position: 'top',
      };
    });
    data.barrageList.push(...arr);
  } else {
    const arr: Array<BarrageList> = Array.from({ length: 30 }, (e) => {
      return {
        id: ++data.currentId,
        msg: data.msg[Math.floor(Math.random() * 20)],
        position: 'top',
      };
    });
    data.barrageList.push(...arr);
  }
};

</script>

屬性

參數(shù) 說明 類型 可選值 默認(rèn)值
attachId 掛載的DOM元素id,不設(shè)置就正常顯示 string
isShow 是否展示彈幕 Boolean true
list 彈幕列表 Array []
lanesCount 彈幕軌道數(shù)量 Number 5
boxWidth 元素寬度 Number 父元素寬度
boxHeight 元素高度 Number 父元素高度
fontSize 彈幕字體大小舶胀,單位px Number 18
speed 彈幕速度 Number 1-10 6
loop 是否循環(huán)展示 Boolean false
defineLanes 自定義彈幕顯示軌道。注意必須返回一個(gè)[1-lanesCount]的數(shù)字 Function

list屬性

參數(shù) 說明 類型
msg 彈幕文本 string
position 彈幕位置碧注。滾動(dòng)嚣伐、頂部固定、底部固定 normal | top | bottom
其他 自己定義的在插槽里自己使用萍丐,插槽使用見下面

方法

方法 說明 參數(shù)
maxRows 最大行數(shù)改變時(shí)觸發(fā) (value: number)

插槽配置

<template>
  <vue-barrage ref="barrage" :lanesCount="6" :boxHeight="data.stageHeight" :isShow="data.barrageIsShow" :list="data.list" :loop="data.barrageLoop" :speed="data.speed" attachId="barrage" :fontSize="data.fontSize">
    <!-- 自定義彈幕樣式 -->
    <!-- #barrage為聚名插槽轩端,必須為這個(gè),下面item也必須為item逝变,其他自定義 -->
    <!-- item里自己加的東西就自己發(fā)揮了 -->
    <template #barrage="xxx">
      <span style="color: #00099">{{ xxx.item.msg }}</span>
    </template>
  </vue-barrage>
</template>

實(shí)現(xiàn)原理

看了幾個(gè)2版本的源代碼基茵,基本都是使用css的animation屬性實(shí)現(xiàn)動(dòng)畫的效果奋构。
我使用的是requestAnimationFrame結(jié)合css transform屬性實(shí)現(xiàn)動(dòng)畫的效果。requestAnimationFrame字面意思:請求動(dòng)畫幀拱层。官方解釋:幀動(dòng)畫弥臼。就是可以一幀一幀的執(zhí)行動(dòng)畫。詳細(xì)的介紹可以去這里看:全面了解requestAnimationFrame根灯。

requestAnimationFrame實(shí)現(xiàn)幀刷新径缅,然后配合方法修改transform參數(shù)從而達(dá)到移動(dòng)的效果。固定的效果就固定transform參數(shù)不變烙肺,到時(shí)間了移除就實(shí)現(xiàn)了纳猪。

核心原理就這兩句話,感興趣的朋友去源碼看下桃笙,原理簡單氏堤,就是數(shù)據(jù)的處理寫了一大堆。

缺點(diǎn)

還有不足的就是和時(shí)間的關(guān)聯(lián)沒實(shí)現(xiàn)搏明,拿到彈幕列表鼠锈,一股腦的全部顯示就沒了,不懂如何優(yōu)雅的和時(shí)間關(guān)聯(lián)熏瞄,有idea的朋友歡迎評論告訴下脚祟,十分感謝!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末强饮,一起剝皮案震驚了整個(gè)濱河市由桌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邮丰,老刑警劉巖行您,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剪廉,居然都是意外死亡娃循,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門斗蒋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捌斧,“玉大人,你說我怎么就攤上這事泉沾±搪欤” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵跷究,是天一觀的道長姓迅。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么丁存? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任肩杈,我火速辦了婚禮,結(jié)果婚禮上解寝,老公的妹妹穿的比我還像新娘扩然。我一直安慰自己,他們只是感情好编丘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布与学。 她就那樣靜靜地躺著,像睡著了一般嘉抓。 火紅的嫁衣襯著肌膚如雪索守。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天抑片,我揣著相機(jī)與錄音卵佛,去河邊找鬼。 笑死敞斋,一個(gè)胖子當(dāng)著我的面吹牛截汪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播植捎,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衙解,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焰枢?” 一聲冷哼從身側(cè)響起蚓峦,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎济锄,沒想到半個(gè)月后暑椰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荐绝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年一汽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片低滩。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡召夹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恕沫,到底是詐尸還是另有隱情戳鹅,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布昏兆,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏爬虱。R本人自食惡果不足惜隶债,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跑筝。 院中可真熱鬧死讹,春花似錦、人聲如沸曲梗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虏两。三九已至愧旦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間定罢,已是汗流浹背笤虫。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祖凫,地道東北人琼蚯。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像惠况,于是被迫代替她去往敵國和親遭庶。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容