WEB音乐播放器

闲来无事,利用VUE搭建了一个WEB音乐播放器。但由于前期没有构思好,导致项目进行不下去了。不过实现了最基本的功能。记录一下项目过程吧。
最终效果图如下:WEB音乐播放器

项目搭建

  1. 采用vue-cli3.0搭建脚手架。
  2. 采用babel+eslint配置。
    在这里插入图片描述
  3. 项目结构图(node_modules未显示)
    在这里插入图片描述

项目说明

  1. 播放器中定义了三个组件,App.vue(父组件),Content.vue,Controller.vue。
  2. 未采用npm安装的方式,而是采用直接引入js和css的方式。
  3. 引入了vue-resource进行网络请求。
  4. API来源于小伟博客。

代码

一、App组件
<template>
  <div id="app">
    <div class="search-box">
      <input class="form-control" type="text"  placeholder="搜索音乐,歌手,歌词,mv" v-model="keywords">
      <button class="btn btn-primary" @click="search">SOU一下</button>
    </div><br>
    <button class="btn btn-default" data-toggle="modal" data-target="#myModal">
            <span class="glyphicon glyphicon-camera"></span>定制皮肤
    </button>

    <!-- Modal -->
    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
      <div class="modal-dialog" role="document">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h4 class="modal-title" id="myModalLabel">定制个性皮肤</h4>
          </div>
          <div class="modal-body">
            <input type="text" name="" id="" placeholder="请在此处粘贴您的背景图片地址" class="form-control" v-model="imglink">
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-danger" data-dismiss="modal">关闭</button>
            <button type="button" class="btn btn-primary" @click="changeImage">保存</button>
          </div>
        </div>
      </div>
    </div>

    <Content :musics='musics' @playStatus="getPlayStatus"></Content>
    <Control :playStatus="playStatus"></Control>
    
  </div>
</template>

<script>
import Content from './components/Content.vue'
import Control from './components/Control.vue'

export default {
    data() {
       return {
         keywords: '',
         musics: {},
         imglink: '',
         playStatus: {}
     }
    },
    components:{
      Content,
      Control
    },
    created: function(){
        this.$http.get('https://api.mlwei.com/music/api/?key=523077333&id=热门&type=so&cache=0&size=hq&nu=10')
        .then( (res)=>{
          this.musics = res.body.Body;
        })
    },
    methods:{
      search: function(){
        this.$http.get('https://api.mlwei.com/music/api/?key=523077333&id='+ this.keywords +'&type=so&cache=0&size=hq&nu=10')
        .then( (res)=>{
          this.musics = res.body.Body;
        })
      },
      changeImage: function(){
          $('#app').css({'background-image':'url('+this.imglink+')'});
      },
      getPlayStatus: function(playStatus){
          this.playStatus = playStatus;  
      }

      
    }
}

</script>

<style scoped>
#app{
  height: 100%;
  width: 100%;
}
.search-box{
  margin-left: 35%;
  margin-top: 4%;
}
.search-box input{
  display: inline;
  width: 30%;
}
button[class='btn btn-default']{
  float: right;
  margin-right: 160px;
  margin-top: 5px;
}
</style>
二、Content组件
<template>
    <div id="content">
        <ul class="nav nav-tabs bg-info" role="tablist">
            <li role="presentation"><a href="#">音乐</a></li>
            <li role="presentation"><a href="#">歌手</a></li>
            <li role="presentation"><a href="#">歌词</a></li>
            <li role="presentation"><a href="#">MV</a></li>
        </ul>
        <hr>
        <table>
            <thead>
                <td>操作</td>
                <td>歌曲名称</td>
                <td>歌手</td>
                <td>专辑</td>
            </thead>
            <tr v-for="(music,index) in musics" :key="music.mid">
                <td><a @click="play(index)"><span class="glyphicon glyphicon-play-circle"></span></a></td>
                <td>{{ music.title }}</td>
                <td>{{ music.author }}</td>
                <td>{{ music.album }}</td>
                <audio controls id="audio">
                    <source :src="music.url" type="audio/mpeg">
                </audio>
            </tr>
        </table>
    </div>
</template>

<script>
export default {
    props:['musics'],
    data(){
        return{
            playStatus : {'isPlay':false,'currentTime':0}
        }
    },
    methods:{
        play: function(index){  
                var audio = document.getElementsByTagName('audio')[index]; 
                if(audio.paused){
                    audio.load();
                    audio.play();
                    this.playStatus.isPlay = true;
                    this.playStatus.currentTime = audio.currentTime;
                    this.$emit('playStatus',this.playStatus);
                }else{
                    audio.pause();
                    this.playStatus.isPlay = false;
                    this.$emit('playStatus',this.playStatus);
                }   
            
            
       }
    }
    
}
</script>

<style scoped>
    ul{
        width: 80%;
        margin-left: 10%;
    }
    table{
        width: 80%;
        margin-left: 10%;
        line-height: 30px;
    }
    table>tr>td{
        border-bottom: 1px solid rgb(79.8%, 96%, 79.8%);
    }
    button{
        margin: 0;
        padding: 0;
        border: 1px solid transparent;  
        outline: none;  
        background-color:rgb(100%, 100%, 100%);
    }
    audio{
        display: none;
    }

</style>
三、Control组件
<template>
    <div id="control">
        <button class="btn btn-primary">
            <span class="glyphicon glyphicon-fast-backward"></span>
        </button>
        <button class="btn btn-primary" @click="play">
            <span :class="playStatus.isPlay ? 'glyphicon glyphicon-pause' : 'glyphicon glyphicon-play'"></span>
        </button>
        <button class="btn btn-primary">
            <span class="glyphicon glyphicon-fast-forward"></span>
        </button>
        <div class="progress" >
            <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100">
                <span class="sr-only">60% Complete</span>
            </div>
        </div>
        <div id="other">
            <button></button>
            <button>
                <span class="glyphicon glyphicon-repeat"></span>
            </button>
             <button>
                <span class="glyphicon glyphicon-film"></span>
            </button>
            <button></button>
        </div>

    </div>


</template>


<script>
export default {
    props: ['playStatus'],
    data(){
        return{
            playcss: 'glyphicon glyphicon-play', 
        }
    },
    methods:{
        play:function(){  
        }
    }
 
}
</script>

<style scoped>
    #control{
        width: 80%;
        padding-left: 10%;
        padding-top: 3%;
    }
    button{
        height: 40px;
        width: 40px;  
        border-radius: 50%;
        margin-right: 20px;
    }
    #progress{
        width: 60%;
        height: 3px;
    }
    div[class='progress']{
        height: 3px;
        width: 30%;
        position: absolute;
        left: 24%;
        top: 87%;
    }
    div[class='progress-bar']{
        width: 60%;
        height: 3px;
    }
    #other{
        position: absolute;
        left: 75%;
        top: 84%;
    }
</style>
四、main.js
import Vue from 'vue'
import App from './App.vue'
import VueResource from 'vue-resource'

Vue.config.productionTip = false
Vue.use(VueResource)

new Vue({
  render: h => h(App),
}).$mount('#app')

项目功能展示

  1. 定制皮肤
    采用bootstrap中的模态框对图片地址进行获取,并采用jQuery进行背景的渲染。
    在这里插入图片描述
    在这里插入图片描述
  2. 音乐搜索
    父组件调用API获取歌曲数据,将数据与Content组件进行绑定。Content利用props对数据进行获取并对页面进行渲染。
    在这里插入图片描述
  3. 音乐播放
    点击音乐所对应的播放键,生成歌曲状态信息(歌曲是否播放,歌曲播放进度),将歌曲信息先传递给父组件,再由父组件传递给Control组件,从而实现联动。
    问题就出在这里,由于vue的特性是子组件和子组件之间不能进行传值,因此,只能采取这种迂回的方法。
    歌曲处于播放状态
    歌曲处于暂停状态

项目总结

这个播放器的项目由于前期构思的问题,导致组件间传值变得很困难。因此,vue的项目在组件构思上一定要考虑组件间传值的问题。
项目中还遇到一个问题,在利用vue-resource进行请求的过程中,可能会出现无法请求的问题,这个时候一定要先对请求URL进行判断,其次,要注意请求的方式,小编在调用一个API时,调用成功,却始终无法取到返回值,就是在请求方式上出现了问题,最开始小编使用的是this.$http.get() 方法进行请求,最后采用this.$http.jsonp()成功请求并取到值。

~来了小老弟
关注 关注
  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
简易网页音乐播放器
MorningLight_LQ的博客
06-07 5290
简易网页音乐播放器 开发工具与关键技术:DW2021 jQuery HTML5 撰写时间:2021年 5月 28日 简介与要点:在网页上制作一个音乐播放器我们仅需用到一个新的标签<audio src="素材音乐" controls></audio>;因为我们这个音乐播放不是单曲循环的使用还要...
一款简约好看的html5音乐播放器,一款好看又简洁的HTML5音乐播放器skPlayer
weixin_31243809的博客
06-03 1542
skPlayer是一款好看又简洁的HTML5网页音乐播放器,同时支持自定义歌单和网易云音乐歌单。skPlayer3.0仅需一个JS文件就可实现播放器的调用,播放列表可隐藏,各项控制参数可以单独自行选择启用。skPlayer3.0播放器应用实例代码:varplayer=newskPlayer({autoplay:true,music:{type:'cloud',source:3179...
html5 MPlayer可定制的Web音乐播放器插件
11-07
html5 MPlayer可定制的Web音乐播放器插件 html5 MPlayer可定制的Web音乐播放器插件
网页本地音乐播放器(支持文件夹)
06-10
一个网页本地音乐播放器,支持文件件选择,很简单,可以参考一下,主要是对webkitdirectory使用
网页音乐播放器(html+css+原生js)
最新发布
weixin_71927437的博客
05-16 338
想自己试做一个小网站,于是边学边做,也有了一个可以用的成品,想着拿出来并简单聊聊。决定先做一个音乐播放器。以下是我参考的文章,成品也是在这位作者的基础上改来的。
web常见之音乐播放器
weixin_33701251的博客
12-25 498
代码来源于:这位Github小伙伴,我只负责解说!   效果图如下:     先上HTML代码   源码: &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="utf-8" /&gt; &lt;meta name="referrer" content="no-r
网站音乐播放器源码
m0_59088506的博客
05-01 2310
一起白嫖,简要快速的建立一个网站音乐播放器,在我研究一番之后直接给大家总结出结果一共四个文件。
web音乐播放器(PC端)
小宝的博客
08-23 689
本文主要介绍一个基于vue+vue-cli+vue利用技术html+css+js、和visual studio Code编辑工具对网页音乐播放器(PC)进行编写和设计。并对开发中涉及到的关键技术作了探讨,同时给出了详细的系统设计过程、部分界面图及主要功能运行流程图,最后说明实现的功能。本文还对开发过程中遇到的问题和解决方法进行了详细的讨论,该音乐播放器集播放、暂停、停止、快进、快退、下一曲、上一曲、音量调节等功能与一体,性能良好。第一阶段首先对项目进行全面、仔细的需求分析,并准确做出项目进度安排,明确每个
HTML网页调用 网易云 音乐播放器代码
热门推荐
YFCMS博客
12-05 5万+
表现形式一:单曲播放 调用代码: &amp;lt;iframe frameborder=&quot;no&quot; border=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; width=100% height=86 src=&quot;http://music.163.com/outchain/player?type=2&am
jQuery WEB音乐播放器下载
06-24
jQuery WEB音乐播放器下载是一款在线的网站音乐播放器特效。
Web音乐播放器
12-06
Web音乐播放器 需要开启flash功能 否则不能正常使用 HTML Javascript Flash 技术
MusicPlayer-Html5:基于html5和css的web播放器
05-14
MusicPlayer-Html5 基于html5和css的web播放器 自制的一款web音乐播放器,利用html,以及javascript实现 很久以前写的项目,目前主要支持火狐浏览器,没时间做兼容了:
web网页音乐播放器代码(有运行原理简介)
08-19
web网页音乐播放器代码(有运行原理简介)
利用jQuery设计一个简单的web音乐播放器的实例分享
01-21
一、准备数据库  首先,我们设计MYSQL数据库如下: CREATE TABLE `songs` ( `song_id` int(11) NOT NULL AUTO_INCREMENT, `url` varchar(500) NOT NULL, ... 这里,url字段表示是mp3音乐的存放地
WEB音乐播放器
qq_52157198的博客
09-27 2188
利用vue2实现web音乐播放器的大致思路和方法。
web音乐播放器
antuo8190的博客
12-28 294
今天闲暇时间,花了2小时,写了个简单音乐播放器。欢迎大家来吐糟 先看下界面截图 大体实现:播放,停止,上一曲,下一曲,循环播放功能。 知识点:1.html 中audio 2.css 位置fixed 其中audio用到的方法:1.play 2.pause ,属性:1.src 2.loop 对于audio不熟悉的移步...
WEB项目-音乐播放器
weixin_52793965的博客
09-21 1154
音乐播放器需求分析 需求分析
jukebox - 基于Web音乐播放器
gitblog_00098的博客
03-15 343
jukebox - 基于Web音乐播放器 jukebox 是一个基于Web音乐播放器,它允许您在浏览器中创建、管理和播放您的个人音乐库。 应用场景 想要在线管理个人音乐库? 需要在任何设备上访问您的音乐? 想要与朋友分享音乐收藏? jukebox 就是为了解决这些问题而设计的。 主要特性 简单易用的界面:jukebox 提供了一个简洁的界面,让您可以轻松地浏览、搜索和播放音乐。 在线音乐...
好看的web音乐播放器源码
08-09
好看的web音乐播放器源码有很多。以下是其中一个例子: 这个音乐播放器源码采用现代化的设计风格,拥有简洁的界面和用户友好的操作体验。它使用HTML5、CSS3和JavaScript等技术,可以在不同的浏览器上良好运行。 该...

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 【Python】利用决策树分类器对鸢尾花进行分类 9312
  • Restful API应用实例 8610
  • 【Java】解决跨域问题的三种方案 8359
  • 学生管理系统的设计与实现—前端代码 8111
  • 玩转C语言Socket网络编程 6857

分类专栏

  • 数据库 4篇
  • Shell Programming 1篇
  • Docker 1篇
  • PHP 1篇
  • Python 4篇
  • Java 20篇

最新评论

  • 【Python】利用决策树分类器对鸢尾花进行分类

    小小 小小白想进阶: 可以说一下最后一个可视化图是在哪里看嘛

  • 【Python】利用决策树分类器对鸢尾花进行分类

    asegwegwe: 作者大大能给一下全代码嘛

  • 【Java】Shiro经典五张表建立

    qq_30871535: 有个问题,既然有用户表与角色表的关联表,权限与角色的关联表。那为什么用户表与权限表还要有角色id,这不是多此一举吗?

  • 【Java】手写Spring-IoC

    可乐_vv: https://blog.csdn.net/weixin_41907754/article/details/122441947?spm=1001.2014.3001.5501

  • 【Git】使用github的Actions功能进行自动化测试

    从善若水: 学习了,一定要来我博客看看表情包

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 【数据库】PostgreSQL数据库入门(二)
  • 【数据库】PostgreSQL数据库入门(一)
  • shell programming 1
2020年7篇
2019年67篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

哆哆女性网给领导的简短祝福语8字起名网大师免费名字大全给宝宝起名字怎么起瑞友天翼范冰冰苹果在线观看建筑或劳务公司起名易经起名免费免费至高指令通过出生日起名移动查话费父姓母姓一起在名字里分道扬镳的意思许仙的扮演者张姓年猪年宝宝起名大全曹雪芹简介宝宝起名女孩宝宝小名大全战国兰斯8五百个郭靖易学起名字大全完美主义魔法师关于元宵节的古诗斯力高姓氏三才五格起名在线起名门头起名字打分测试司起名男孩三字周易起名打分网竭泽而渔by夜很贫瘠黄历上八字起名宋的男宝宝起什么名字公主联盟金手指淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化