Vue3这一个弹幕从下往上显示数据的页面,需要用到虚拟化技术,不然数据多了,页面会卡顿,用css3技术,让弹幕显示出来很丝滑
时间: 2023-10-31 12:06:16 浏览: 58
vue实现弹幕功能
5星 · 资源好评率100%
确实,如果弹幕数据量很大,直接渲染到页面上可能会导致页面卡顿,影响用户体验。因此,可以考虑使用虚拟化技术来优化弹幕组件。
Vue3提供了一个`<teleport>`组件,可以将一个组件的内容插入到DOM中的任意位置。我们可以使用`<teleport>`组件将弹幕放到一个独立的组件中,然后使用虚拟化技术来优化弹幕的渲染和显示。
下面是一个使用Vue3和CSS3实现弹幕从下往上显示的页面,并使用虚拟化技术优化性能的示例代码:
```html
<template>
<div class="danmu-container">
<teleport to="#danmu-layer">
<div class="danmu-box" v-for="(danmu, index) in visibleList" :key="danmu.id" :style="{ bottom: (index * lineHeight) + 'px', animationDelay: (index * 0.2) + 's' }">{{ danmu.text }}</div>
</teleport>
</div>
<div id="danmu-layer"></div>
</template>
<script>
import { ref, onMounted, onUnmounted } from 'vue';
export default {
name: 'Danmu',
props: {
danmuList: {
type: Array,
default: () => []
}
},
setup(props) {
const lineHeight = 60; // 弹幕行高
const danmuHeight = 40; // 弹幕高度
const danmuSpeed = 2; // 弹幕速度,每秒移动的像素数
const visibleCount = 10; // 可见弹幕数量
const visibleList = ref([...props.danmuList].slice(0, visibleCount)); // 可见弹幕列表
let timer = null; // 定时器
// 添加弹幕
function addDanmu(danmu) {
props.danmuList.push(danmu);
}
// 开始定时器
function startTimer() {
timer = setInterval(() => {
moveDanmu();
}, 16);
}
// 停止定时器
function stopTimer() {
clearInterval(timer);
}
// 移动弹幕
function moveDanmu() {
for (let i = 0; i < visibleList.value.length; i++) {
const danmu = visibleList.value[i];
danmu.bottom -= danmuSpeed;
if (danmu.bottom <= -danmuHeight) {
visibleList.value.splice(i, 1);
i--;
}
}
if (visibleList.value.length < visibleCount && props.danmuList.length > visibleList.value.length) {
const newDanmu = props.danmuList[visibleList.value.length];
newDanmu.bottom = lineHeight * visibleList.value.length;
visibleList.value.push(newDanmu);
}
}
阅读全文