VUE获取网易云音乐接口,并实现歌词滚动效果

最近在捣腾个人博客,加了个播放音乐的模块,所以在这里记录一下歌曲播放歌词实时滚动效果的实现,顺便总结加深一下对各个知识点的理解。

GitHub地址
演示地址

功能还没开发完全,当前部分可通过导航栏进入到音乐模块,并点击如下歌手图进入。

先放一下效果图吧

这里主要有两个组件:歌曲信息组件歌曲控制组件,歌曲控制组件还没有完善,这里主要记录一下歌曲信息组件的实现

歌曲信息组件

这一部分主要是歌曲列表和当前歌曲信息

1、歌曲列表实现

在这之前,关于网易云音乐接口的使用可以看网易云音乐API文档

思路:

  1. 获取歌曲数据
  2. 处理歌曲数据
  3. 渲染到视图上

(1)在实例创建完成,也就是在created钩子函数这个时期,我们能够访问到data,computed,methods上的方法和数据了,那我们就可以向接口发送请求了

created() {//通过getSong()获取对应歌曲信息this.getSong(this.$route.query.name); //在这之前,我是通过路由进入的该组件,所以会传递一个name歌手名字作为参数
};

(2)接下来编写getSong(),通过axios获取数据,我们可以先打印出来看看

    getSong(name) {let url ="https://api.imjad.cn/cloudmusic/?type=search&search_type=1&s=" +name +"&offset=1&limit=10"; //这里以第一页的十条数据为例this.$axios.get(url).then(res => console.log(res.data)).catch();}

(3)打开控制台,很明显获取到的并不是我们最终想要的结果,所以接下来就需要在众多数据中提取出我们想要的信息。

一般歌曲列表需要的数据不外乎这几样

  • 歌曲id
  • 歌曲名字
  • 歌手名字
  • 歌曲时长

我们随便点开一条去找,至于怎么找…就是一个个找,比如里面有个name属性,那么大概就是歌名了,接口文档里歌手对应的type是artist,那我们就找这个属性,如果没有的话那么大概率就是该单词缩写,所以我们点进去ar属性找到了我们想要的。

在这一步我们也能感受到在打代码的过程中,参数语义化的重要性了

(4)最后定位到我们想要的数据,我们用formatSongs()这个方法来进行整理

    //提取歌曲信息,arr为接口返回的初始数据formatSongs(arr) {let n = arr.length;for (let i = 0; i < n; i++) {let obj = {}; //我们将每首歌的信息以对象的方式存储obj.id = arr[i].id;obj.song = arr[i].name;obj.singer = arr[i].ar[0].name;obj.dt = this.formatDt(arr[i].dt); //由于返回的歌曲时长单位是ms,我们还要将其转换成00:00的格式this.songList.push(obj); //最后将这个歌曲对象存储到组件的songList歌曲列表属性上,最后用个v-for就可以在视图上呈现出来了}}//格式化播放时长formatDt(time) {let dt = time / 1000;let m = parseInt(dt / 60);let s = parseInt(dt % 60); //这里用Math.ceil取整会更严谨些m >= 10 ? m : (m = "0" + m);s >= 10 ? s : (s = "0" + s);return m + ":" + s;}

歌曲列表的实现比较简单,标签样式就不放了

2、获取当前播放歌曲的信息

思路:

  1. 获取歌曲信息(主要是歌词)
  2. 处理歌曲数据(主要是对歌词格式进行处理)
  3. 实现歌词滚动效果

(1)获取歌词信息
直接上代码

//获取歌词信息,id为歌曲idgetLyric(id) {let url = "https://api.imjad.cn/cloudmusic/?type=lyric&id=" + id; //获取歌词信息要设置type=lyric,详情看接口文档this.$axios.get(url).then(res => ((this.lyric = []), this.formatLyric(res.data.lrc.lyric))) .catch();//同样的,我们先要在接口返回的数据中提取出我们需要的那部分,并用一个formatLyric方法来对它进行格式化}

(2)在对歌词格式化之前,我们先来随便播放一首歌,看原本的歌词文本是怎样的


看起来还不错,有一定规律,还帮我们换好行了。
我们需要做的是将时间和文本部分分离开来…一切都在掌握之中,直到我就发现了这个…

ok,fine!原来还有这种写法,不同时间的重复歌词还能写在一起,确实这样的写法简洁了很多,然而我们需要处理的东西也变多了…
好了直接上代码

(3)处理歌词文本

//传入初始歌词文本text
formatLyric(text) {let arr = text.split("\n"); //原歌词文本已经换好行了方便很多,我们直接通过换行符“\n”进行切割let row = arr.length; //获取歌词行数for (let i = 0; i < row; i++) {let temp_row = arr[i]; //现在每一行格式大概就是这样"[00:04.302][02:10.00]hello world";let temp_arr = temp_row.split("]");//我们可以通过“]”对时间和文本进行分离let text = temp_arr.pop(); //把歌词文本从数组中剔除出来,获取到歌词文本了!//再对剩下的歌词时间进行处理temp_arr.forEach(element => {let obj = {};let time_arr = element.substr(1, element.length - 1).split(":");//先把多余的“[”去掉,再分离出分、秒let s = parseInt(time_arr[0]) * 60 + Math.ceil(time_arr[1]); //把时间转换成与currentTime相同的类型,方便待会实现滚动效果obj.time = s;obj.text = text;this.lyric.push(obj); //每一行歌词对象存到组件的lyric歌词属性里});}this.lyric.sort(this.sortRule); //由于不同时间的相同歌词我们给排到一起了,所以这里要以时间顺序重新排列一下this.$store.commit("setLyric", this.lyric); //把歌词提交到store里,为了重新进入该组件时还能再次渲染},sortRule(a, b) { //设置一下排序规则return a.time - b.time;}

(4)格式化完成后我们同样是通过一个v-for把歌词渲染到视图上,接下来我们要做的就是让这个歌词随着播放进度滚动起来。
主要有如下思路:

  • 设置定时器,监听播放进度
  • 改变元素位置让歌词滚动到当前进度
  • 改变当前歌词字体大小(高亮),突出显示

我们先看一下歌词元素的放置,这里主要分为三个部分:红色框为歌词放置的位置,我们设置个position: relative;不用去管它,蓝色框才是我们需要移动的部位,通过设置absolute绝对定位,在歌曲进度更新时我们改变它的top值就可以实现向上滚动的效果了,而且只要在给红色框加个overflow: hidden;就能把超出的部分隐藏,最终得到上面效果图的效果。

我们用watch来监听歌曲进度的变化,也就是当前播放时间

watch: {lyricCurrent() {this.lyric.forEach((element, index) => {if (this.lyricCurrent == element.time) {this.lyricMove.top = -index * 2.5 + 6 + "rem";this.currentRow = index; //通过比较我们歌词属性里的时间与当前播放时间,来定位到该歌词}});}}
<el-row type="flex" justify="center" class="lyric-contain"><el-col :span="23" class="song-lyric" :style="lyricMove"><!-- 这里用内联样式来实现当前歌词的高亮显示 --><el-rowv-for="(item,index) in lyric":key="index":style="{'font-size': (index==currentRow ? '1.3rem':'.9rem')}"class="lyric-row">{{item.text}}</el-row></el-col></el-row>

写在最后:

这里还涉及多个组件,以及状态管理等,所以没有把全部代码贴出来,更多的是提供了一个实现的思路,有些地方可能表达得不太准确,欢迎大家批评指正。

VUE获取网易云音乐接口,并实现歌词滚动效果相关推荐

  1. 获取网易云音乐接口以及使用

    不多说,直接上 1.网易云音乐接口文档 https://api.imjad.cn/cloudmusic.md 获取音乐id,然后输入点击预览,生成接口链接 接口链接:https://api.imjad ...

  2. 网易云音乐接口+vue全家桶开发一款移动端音乐webApp

    网易云音乐接口+vue全家桶开发一款移动端音乐webApp 项目还在develop中,感兴趣想要参与的小伙伴可以私我 效果图: 骨架屏 首页 侧边栏 每日推荐 歌单 播放器(小) 播放器(大) 详细信 ...

  3. VUE实战--网易云音乐

    VUE实战–网易云音乐 知识点: 音乐的暂停播放. 歌词的动态匹配. 动态组件: 根据is 属性 后面的组件名匹配 <component :is="组件的名字">< ...

  4. 使用webcollector爬虫技术获取网易云音乐全部歌曲

    使用webcollector爬虫技术获取网易云音乐全部歌曲 最近在知乎上看到一个话题,说使用爬虫技术获取网易云音乐上的歌曲,甚至还包括付费的歌曲,哥瞬间心动了,这年头,好听的流行音乐或者经典老歌都开始 ...

  5. Android获取网易云音乐歌曲详细信息

    Android获取网易云音乐歌曲详细信息 一.目标 二.实现方案 三.最终方案 四.遗留问题 五.接下来 六.Finally 在<Android获取歌曲详细信息>一文中,介绍了几种获取网易 ...

  6. 微信小程序调用网易云音乐接口

    微信小程序调用网易云音乐接口 前段时间QQ音乐的调用接口不能用了,给大家整理了一个网易云音乐的调用接口. 1.API接口: API接口地址 2.访问连接地址: http://neteasecloudm ...

  7. Python爬虫获取网易云音乐 我的喜欢歌单 歌曲数据

    需求:突然奇想,获取网易云音乐 我的喜欢 歌单音乐数据 获取歌曲详情 如标题,歌手,时长,专辑等等 思路: 爬虫请求url 获取数据,找到对的链接请求就成功了一半,查看返回数据,然后保存数据(歌曲+歌 ...

  8. 获取网易云音乐播放链接

    获取网易云音乐播放链接 首先打开网易云音乐官网,搜索自己喜欢的歌曲. 然后按F12打开开发者工具. 按F5刷新一下页面后,依次点击Network.XHR. 在Name下找到v1?csrf_token= ...

  9. 网易云歌单添加到php,[PHP源码]PHP获取网易云音乐mp3直链

    释放双眼,带上耳机,听听看~! 大家好,今天给大家分享一个可以通过PHP直接获取网易云音乐的直链的代码,喜欢的就分享下吧~ 部分音乐可能因为版权或者其他原因,用这个php脚本可能获取不到 请见谅! h ...

最新文章

  1. char值序列是什么Java_CharSequence和java之间的确切区别
  2. SLF4J log4j 学习笔记一
  3. mysql数据库的介绍及安装
  4. esp8266接收到的数据如何存放到数组中_愉快地学Java语言:第七章 数组
  5. 【双100%解法】剑指 Offer 22. 链表中倒数第k个节点
  6. [轉]Windows下Subversion配置管理员指南
  7. 用System中System.setOut()方法修改输出方式
  8. 第三节: 水泥混凝土路面构造特点
  9. 一个人一个微博、一个App一个故事:通过微博草根账号做英语学习App的“爱卡微口语”获晨脉创投天使投资
  10. 搜狗输入法模糊音设置 (非自定义短语设置)
  11. AI医学诊断基础-CT扫描、核磁共振成像(MRI)、拍X光、拍胸片、做B超/彩超等常规检查的介绍、原理、医学影像示例(持续跟新和答疑。。。)
  12. mui-app开发之项目类型概览
  13. 半透明遮罩效果 DIV
  14. macOS 安装PhotoshopCC 2017
  15. MuiPlayer - 一款优秀的 H5 视频播放器框架
  16. 【新示例】这家崇尚酷、黑科技的SaaS公司,怎么让数据打通不再是扯淡?
  17. 心理服务OA系统——让心理服务机构管理工作一站到位【心悦灵】
  18. 太阳能光伏发电系统的simulink仿真
  19. 应届生拿到offer之后的流程_应届生签offer前需要参考的注意事项
  20. 360-读取手机联系人

热门文章

  1. 3. Unity之三维模型
  2. 书架html5,基于HTML5 Canvas的CSG构造实体几何书架
  3. pppd参数中文解释
  4. 计算机的四个发展阶段的应用,计算机分为哪四个发展阶段
  5. async await 处理异步变同步(微信小程序内举例)
  6. [学习笔记]后缀数组
  7. TFT屏幕的显示阴影问题
  8. AI+社区智能管理,赋能智慧城市人情共「智」
  9. 寒武纪裁员:软件研发部门和应届生为重灾区
  10. 眼部化妆品、护肤品亚马逊要求的BCOP眼刺激性测试是什么