mirror of
https://github.com/algerkong/AlgerMusicPlayer.git
synced 2026-04-25 00:37:24 +08:00
完成歌词滚动
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="drawer-target" :class="musicFullClass" v-if="musicFull">
|
<!-- 展开全屏 -->
|
||||||
|
<div id="drawer-target" :class="musicFullClass" v-show="musicFull">
|
||||||
<div class="music-img">
|
<div class="music-img">
|
||||||
<img class="img" :src="playMusic.picUrl + '?param=300y300'" />
|
<img class="img" :src="playMusic.picUrl + '?param=300y300'" />
|
||||||
</div>
|
</div>
|
||||||
@@ -11,17 +12,25 @@
|
|||||||
:key="index"
|
:key="index"
|
||||||
>{{ item.name }}{{ index < playMusic.song.artists.length - 1 ? ' / ' : '' }}</span>
|
>{{ item.name }}{{ index < playMusic.song.artists.length - 1 ? ' / ' : '' }}</span>
|
||||||
</div>
|
</div>
|
||||||
<n-layout class="music-lrc" :native-scrollbar="false">
|
<n-layout
|
||||||
|
class="music-lrc"
|
||||||
|
style="height: 550px;"
|
||||||
|
ref="lrcSider"
|
||||||
|
:native-scrollbar="false"
|
||||||
|
@mouseover="mouseOverLayout"
|
||||||
|
@mouseleave="mouseLeaveLayout"
|
||||||
|
>
|
||||||
<template v-for="(item,index) in lrcArray" :key="index">
|
<template v-for="(item,index) in lrcArray" :key="index">
|
||||||
<div
|
<div
|
||||||
class="music-lrc-text"
|
class="music-lrc-text"
|
||||||
:class="{ 'now-text': isCurrentLrc(index) }"
|
:class="{ 'now-text': isCurrentLrc(index) }"
|
||||||
|
@click="setAudioTime(index)"
|
||||||
>{{ item.text }}</div>
|
>{{ item.text }}</div>
|
||||||
</template>
|
</template>
|
||||||
</n-layout>
|
</n-layout>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- 底部播放栏 -->
|
||||||
<div class="music-play-bar" :class="setAnimationClass('animate__bounceInUp')">
|
<div class="music-play-bar" :class="setAnimationClass('animate__bounceInUp')">
|
||||||
<img class="play-bar-img" :src="playMusic.picUrl + '?param=200y200'" @click="setMusicFull" />
|
<img class="play-bar-img" :src="playMusic.picUrl + '?param=200y200'" @click="setMusicFull" />
|
||||||
<div class="music-content">
|
<div class="music-content">
|
||||||
@@ -148,6 +157,27 @@ const getAllTime = computed(() => {
|
|||||||
return secondToMinute(allTime.value)
|
return secondToMinute(allTime.value)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 获取歌词滚动dom
|
||||||
|
const lrcSider = ref<any>(null)
|
||||||
|
// 当前播放的是哪一句歌词
|
||||||
|
const newLrcIndex = ref(0)
|
||||||
|
const isMouse = ref(false)
|
||||||
|
// 歌词滚动方法
|
||||||
|
const lrcScroll = () => {
|
||||||
|
if (musicFull.value && !isMouse.value) {
|
||||||
|
let top = newLrcIndex.value * 50 - 225;
|
||||||
|
lrcSider.value.scrollTo({ top: top, behavior: 'smooth' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const mouseOverLayout = () => {
|
||||||
|
isMouse.value = true
|
||||||
|
}
|
||||||
|
const mouseLeaveLayout = () => {
|
||||||
|
setTimeout(() => {
|
||||||
|
isMouse.value = false
|
||||||
|
}, 3000);
|
||||||
|
}
|
||||||
|
|
||||||
// 监听音乐播放 获取时间
|
// 监听音乐播放 获取时间
|
||||||
const onAudio = (audio: any) => {
|
const onAudio = (audio: any) => {
|
||||||
audio.addEventListener("timeupdate", function () {//监听音频播放的实时时间事件
|
audio.addEventListener("timeupdate", function () {//监听音频播放的实时时间事件
|
||||||
@@ -162,6 +192,8 @@ const onAudio = (audio: any) => {
|
|||||||
// 获取音量
|
// 获取音量
|
||||||
audioVolume.value = audio.volume
|
audioVolume.value = audio.volume
|
||||||
|
|
||||||
|
lrcScroll()
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,12 +236,10 @@ const lrcTimeArray = ref<Array<Number>>([])
|
|||||||
const loadLrc = async () => {
|
const loadLrc = async () => {
|
||||||
const { data } = await getMusicLrc(playMusic.value.id)
|
const { data } = await getMusicLrc(playMusic.value.id)
|
||||||
lrcData.value = data
|
lrcData.value = data
|
||||||
console.log(data);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let musicText = data.lrc.lyric
|
|
||||||
|
|
||||||
console.log(musicText);
|
let musicText = data.lrc.lyric
|
||||||
//歌词时间
|
//歌词时间
|
||||||
let timeArray = musicText.match(/(\d{2}):(\d{2})(\.(\d*))?/g)
|
let timeArray = musicText.match(/(\d{2}):(\d{2})(\.(\d*))?/g)
|
||||||
let timeArrayNum: Array<Number> = []
|
let timeArrayNum: Array<Number> = []
|
||||||
@@ -220,10 +250,8 @@ const loadLrc = async () => {
|
|||||||
timeArrayNum.push(parseInt(item.split(':')[0]) * 60 + parseFloat(item.split(':')[1]));
|
timeArrayNum.push(parseInt(item.split(':')[0]) * 60 + parseFloat(item.split(':')[1]));
|
||||||
})
|
})
|
||||||
lrcTimeArray.value = timeArrayNum
|
lrcTimeArray.value = timeArrayNum
|
||||||
console.log(lrcTimeArray.value)
|
|
||||||
//歌词
|
//歌词
|
||||||
let musicTextArray = musicText.replace(/(\[(\d{2}):(\d{2})(\.(\d*))?\])/g, '').split('\n')
|
let musicTextArray = musicText.replace(/(\[(\d{2}):(\d{2})(\.(\d*))?\])/g, '').split('\n')
|
||||||
console.log(musicTextArray)
|
|
||||||
let text = []
|
let text = []
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -236,7 +264,6 @@ const loadLrc = async () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
lrcArray.value = text
|
lrcArray.value = text
|
||||||
console.log(text)
|
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
text = []
|
text = []
|
||||||
@@ -248,10 +275,18 @@ const loadLrc = async () => {
|
|||||||
|
|
||||||
// 是否是当前正在播放的歌词
|
// 是否是当前正在播放的歌词
|
||||||
const isCurrentLrc = (index: any) => {
|
const isCurrentLrc = (index: any) => {
|
||||||
return !(nowTime.value <= lrcTimeArray.value[index] || nowTime.value >= lrcTimeArray.value[index + 1])
|
let isTrue = !(nowTime.value <= lrcTimeArray.value[index] || nowTime.value >= lrcTimeArray.value[index + 1])
|
||||||
|
if (isTrue) {
|
||||||
|
newLrcIndex.value = index
|
||||||
|
|
||||||
|
}
|
||||||
|
return isTrue
|
||||||
|
}
|
||||||
|
// 设置当前播放时间
|
||||||
|
const setAudioTime = (index: any) => {
|
||||||
|
audio.value.currentTime = lrcTimeArray.value[index]
|
||||||
|
audio.value.play()
|
||||||
}
|
}
|
||||||
onMounted(() => {
|
|
||||||
})
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -281,12 +316,16 @@ onMounted(() => {
|
|||||||
width: 800px;
|
width: 800px;
|
||||||
height: 550px;
|
height: 550px;
|
||||||
&-text {
|
&-text {
|
||||||
@apply text-center text-white text-lg py-2;
|
@apply text-white text-lg flex justify-center items-center cursor-pointer;
|
||||||
|
height: 50px;
|
||||||
|
transition: all 0.2s ease-out;
|
||||||
|
&:hover {
|
||||||
|
@apply font-bold text-xl text-red-500;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.now-text {
|
.now-text {
|
||||||
@apply font-bold text-xl text-red-500;
|
@apply font-bold text-xl text-red-500;
|
||||||
transition: all 0.3s ease-out;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user