vue实现的网易云音乐在线播放和下载功能案例
程序员文章站
2022-06-23 22:11:13
本文实例讲述了vue实现的网易云音乐在线播放和下载功能。分享给大家供大家参考,具体如下:
效果如图:
完整代码:
本文实例讲述了vue实现的网易云音乐在线播放和下载功能。分享给大家供大家参考,具体如下:
效果如图:
完整代码:
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>document</title> <style lang=""> html, body { height: 100%; padding: 0; margin: 0; } #app { height: 100%; display: flex; } #app>#left { flex: 1; background-color: skyblue; text-align: center; /* 超出滚动 */ overflow: scroll; } #app>#right { flex: 1; background-color: orange; } ul { list-style: none; padding: 0; } input { width: 469px; height: 56px; margin: 10px auto; border-radius: 10px; outline: none; font-size: 24px; border: 0; padding-left: 15px; } #left li { width: 451px; /* height: 35px; */ margin: 0 auto; font-weight: 700; border: 2px solid black; line-height: 35px; color: white; background-color: cadetblue; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; max-height: 35px; -webkit-line-clamp: 1; -webkit-box-orient: vertical; } #left li:hover { cursor: pointer; background-color: greenyellow; color: red; } #right { position: relative; overflow: scroll; } audio { /* position: absolute; left: 50%; transform: translatex(-50%) translatey(46px); */ display: block; margin: 0 auto; } /* li标签过渡的样式 */ .list-item { display: inline-block; margin-right: 10px; } .list-enter-active, .list-leave-active { transition: all 1s; } .list-enter, .list-leave-to{ opacity: 0; transform: translatex(100px); } /* 设置专辑图片样式 */ .cover{ width: 260px; height: 260px; border-radius: 50%; display: block; margin: 10px auto; /* transform: translatex(-50%) translatey(10px); */ } /* 动画 */ @keyframes autorotate{ to{ transform: rotatez(360deg); } } /* 动画播放样式 */ .autorotate{ /* 动画名,一直播放iteration(一直重复),匀速(timing),时间2s(duration),状态(running) */ animation-name:autorotate; animation-iteration-count:infinite; animation-timing-function: linear; animation-duration:2s; animation-play-state:running; } /* 动画状态 */ .pause{ animation-play-state:paused; } /* 评论 */ .comment{ height: 150px; /* background-color: skyblue; */ } .comment li{ display: flex; padding: 5px; } .comment li .left{ width: 120px; height: 120px; } .comment li .left img{ width: 100px; } .comment li a{ text-decoration: none; font-weight: bold; color: crimson; } </style> </head> <body> <div id="app"> <!-- 左边 --> <div id="left"> <input type="text" value="请输入你要搜索的歌名" v-model="inputvalue" @keyup.enter="search"> <!-- 给li添加过渡 ;v-on:after-enter="afterenter":钩子函数--> <transition-group name="list" tag="ul" v-on:after-enter="afterenter"> <!-- play(item.id):把id传过去 --> <li v-for="(item, index) in musiclist" :key="item.id" @dblclick="playmusic(item.id,item.album.id)" :style="{'transition-delay':index*100+'ms'}" > {{item.name}}-----演唱者:{{item.artists[0].name}} </li> </transition-group> </div> <!-- 右边,播放 --> <div id="right"> <!-- 专辑页面 --> <img :src="picurl" alt="" class="cover autorotate" :class="{pause:ispause}"> <!-- autoplay:自动播放,controls显示控件 ;@play="play"是自定义方法--> <audio :src="songurl" autoplay controls @play="play" @pause="pause" ></audio> <h3>精彩评论</h3> <div class="comment"> <ul> <!-- 遍历数组时,需要动画时才用到key --> <li v-for="(item, index) in comments" > <div class="left"> <img :src="item.user.avatarurl" alt=""> </div> <div class="right"> <a href="#" rel="external nofollow" >{{item.user.nickname}}</a> <p>{{item.content}}</p> </div> </li> </ul> </div> </div> </div> rightv> </body> <!-- 导入vue --> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <!-- 导入vue插件 --> <script src="https://cdn.jsdelivr.net/npm/vue-resource@1.5.1"></script> <script> //代码 /* 音乐播放器 需求1: 搜索歌曲 发送网络请求 回调函数函数中渲染数据 有动画 需求2: 双击播放歌曲 根据id调用接口 查询数据 通过audio播放歌曲 获取专辑的信息 进而获取封面 展示给用户 需求3 播放歌曲时 封面转动 暂停播放时 封面停止转动 步骤: 1.先写动画样式,动画命名为autorotate,因为是一直运动,所以使用animation; 2.同时写一个暂停的样式,命名为pause,给data添加一个ispause来存值,默认给一个false 3.添加运动和暂停的步骤是添加上面的两个类,但是pause要使用v-bind指令来设置属性; 4.在audio音频里添加播放和暂停的点击方法,在对应的方法里设置对应的布尔值; 需求4 点击播放歌曲 同时获取这首歌的评论 步骤:1.在数据中声明一个comments的空数组,用来存评论内容 2.在播放方法中写获取评论的接口 3.在响应体里将内容赋值给声明的数组 */ let app = new vue({ el: "#app", data: { inputvalue: '',//输入的值 musiclist: [], //存储歌列表 songurl: '',//播放歌曲的url picurl:'',//获取专辑信息 ispause:false,//专辑是否暂停 comments:[]//评论内容 }, methods: { // li标签过渡的事件 randomindex: function () { return math.floor(math.random() * this.items.length) }, add: function () { this.items.splice(this.randomindex(), 0, this.nextnum++) }, remove: function () { this.items.splice(this.randomindex(), 1) }, //搜索歌曲事件 search() { //调用接口 this.$http.get(`https://autumnfish.cn/search?keywords=${this.inputvalue}`).then(response => { // console.log(response); //将结果添加到musiclist中 this.musiclist = response.body.result.songs; }, response => { // error callback alert("出错了") }); }, // 双击播放歌曲事件,接收传过来的id playmusic(id,albumid) { //获取歌曲的url this.$http.get(`https://autumnfish.cn/song/url?id=${id}`).then(response => { // console.log(response); //将结果添加到musiclist中 this.songurl = response.body.data[0].url; }, response => { // error callback alert("出错了") }); // 获取专辑信息 this.$http.get(`https://autumnfish.cn/album?id=${albumid}`).then(res=>{ this.picurl=res.body.album.blurpicurl; }),err=>{} //获取评论内容接口 this.$http.get(`https://autumnfish.cn/comment/music?id=${id}&limit=1`).then(res=>{ console.log(res); this.comments=res.body.hotcomments; }),err=>{ alert('信息错误') } }, //钩子函数:动画执行完后去除了style属性,不去掉会卡顿 afterenter(el){ el.style=''; }, // 专辑图片旋转事件 play(){ console.log('播放'); this.ispause=false; }, pause(){ console.log('暂停'); this.ispause=true; } }, }) </script> </html>
如果接口不能使用:请登录https://github.com/huanggengzhong/neteasecloudmusicapi,重新下载开启服务器即可
希望本文所述对大家vue.js程序设计有所帮助。
上一篇: VuePress 快速踩坑小结