vue实现歌词随音乐同步滚动

请求回来的歌词是以下格式

第一步先处理歌词

 if (this.lyricList.lyric) { //判断有没有歌词,因为有些音乐没有歌词

        arr = this.lyricList.lyric.split(/[(\f\n)\r\t\v]/).map((item, i) => { //用正则的换行符分割

          let min = item.slice(1, 3);
          let sec = item.slice(4, 6);
          let mill = item.slice(7, 10);
          let lrc = item.slice(11, item.length)
          let time = parseInt(min) * 60 * 1000 + parseInt(sec) * 1000 + parseInt(mill)  //把分钟变成秒,秒变成毫秒
          if (isNaN(Number(mill))) { //判断是不是数字 不是的话进行二次分割  有些还是这种格式的 53]
            mill = item.slice(7, 9);
            lrc = item.slice(10, item.length)
            time = parseInt(min) * 60 * 1000 + parseInt(sec) * 1000 + parseInt(mill) //把分钟变成秒,秒变成毫秒
          }
          return { min, sec, mill, lrc, time }

        })
        arr.forEach((item, i) => {  //歌词到了最后一句的处理
          if (i === arr.length - 1 || isNaN(arr[i + 1].time)) {
            
            item.pre = 100000  

          } else { //没到最后一句 那么久等于下一句歌词的时间
            item.pre = arr[i + 1].time
          }
        });
        // console.log(arr);
        
        return arr

      }

数据处理后 打印arr数组就是这样的结构

然后进行渲染

 <div class="musidLyric" ref="musidLyric" v-show="isLyricShow">
      <p v-for="item in lyric" :key="item"
        :class="{ active: currenTume * 1000 >= item.time && currenTume * 1000 < item.pre }">{{ item.lrc }}</p>
    </div>

currenTume * 1000 >= item.time && currenTume * 1000 < item.pre 
//这里判断的意思是歌曲播放的时长大于上一句歌词结束的时间 或者小于下一句歌词的时间 中间就是正在播放的歌词 

//currenTume audio 里的属性

//pre   上句歌词的时间

//item   下句歌词的时间

监听然后就完事了

 watch: {
    currenTume(newValue) {
      let p = document.querySelector('p.active') //获取这个p标签里的active


      if (p) {
        if (p.offsetTop > 300) {

          this.$refs.musidLyric.scrollTop = p.offsetTop - 300 //如果p的高度超过了300 让父元素的可视高度等于 p元素超过的高减300 让父元素可视高在300内

        }
      }

      if (newValue === this.duration) { //当前的时长等于总时长的时候 自动播放下一首

        if (this.playListIndex === this.playList.length - 1) {
          this.updatePlayListIndex(0);
          this.play() 
        } else {
          this.updatePlayListIndex(this.playListIndex + 1)
        }
      }
    }
  }

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值