09 做一个音乐播放器

第九周,正好我正在整理个人博客,就教大家怎么给博客添加音乐播放器。
已经把这个功能添加到我的博客:http://www.cwyaml.top 点击 听音乐 看一下效果吧!!

有人就说了,添加个音乐播放器还不很容易吗?添加个 <audio> 标签不搞定了:

1
2
3
4
5
<audio controls="controls">
<source src="#" type="audio/ogg">
<source src="#" type="audio/mpeg">
Please update your browser!!
</audio>

之间的文字会在浏览器不支持该标签时显示出来

在网页中就会出现这个一个东西:

也挺简洁的哈!!

但是,如果是这样的话,我还有更好的选择:

网易云音乐外链播放器

1、打开这个链接:网易云音乐

2、搜一首你喜欢的歌,进入播放页面;

3、已经看到了吧,专辑封面下面出现了“生成外链播放器”,我们点进去就会出现:

4、好吧(尴尬!),我们换一首赵雷的 成都
2017-05-08_135957.png

5、点击 生成外链播放器 ,就会看到:

6、有 播放器尺寸是否自动播放等功能可以选择,方框中会出现预览样式。选好后,把下面的代码放在你的页面中就可以了。。

不仅单首歌可以生成外链播放器,歌单也可以,你可以自己尝试一下。(网易真良心企业)

这可比 <audio> 标签好看多了吧!但是很明显有几个缺点:

1、你已经看到了,并不是所有的音乐都可以用,有版权限制;

2、样式不能修改,可能与你页面的风格不符;

总之就是: 不能实现 充分的可定制性

自己动手丰衣足食,我们一起来写一个音乐播放器吧!!

实现功能

先说说做出来是什么效果吧。在页面中不出现播放器的样式,而是通过点击页面中某个元素触发,再次点击可以切换歌曲。就这些吧,具体做着再说。。

布局

其实并没有布局。页面只有一个按钮。

1
2
3
<div id="box">
<button id="btn" type="button">点击播放音乐!</button>
</div>

样式

强行加个样式,要对得起 强迫症 这个称号,一个按钮也要做的漂亮一点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
*{
margin: 0;
padding: 0;
}
#box{
width: 100%;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
#btn {
font-family: Arial;
font-size: 17px;
padding: 12px 35px;
background-color: rgb(120, 146, 194);
border: 1px solid rgb(78, 96, 150);
border-radius: 16px;
color: rgb(255, 255, 255);
}
#btn:hover{
background: rgb(71,110,158);
}
`

JS部分

思路就是,点击按钮后,创建一个 <audio> 标签添加到页面中。

1、要做音乐播放器,当然我们要有音乐才行。用一个数组来放音乐外链:

1
2
3
4
5
6
var songs = [
"http://m2.music.126.net/3uHnH7uQAeFwUfuvEB9lrg==/3265549619475054.mp3",
"http://m2.music.126.net/NnHwR2HV-1OoKZ6R5LVy4Q==/18502581673300023.mp3",
"http://m2.music.126.net/qv3RI4K7ABKJ0TyAdb3taw==/3250156397064860.mp3",
"......"
];

制作音乐外链的方法:
下载歌曲,然后上传到云端存储空间(我用的是 七牛云存储), 就会自动生成外链。所以说你只要能下载到歌曲文件,就都能拿来当背景音乐,至于怎么下载,我就不说了。。

2、然后写一下怎么在页面创建 <audio> 标签吧。

1
2
3
4
5
6
7
8
9
function addAudio(){
var e = document.getElementById('audio');
e.setAttribute('index',0);
e.id = 'audio';
e.loop = false; //不循环
e.innerHTML = 'Please update your browser!!';
document.body.appendChild(e);
}
}

index 属性主要用来记录当前播放的是第几首歌、loop 属性不让歌曲循环播放、然后把这个 audio 添加到 body 中。

3、写一下按钮的 onclick 事件:

1
2
3
4
var btn = document.getElementById('btn');
btn.onclick = function() {
addMusic();
}

现在点击按钮后 audio 标签就会被添加到页面中。但是歌曲并不会播放,因为它现在还是这个样子:

1
<audio index="0" id="audio" src="">Please update your browser!!</audio>

src 并没有值,所以肯定不会播放了。

4、下面就来给 src 属性赋值吧。因为有三首歌曲,我们还要判断一下添加哪个外链。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function cycle(){
var e = document.getElementById('audio');
if(e != null){
var index = parseInt(e.getAttribute('index'));
if(index > songs.length - 2){
index = 0;
}else{
index++;
}
e.setAttribute('index',index);
}
e.src = i;
e.play();
}

先获取到刚才添加的 audio 标签,如果获取到了,取得 index 值,即当前播放的是第几首歌(从 0 开始)。

思考一下: 第一次点击 index = 0、第二次 index = 1、第三次 index = 2,这时我们的三首歌都播放过了,点击第四下时 index = 3,应该停止播放的,所以 songs = [] 中要有一个占位的 空元素 。当点第五次时,歌曲列表要重新循环,所以让此时的 index = 0。

逻辑还是很简单的。。

细节处理

1、点我们第一次点击按钮时,向页面中添加了一个 audio 标签,第二次点击时,就不必再次添加了,只需要修改 src 值就可以了。所以上面的代码要修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function addAudio(){
var e = document.getElementById('audio');
if(e === null){
e = document.createElement('audio');
e.setAttribute('index',0);
e.id = 'audio';
e.loop = false; //不循环
e.innerHTML = 'Please update your browser!!';
document.body.appendChild(e);
e.addEventListener('ended',function(){
go(); //音频播放完毕时触发 ended 事件
});
}
}

添加前先判断一下 audio 是否存在。

2、最后做一下简单的封装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function go() {
var songs = [
'http://onk2gpv5u.bkt.clouddn.com/%E5%B1%B1%E4%B8%98-%E6%9D%8E%E5%AE%97%E7%9B%9B.mp3',
'http://onk2gpv5u.bkt.clouddn.com/%E6%88%91%E7%BB%88%E4%BA%8E%E5%A4%B1%E5%8E%BB%E4%BA%86%E4%BD%A0%20%28Live%29-%E6%9D%8E%E5%AE%97%E7%9B%9B.mp3',
'http://onk2gpv5u.bkt.clouddn.com/%E7%8E%8B%E5%8A%9B%E5%AE%8F%20-%20%E9%9C%80%E8%A6%81%E4%BA%BA%E9%99%AA.mp3',
''
];
function addAudio() {
var e = document.getElementById('audio');
if (e === null) {
e = document.createElement('audio');
e.setAttribute('index', 0);
e.id = 'audio';
e.loop = false;
e.innerHTML = 'Please update your browser!!';
document.body.appendChild(e);
e.addEventListener('ended', function() {
go()
})
}
}
function cycle() {
var e = document.getElementById('audio');
if (e != null) {
var index = parseInt(e.getAttribute('index'));
if (index > songs.length - 2) {
index = 0
} else {
index++
}
e.setAttribute('index', index)
}
e.src = i;
e.play();
}
addAudio();
var SongIndex = parseInt(document.getElementById('audio').getAttribute('index'));
var i = songs[SongIndex];
cycle();
}

这就是一个完整的音乐播放器了。

3、调用其实就是执行 go() 函数,更新歌曲就修改一下 songs[] 数组就行了。。

终于写完了!!

文章中如果有错误欢迎指出,非常乐意和大家一起交流。
完整代码可到 JavaScript-Programs 下载