vue实现歌词滚动

news/2024/7/10 0:31:31 标签: vue
  • 请求回来的歌词文件是下面的形式

‘[00:00.000] 作词 : 林夕↵[00:01.000] 作曲 : Robert Lay↵[00:14.310]如果 兄妹相称太多↵[00:19.610]醒不起喜欢我’

  • 1 先处理歌词
    // 处理歌词,转化成key为时间,value为歌词的对象
    let lyricArr = data.lrc.lyric.split('[').slice(1); // 先以[进行分割
     let lrcObj = {};
     lyricArr.forEach(item => {
         let arr = item.split(']');	// 再分割右括号
         // 时间换算成秒
         let m = parseInt(arr[0].split(':')[0])
         let s = parseInt(arr[0].split(':')[1])
         arr[0] = m*60 + s;
         if (arr[1] != '\n') { // 去除歌词中的换行符
             lrcObj[arr[0]] = arr[1];
         }
     })
     // 存储数据
     this.currentMUsicLyric = lrcObj;
 })

处理后的歌词
在这里插入图片描述

  • 2 循环渲染
	// lyricIndex为当前歌曲播放的进度在歌词中的位置,进而改变正在播放的歌词的样式
    <ul class="lyric" v-show="isShowMusicList" ref="lyric">
        <li :class="{each:true, choose: (index==lyricIndex)}" v-for="(item, key, index) in currentMUsicLyric" :key="key">{{item}}</li>
    </ul>
  • 3 scss
.lyric {
        width: 400px;
        height: 300px;
        position: absolute;
        top: -312px;
        left: 774px;
        background-color: #333;
        // 滚动条
        overflow: auto;
        color: #ddd;
        font-size: 10px;
        font-weight: normal;
        padding: 5px 10px;
        border: 1px solid #000;
        border-left: none;
        .each {
        height: 30px;
        // border: 1px solid #000;
        line-height: 30px;
        text-align: center;
        }
        .choose {
            height: 30px;
            line-height: 30px;
            font-size: 20px;
        }
        // 修改滚动条样式
        &::-webkit-scrollbar {
            width: 3px;
            height: 1px;
        }
        // 滑块部分
        &::-webkit-scrollbar-thumb {
            background-color: #eee;
        }
        // 轨道部分
        &::-webkit-scrollbar-track {
            background-color: #333;
        }
    }
  • 4 js
        // 使用watch监听当前歌曲进度value的变化处理歌词位置
        value() {
            let i = 0
            // 循环歌词对象
            for (let key in this.currentMUsicLyric) {
            // key表示歌词对象中的时间,如果key等于歌曲进度value,改变当前歌词进度		lyricIndex
                if (+key == this.value) {
                    this.lyricIndex = i;
                    // 当歌词进度大于5,即播放到了第5句歌词,开始滚动
                    if (i > 5) {
                        this.$refs.lyric.scrollTop = 30 * (i - 5);
                    }
                }
                i++;
            }
        }

效果展示
在这里插入图片描述


http://www.niftyadmin.cn/n/734953.html

相关文章

MS SQL作业Schedule的限制注意事项

原文:MS SQL作业Schedule的限制注意事项最近遇到了一个关于MS SQL作业Schedule下有限制的特殊案例&#xff0c;有一个作业&#xff0c;用户要求执行的时间为&#xff1a;9:30&#xff0c;14:30&#xff0c;16:30&#xff0c; 19:00&#xff0c;于是我设置了两个Schedule&#x…

修改tomcat的默认主页

打开tomcat的安装目录下的 conf/server.xml&#xff0c;在 <Host name"localhost" debug"0" appBase"webapps" unpackWARs"true" autoDeploy"true"></Host> 之间加上 <Context path"" docBase&quo…

你所不知道的抖音赚钱方法,原来可以这样玩!

这篇文章略长&#xff0c;但是承载了非常多的干货&#xff0c;望你认真看完。我相信在18年没有谁不知道抖音的火爆程度&#xff0c;当你出行或者朋友聚会的时候&#xff0c;总能看到低头刷抖音的身影&#xff0c;而在大街逛街或者公园散步的时候&#xff0c;也随处可见随着魔性…

原生js实现选项卡

1 html <div id"app" class"app"><div class"header"><span class"choose">精选</span><span>社会</span><span>娱乐</span><span>体育</span></div><div clas…

OCP认证052考试最新考试题库和答案整理-33

33、Where Is backup metadata stored for use by Recovery Manager (RMAN)? A) In the control file B) In the SYSAUX tablespace C) in the SPFILE D) in the SYSTEM tablespace E) In the diagnostic destination flies Answer:A 转载于:https://www.cnblogs.com/cnblogs5…

分库分表的面试题4

1、面试题 分库分表之后&#xff0c;id主键如何处理&#xff1f; 2、面试官心里分析 其实这是分库分表之后你必然要面对的一个问题&#xff0c;就是id咋生成&#xff1f;因为要是分成多个表之后&#xff0c;每个表都是从1开始累加&#xff0c;那肯定不对啊&#xff0c;需要一个…

节流和防抖函数,函数的节流和防抖

1 基于操作的节流&#xff0c;防抖 定义函数&#xff0c;绑定滚动事件 var num 0; function demo(){console.log(num); }// 基于操作的节流&#xff0c;防抖 // 定义定时器句柄 var timebar // 高频事件 window.onscroll function(){// 基于操作的&#xff0c;在高频事件中…

阿拉玛之魂

This is a very interesting, puzzle game. Users use their bows and arrows to kill enemies to protect their castles.转载于:https://www.cnblogs.com/lyfd8/p/9416508.html