利用vue写一个简单的音乐播放器,包括功能有歌曲搜索、歌曲播放、歌曲封面、歌曲评论、播放动画、mv播放六个功能。
<template> <div class="wrap"> <!-- 播放器主体区域 --> <div class="play_wrap" id="palyer"> <div class="search_bar"> <img src="./images/player_title.png" alt /> <!-- 搜索歌曲 --> <input type="text" autocomplete="off" v-model="query" @keyup.enter="searchMusic" /> </div> <div class="center_con"> <!-- 搜索歌曲列表 --> <div class="song_wrapper"> <ul class="song_list"> <li v-for="item in musicList"> <a href="javascript:;" @click="playMusic(item.id)"></a> <b>{{item.name}}</b> <span> <i v-show="item.mvid!=0" @click="playMv(item.mvid)"></i> </span> </li> </ul> <img src="./images/line.png" class="switch_btn" alt /> </div> <!-- 歌曲信息容器 --> <div class="player_con" :class="{playing:isPlaying}"> <img src="./images/player_bar.png" class="play_bar" /> <!-- 黑胶碟片 --> <img src="./images/disc.png" class="disc autoRotate" /> <img :src="imgUrl== ''?'./images/cover.png':imgUrl" class="cover autoRotate" /> </div> <!-- 评论容器 --> <div class="comment_wrapper"> <h5 class="title">热门留言</h5> <div class="comment_list"> <dl v-for="item in musicComments"> <dt> <img :src="item.user.avatarUrl" alt /> </dt> <dd class="name">{{item.user.nickname}}</dd> <dd class="detail">{{item.content}}</dd> </dl> </div> <img src="./images/line.png" class="right_line" /> </div> </div> <div class="audio_con"> <audio ref="audio" @play="play" @pause="pause" :src="musicUrl" controls autoplay loop class="myaudio" ></audio> </div> <div class="video_con" v-show="isShow"> <video ref="video" :src="mvUrl" controls="controls"></video> <div class="mask" @click="closeVideo"></div> </div> </div> </div> </template> <script> export default { name: "App", data: () => { return { query: "", musicList: [], musicUrl: "", imgUrl: "", musicComments: [], isPlaying: false, mvUrl: "", isShow: false }; }, methods: { //音乐查询 searchMusic: function() { var that=this; this.$axios({ url: "https://autumnfish.cn/search?keywords=" + that.query, methods: "get" }) .then(res => { // console.log(res.data.result.songs); that.musicList = res.data.result.songs; }) .catch(err => { console.log(err); }); }, //音乐播放 playMusic: function(musicId) { var that=this; this.$axios({ url: "https://autumnfish.cn/song/url?id=" + musicId, methods: "get" }) .then(res => { //console.log(res.data.data[0].url); that.musicUrl = res.data.data[0].url; }) .catch(err => { console.log(err); }); //音乐封面 this.$axios({ url: "https://autumnfish.cn/song/detail?ids=" + musicId, methods: "get" }) .then(res => { //console.log(res.data.songs[0].al.picUrl); that.imgUrl = res.data.songs[0].al.picUrl; }) .catch(err => { console.log(err); }); //热门评论 this.$axios({ url: "https://autumnfish.cn/comment/hot?type=0&id=" + musicId, methods: "get" }) .then(res => { //console.log(res.data.hotComments); that.musicComments = res.data.hotComments; }) .catch(err => { console.log(err); }); }, //播放时动画打开 play: function() { this.isPlaying = true; }, //暂停时动画暂停 pause: function() { this.isPlaying = false; }, //获取mv的Url playMv: function(mvId) { var that=this; if (mvId) { this.isShow = true; this.$axios({ url: "https://autumnfish.cn/mv/url?id=" + mvId, methods: "get" }) .then(res => { //console.log(res.data.data.url); that.mvUrl = res.data.data.url; }) .catch(err => { console.log(err); }); } }, //关闭mv closeVideo: function() { this.isShow = false; //关闭之后,视频也不再播放了 this.$refs.video.pause(); } }, created: function() {} }; </script> <style> body, ul, dl, dd { margin: 0px; padding: 0px; } .wrap { position: fixed; left: 0; top: 0; 100%; height: 100%; background: url("./images/bg.jpg") no-repeat; background-size: 100% 100%; } .play_wrap { 800px; height: 544px; position: fixed; left: 50%; top: 50%; margin-left: -400px; margin-top: -272px; /* background-color: #f9f9f9; */ } .search_bar { height: 60px; background-color: #1eacda; border-top-left-radius: 4px; border-top-right-radius: 4px; display: flex; align-items: center; justify-content: space-between; position: relative; z-index: 11; } .search_bar img { margin-left: 23px; } .search_bar input { margin-right: 23px; 296px; height: 34px; border-radius: 17px; border: 0px; background: url("./images/zoom.png") 265px center no-repeat rgba(255, 255, 255, 0.45); text-indent: 15px; outline: none; } .center_con { height: 435px; background-color: rgba(255, 255, 255, 0.5); display: flex; position: relative; } .song_wrapper { 200px; height: 435px; box-sizing: border-box; padding: 10px; list-style: none; position: absolute; left: 0px; top: 0px; z-index: 1; } .song_stretch { 600px; } .song_list { 100%; overflow-y: auto; overflow-x: hidden; height: 100%; } .song_list::-webkit-scrollbar { display: none; } .song_list li { font-size: 12px; color: #333; height: 40px; display: flex; flex-wrap: wrap; align-items: center; 580px; padding-left: 10px; } .song_list li:nth-child(odd) { background-color: rgba(240, 240, 240, 0.3); } .song_list li a { display: block; 17px; height: 17px; background-image: url("./images/play.png"); background-size: 100%; margin-right: 5px; box-sizing: border-box; } .song_list li b { font-weight: normal; 122px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .song_stretch .song_list li b { 200px; } .song_stretch .song_list li em { 150px; } .song_list li span { 23px; height: 17px; margin-right: 50px; } .song_list li span i { display: block; 100%; height: 100%; cursor: pointer; background: url("./images/table.png") left -48px no-repeat; } .song_list li em, .song_list li i { font-style: normal; 100px; } .player_con { 400px; height: 435px; position: absolute; left: 200px; top: 0px; } .player_con2 { 400px; height: 435px; position: absolute; left: 200px; top: 0px; } .player_con2 video { position: absolute; left: 20px; top: 30px; 355px; height: 265px; } .disc { position: absolute; left: 73px; top: 60px; z-index: 9; } .cover { position: absolute; left: 125px; top: 112px; 150px; height: 150px; border-radius: 75px; z-index: 8; } .comment_wrapper { 180px; height: 435px; list-style: none; position: absolute; left: 600px; top: 0px; padding: 25px 10px; } .comment_wrapper .title { position: absolute; top: 0; margin-top: 10px; } .comment_wrapper .comment_list { overflow: auto; height: 410px; } .comment_wrapper .comment_list::-webkit-scrollbar { display: none; } .comment_wrapper dl { padding-top: 10px; padding-left: 55px; position: relative; margin-bottom: 20px; } .comment_wrapper dt { position: absolute; left: 4px; top: 10px; } .comment_wrapper dt img { 40px; height: 40px; border-radius: 20px; } .comment_wrapper dd { font-size: 12px; } .comment_wrapper .name { font-weight: bold; color: #333; padding-top: 5px; } .comment_wrapper .detail { color: #666; margin-top: 5px; line-height: 18px; } .audio_con { height: 50px; background-color: #f1f3f4; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; } .myaudio { 800px; height: 40px; margin-top: 5px; outline: none; background-color: #f1f3f4; } /* 旋转的动画 */ @keyframes Rotate { from { transform: rotateZ(0); } to { transform: rotateZ(360deg); } } /* 旋转的类名 */ .autoRotate { animation-name: Rotate; animation-iteration-count: infinite; animation-play-state: paused; animation-timing-function: linear; animation-duration: 5s; } /* 是否正在播放 */ .player_con.playing .disc, .player_con.playing .cover { animation-play-state: running; } .play_bar { position: absolute; left: 200px; top: -10px; z-index: 10; transform: rotate(-25deg); transform-origin: 12px 12px; transition: 1s; } /* 播放杆 转回去 */ .player_con.playing .play_bar { transform: rotate(0); } /* 搜索历史列表 */ .search_history { position: absolute; 296px; overflow: hidden; background-color: rgba(255, 255, 255, 0.3); list-style: none; right: 23px; top: 50px; box-sizing: border-box; padding: 10px 20px; border-radius: 17px; } .search_history li { line-height: 24px; font-size: 12px; cursor: pointer; } .switch_btn { position: absolute; right: 0; top: 0; cursor: pointer; } .right_line { position: absolute; left: 0; top: 0; } .video_con video { position: fixed; 800px; height: 546px; left: 50%; top: 50%; margin-top: -273px; transform: translateX(-50%); z-index: 990; } .video_con .mask { position: fixed; 100%; height: 100%; left: 0; top: 0; z-index: 980; background-color: rgba(0, 0, 0, 0.8); } .video_con .shutoff { position: fixed; 40px; height: 40px; background: url("./images/shutoff.png") no-repeat; left: 50%; margin-left: 400px; margin-top: -273px; top: 50%; z-index: 995; } </style>