vue歌词滚动实现
Vue 歌词滚动实现
使用 CSS 和 Vue 实现基础滚动
通过 CSS 的 transform 和 Vue 的 v-for 指令,可以实现歌词的垂直滚动效果。定义一个包含歌词的数组,并使用 v-for 渲染到页面上。
<template>
<div class="lyrics-container">
<div
class="lyrics-line"
v-for="(line, index) in lyrics"
:key="index"
:class="{ 'active': currentLine === index }"
>
{{ line.text }}
</div>
</div>
</template>
<script>
export default {
data() {
return {
lyrics: [
{ text: "第一行歌词", time: 0 },
{ text: "第二行歌词", time: 2 },
{ text: "第三行歌词", time: 5 }
],
currentLine: 0
};
}
};
</script>
<style>
.lyrics-container {
height: 300px;
overflow: hidden;
position: relative;
}
.lyrics-line {
padding: 10px;
text-align: center;
transition: transform 0.3s ease;
}
.lyrics-line.active {
color: red;
transform: translateY(-50%);
}
</style>
动态计算滚动位置
根据当前播放时间动态计算应该高亮显示的歌词行,并调整滚动位置。通过监听播放时间的变化,更新 currentLine。

export default {
methods: {
updateCurrentLine(currentTime) {
for (let i = 0; i < this.lyrics.length; i++) {
if (currentTime >= this.lyrics[i].time) {
this.currentLine = i;
}
}
}
}
};
平滑滚动效果
使用 CSS 的 transform 和 transition 属性实现平滑滚动效果。通过计算当前高亮行的位置,调整容器的滚动偏移量。
.lyrics-container {
scroll-behavior: smooth;
}
使用第三方库优化
如果需要更复杂的滚动效果,可以考虑使用第三方库如 better-scroll 或 vue-virtual-scroller。这些库提供了更灵活的滚动控制和性能优化。

import BScroll from 'better-scroll';
export default {
mounted() {
this.scroll = new BScroll(this.$refs.lyricsContainer, {
scrollY: true,
probeType: 3
});
}
};
响应式设计
确保歌词滚动组件在不同屏幕尺寸下都能正常显示。通过媒体查询调整容器高度和字体大小。
@media (max-width: 768px) {
.lyrics-container {
height: 200px;
}
}
性能优化
对于大量歌词数据,使用虚拟滚动技术减少 DOM 元素数量,提高渲染性能。vue-virtual-scroller 是一个不错的选择。
import { RecycleScroller } from 'vue-virtual-scroller';
export default {
components: {
RecycleScroller
}
};
以上方法涵盖了从基础实现到高级优化的多种方案,可以根据具体需求选择合适的实现方式。






