H5音乐播放器

时间:2022-09-10 15:34:02

前段时间无聊用JavaScript基于H5的audio写一个音乐播放器。误喷,技术有限,文笔不好之处希望各位大神海涵。

1、HTML代码:

<div id="music" class="music">
<div id="lyric_div">
<div id="lyric_tit"></div>
<div id="lyric_con">
<div id="lyric_txt">
<p>演唱者:xxx</p>
<p>编辑:果果</p>
<p>qq:123456789</p>
</div>
</div>
</div>
<div id="progress">
<div id="time_update">
<time>00:00</time>
</div>
<div id="progress_bar">
<div id="progress_cube"></div>
</div>
<div id="time_all">
<time>00:00</time>
</div>
</div>
<div id="bt_div">
<input type="button" value="上一首" id="up_song">
<input type="button" value="播放" id="play_stop">
<input type="button" value="下一首" id="next_song">
<audio id="audio" src="song/赵照-你就是我最想要的丫头.mp3"></audio>
</div>
</div>
<p id="p"></p>

2、JavaScprit代码     附上 带时间轴的歌曲的歌词的查找地址   http://www.cnlyric.com ,至于音频去QQ音乐下载就好了!!:

//http://www.cnlyric.com  带时间轴的歌曲的歌词的查找地址
var lyric = [{'name':'你就是我最想要的丫头','img':'','audio_src':'song/赵照-你就是我最想要的丫头.mp3','content':'[00:00.00] 你就是我最想要的丫头[00:04.00] 演唱:赵照[00:08.00] 歌词编辑:果果[00:12.00] QQ:190567797[00:16.00] zhangxiang[00:22.38] 微风轻轻吹着你散开的发[00:26.55] 忍不住想对你说心里的话[00:30.81] 多少次鼓起勇气话又难开口[00:35.38] 想想你的温柔总是低着头[00:39.72] 多希望天边晚霞一直燃烧[00:44.33] 永远灿烂别落下[00:48.50] 你浅笑的脸微闭的双眼[00:53.18] 我陷入了深深的迷恋[00:59.82] 有没有最纯真的童[01:04.17] 你就是我快乐的源头[01:08.81] 为你伤心 为你忧愁[01:13.26] 你就是我最想要的丫头[01:17.51] 有没有最幸福的生活[01:21.87] 你就是我甜蜜的拥有[01:26.59] 为你祈祷 为你逗留[01:30.95] 你就是我最想要的丫头[01:53.69] 微风轻轻吹着你散开的发[01:57.78] 忍不住想对你说心里的话[02:01.96] 多少次鼓起勇气话又难开口[02:06.59] 想想你的温柔总是低着头[02:10.93] 多希望天边晚霞一直燃烧[02:15.51] 永远灿烂别落下[02:19.80] 你浅笑的脸微闭的双眼[02:24.49] 我陷入了深深的迷恋[02:31.06] 有没有最纯真的童话[02:35.33] 你就是我快乐的源头[02:39.88] 为你伤心 为你忧愁[02:44.58] 你就是我最想要的丫头[02:48.62] 有没有最幸福的生活[02:53.22] 你就是我甜蜜的拥有[02:57.86] 为你祈祷 为你逗留[03:02.34] 你就是我最想要的丫头[03:06.88] 有没有最美丽的图画[03:11.06] 你站在夕阳下面挥着手[03:15.68] 为你伤心 为你忧愁[03:19.90] 你就是我最想要的丫头[03:24.12] 有没有最美好的生活[03:28.65] 我愿这样陪你到永久[03:33.42] 你的善良 你的温柔[03:37.74] 你就是我最想要的丫头[03:42.78] 你就是我最想要的丫头[03:46.84] 你就是我最想要的丫头'}
,{'name':"笑忘书",'img':'img/photo1.jpg','audio_src':'song/王菲-笑忘书.mp3','content':'[00:00.00][00:01.00]笑忘书(国)[00:03.00]王菲[00:05.00][00:12.00]没 没有蜡烛 就不用勉强庆祝[00:17.00]没 没想到答案 就不用寻找题目[00:23.00]没 没有退路 问我也不要思路[00:29.00]没 没人去仰慕 那我就继续忙碌[00:34.00]lalala 思前想后[00:37.00]差一点忘记了怎么投诉[00:40.00]lalala 从此以后 不要犯同一个错误[00:46.00]将这样的感触 写一封情书送给我自己[00:51.00]感动得要哭 很久没哭[00:54.00]不失为天大的幸福 将这一份礼物[00:59.00]这一封情书 给自己祝福[01:02.00]可以不在乎 才能对别人在乎[01:20.00]有 一点帮助 就可以对谁倾诉[01:26.00]有 一个人保护 就不用自我保护[01:32.00]有 一点满足 就准备如何结束[01:37.00]有 一点点领悟 就可以往后回顾01:43.00]lalala 思前想后[01:46.00]差一点忘记了怎么投诉[01:49.00]lalala 从此以后 不要犯同一个错误[01:54.00]将这样的感触 写一封情书送给我自己[01:59.00]感动得要哭 很久没哭[02:03.00]不失为天大的幸福 将这一份礼物[02:08.00]这一封情书 给自己祝福[02:11.00]可以不在乎 才能对别人在乎[02:43.00]Lalalala....... Lalalala.......[02:55.00]从开始哭着忌妒 变成了笑着羡慕[03:00.00]时间是怎么样把握了我皮肤[03:03.00]只有我自己最清楚[03:06.00]将这样的感触 写一封情书送给我自己[03:11.00]感动得要哭 很久没哭[03:15.00]不失为天大的幸福 将这一份礼物[03:19.00]这一封情书 给自己祝福[03:22.00]可以不在乎 才能对别人在乎[03:28.00]让我亲手 将这样的感触[03:31.00]写一封情书送给我自己[03:34.00]感动得要哭 很久没哭[03:37.00]不失为天大的幸福[03:39.00]就好好将这一份礼物[03:42.00]这一封情书 给自己祝福[03:45.00]可以不在乎 才能对别人在乎'}];
function $(id){
return document.getElementById(id);
} function init(){
//歌曲名
lyric_tit = $('lyric_tit');
//歌词外围div
lyric_con = $('lyric_con');
//包裹歌词的div
lyric_txt = $('lyric_txt');
//放置实时获取播放时间的容器
time_update = $('time_update').getElementsByTagName('time')[0];
//放置歌曲总时间/剩余多少时间的容器
time_all = $('time_all').getElementsByTagName('time')[0];
//进度条 白色
progress_bar = $('progress_bar');
//实时变化的进度条 红色
progress_cube = $('progress_cube');
//上一首
up_song = $('up_song');
//播放、暂停
play_stop = $('play_stop');
//下一首
next_song = $('next_song');
//音频
audio = $('audio');
//测试的p节点
p = $('p');
//初始化 取数组第一个
audioIndex = 0;
//音频初始化
audioInit();
//歌词初始化
lyric_str();
//播放 暂停
play_stop.addEventListener('click',play_stop_lick,false);
//上一首
up_song.addEventListener('click',up_song_lick,false);
//下一首
next_song.addEventListener('click',next_song_lick,false)
//歌曲时间每变化就触发
audio.addEventListener('timeupdate',audio_timeupdate,false);
//进度条单击事件 根据点击进度条的位置设置歌曲的播放时间,同时改变歌词。
progress_bar.addEventListener('click',progress_bar_click,false); } /*
* 点击进度条某一位置触发事件,并根据进度条的位置改变歌曲的播放时间 和 歌词的样式变化
*/
function progress_bar_click(e){
var e = e ? e : event;
//获取坐标
var pageX = e.pageX;
//获取白色进度条的left值
var progress_bar_Left = progress_bar.offsetLeft;
//计算进度条的百分比
var n = (pageX - progress_bar_Left)/progress_bar.offsetWidth;
//获取歌曲的总时间
var audio_duration = audio.duration;
/*
*根据进度条的百分比改变音频的播放时间
*公式 = 鼠标点击的位置到div最左边的位置宽度/div的总宽度*音频的总时间
*/
audio.currentTime = n*audio_duration; //获取音频播放的时间
var audio_currentTime = audio.currentTime
//获取到音频播放的秒数
var num = parseInt(audio_currentTime); //获取到当前的 歌词节点
var objElem_p = elem_p(num) //歌词的切换 样式调整
lyric_txt_p(objElem_p);
} /*
* 点击进度条时寻找指定的歌曲词的节点。
* 递归去找直到找到为止。
*/
function elem_p(num){
var boj_p = $('lyric'+num);
if(!boj_p){
return elem_p(num-1);
}else{
return boj_p;
}
return '';
} /**
*根据音频播放时间实时的改变进度条
*/
function audio_timeupdate(){
//获取音频的总时间 以秒为单位
var audio_duration = audio.duration;
//获取音频的播放时间 以秒为单位
var audio_currentTime = audio.currentTime
//歌曲自动播放完就切换下一首
if(audio_duration == audio_currentTime){
next_song_lick();
} //计算视频播放的百分比
var n = audio_currentTime/audio_duration;
//根据视频播放的百分比改变进度条 公式 = 播放时间/总时间*进度条的宽度
progress_cube.style.width = n*progress_bar.offsetWidth + 'px'; //获取到音频播放的秒数
var num = parseInt(audio_currentTime);
//将播放的事件显示到页面 format()转换为分秒格式
time_update.innerHTML = format(num); //剩余多少事件 并且显示到页面
var sum_num = parseInt(audio_duration)-parseInt(audio_currentTime);
if(!isNaN(sum_num)){
time_all.innerHTML = format(sum_num);
}else{
time_all.innerHTML = '00:00';
} //获取到当前唱到的这一句歌词
var boj_p = $('lyric'+num);
//改变样式
lyric_txt_p(boj_p);
} /**
*歌词的切换 样式调整
*/
function lyric_txt_p(obj){
//获取所有的歌词节点
var lyric_p = lyric_txt.getElementsByTagName('p');
//循环所有的节点并且为节点index赋值 注意不给index赋值的情况下index为undefined;
for(var i = 0; i < lyric_p.length;i++){
lyric_p[i].index = i;
} //当前节点不为空的情况下,就改变样式
if(obj){
//给当前节点之前已经唱过的歌词赋值样式。
for(var j = 0;j < obj.index; j++){
lyric_p[j].className = 'played';
}
//防止进度条往回点 所以index大于当前歌词节点的节点样式全部赋值为空
for(var j = obj.index;j < lyric_p.length; j++){
lyric_p[j].className = '';
} //给当前歌词赋值样式
obj.className = 'played2'
//改变歌词的样式 歌词外围div的宽度/2-当前歌词节点的top值
lyric_txt.style.top = lyric_con.offsetWidth/2 - obj.offsetTop +'px'; }
} //上一首
function up_song_lick(){
//audioIndex 默认为0
audioIndex --;
//当歌曲已经是第一条的时候 把歌曲切换到最后一条
if(audioIndex < 0){
audioIndex = lyric.length-1;
}
//初始化音频
audioInit();
//播放 暂停
play_stop_lick();
} // 下一首
function next_song_lick(){
audioIndex ++;
//当歌曲已经是最后一条的时候 切换到第一条歌曲
if(audioIndex > lyric.length-1){
audioIndex = 0;
}
audioInit();
play_stop_lick();
} //播放
function play_stop_lick(){
//audio.paused 暂停时就为true
if(audio.paused){
//播放
audio.play();
play_stop.value = '暂停';
}else{
//暂停
audio.pause();
play_stop.value = '播放';
}
} //解析歌词
function lyric_str(){
//获取当前歌曲的歌词
var str = lyric[audioIndex].content;
//alert(str);
var html = '';
var arr = str.split('[');
for(var i = 0 ; i < arr.length; i++ ){
var arr2 = arr[i].split(']');
//歌词
var text = arr2[1];
//歌词对应的时间
var time = arr2[0].split('.');
//毫秒
var ms = time[1];
//获取分 秒
var time2 = time[0].split(':');
//分
var m = time2[0];
//秒
var s = time2[1];
var num_s = (parseInt(m)*60)+parseInt(s);
//拼接歌词
if(text){
html += '<p id="lyric'+ num_s +'">'+ text +'</p>'
} }
lyric_txt.innerHTML = html; } //初始化
function audioInit(){
//将进度条的宽度初始化为0 红色的
progress_cube.style.width = 0 + 'px';
//获取歌曲的一个总时间
if(!isNaN(audio.duration)){
time_all.innerHTML = format(audio.duration);
}else{
time_all.innerHTML = '00:00'
}
//获取当前歌曲的名称
lyric_tit.innerHTML = lyric[audioIndex].name;
//获取当前歌曲的路径
audio.src = lyric[audioIndex].audio_src;
//歌词解析
lyric_str();
} function format(num){
var num = parseInt(num);
//得到的是分钟
var m = parseInt(num/60);
//得到的是秒
var s = parseInt(num%60);
//返回拼接的时间
return format_s(m)+':'+ format_s(s)
} //修改歌曲时间格式
function format_s(num){
if(num < 10){
return '0'+num;
}
return num;
}
window.addEventListener('load',init,false);

3、CSS代码:

#music{
width:400px;
height:600px;
margin:auto;
text-align:center;
background-color:#999;
}
#lyric_div{
width:400px;
height:500px;
} #lyric_tit{
color:#F00;
font:bold;
height:30px;
line-height:30px;
} #lyric_con{
overflow:hidden;
height:470px;
position:relative;
} #lyric_txt{
position:absolute;
width:400px;
top:0px;
left:0px;
} #bt_div{
width:400px;
height:50px;
line-height:50px;
}
#progress{
width:400px;
height:50px;
line-height:50px;
} #time_update{
float:left;
} #time_all{
float:left;
} #time_update,#time_all{
width:54px;
}
#progress_bar{
float:left;
width:290px;
height:3px;
background-color:#FFF;
margin-top:24px;
cursor:pointer;
}
#progress_cube{
height:3px;
background-color:#F00;
} #lyric_txt p.played{
color:#FF0;
} #lyric_txt p.played2{
color:#FF0;
font-weight:;
font-size:20px;
}

至此   以上是完整的代码,由于MP3文件没有办法上传,所以请自己到QQ音乐下载。

H5音乐播放器的更多相关文章

  1. 自制 h5 音乐播放器 可搜索

    闲言碎语: 有好几天没有发表博客了,这也是因为一直开发音乐和完善我的博客项目,好不容易抽出时间总结一下这几天所做的东西,笔试又不断通知,实则匆忙 今天难得逃了一次课,就趁这时间,该写写就写写吧~~ 进 ...

  2. H5音乐播放器源码地址

    源码获取 https://pan.baidu.com/s/1pR_bhIFFQWU6TK9ZvrRWIA      安卓安装包下载地址 https://pan.baidu.com/s/1Z8HF5LY ...

  3. H5音乐播放器源码共享

    由于博客云后台管理工具写起东西来实在难受,所以直接共享源码了! https://pan.baidu.com/s/1XeRxlk7iv5qt1f16s64F9w   H5源码!暂时只支持手机适配,电脑端 ...

  4. H5音乐播放器【歌单列表】

    上篇详细描述了播放页歌词如何实现跟随跟单滚动,如何解析歌词,那么歌单页又是如何生成的呢,话不多说,直接上图上代码! 首先需要获取数据,具体获取数据api请转到我跟我大兄弟博客去观看学习去,同时也感谢我 ...

  5. 使用余弦定理制作磁盘形状h5音乐播放器

    目录 [1]功能实现 [2]效果展示 [3]原理说明 旋转原理 余弦定理 [4]代码实现 HTML CSS JS [5]源码查看 功能实现 [1]歌曲播放进度转换成视觉的旋转角度 [2]点击磁盘任意位 ...

  6. 4个小时实现一个HTML5音乐播放器

    技术点:ES6+Webpack+HTML5 Audio+Sass 这里,我们将一步步的学到如何从零去实现一个H5音乐播放器. 首先来看一下最终的实现效果:Demo链接 接下来就步入正题: 要做一个音乐 ...

  7. Asp&period;Net MVC中Aplayer&period;js音乐播放器的使用

    1.前言: Aplater.js是一款可爱.漂亮的Js音乐播放器,以前就了解过也弄过一些,现在就用mp3的格式来在.Net里面开发.管网 https://aplayer.js.org/ 2.入手: 在 ...

  8. 用PHP&plus;H5&plus;Boostrap做简单的音乐播放器(进阶版)

    前言:之前做了一个音乐播放器(纯前端),意外的受欢迎,然后有人建议我把后台一起做了,正好也想学习后台,所以学了两天php(不要吐槽我的速度,慢工出细活嘛~)然后在之前的基础上也又完善了一些功能,所以这 ...

  9. H5&plus;Boostrap的音乐播放器

    H5+Boostrap做简单的音乐播放器 前言:这个是综合一下我最近在学的东西做的小Demo,到实际使用还有距离,但是用来练手巩固知识点还是不错的,最近在二刷JS书和Boostrap.css的源码,做 ...

随机推荐

  1. TurboDemo软件使用教程:视频编辑

    视频软件TurboDemo中不仅可以快速的捕捉屏幕,而且可以对视频进行编辑,本文来详细的了解一下这个步骤. 当你完整屏幕捕捉和录制后,点击系统托盘上的箭头或点击键盘上的“print screen”键之 ...

  2. Redis基础知识之————php-Redis 常用命令专题

    Keys del,delete - 删除键 dump - 返回存储在指定键值的序列化版本. exists - 确定键是否存在 expire,setTimeout,pexpire - 设置键的生存时间( ...

  3. DZ 3&period;2 URL 伪静态配置 教程

    原文转自:http://www.zccode.com/thread-682-1-1.html 教程说明: 1 首先需要下载URL重写工具,拷到服务器下面安装即可,这里配置IIS7(x64)伪静态. 工 ...

  4. java--线程的睡眠sleep&lpar;&rpar;

    package MyTest; public class Demo1 extends Thread { public void run() { loop(); } public void loop() ...

  5. myeclipse 2013 SR2 安装svn

    1.下载SVN-site-1.8.22.zip 2.找到MyEclipse安装路径 我的是F:\tool\myeclipse2013\dropins,复制SVN-site-1.8.22.zip到此文件 ...

  6. XML中添加换行符

    网上说的说法大多是 可是我这里cuba框架用这个不是换行,下面这个才行 这也是转义字符, 为什么会是这样的?搞不懂,求大神告知! 另外 表示空格 表示回车

  7. sql递归查询 根据Id查所有子结点

    Declare @Id Int Set @Id = 0; ---在此修改父节点 With RootNodeCTE(D_ID,D_FatherID,D_Name,lv) As ( Select D_ID ...

  8. Office web apps 打补丁后(安装PDF在线浏览) 错误解决

        最近为了能让PDF在线review,所以安装了460287_intl_x64_zip.exe 这个OWA的hotfix, 安装后,发现OWA挂了,一段搜索之后,发现要重新配置OWA: 1. 在 ...

  9. &lbrack;转&rsqb;用python爬虫抓站的一些技巧总结 zz

    来源网站:http://www.pythonclub.org/python-network-application/observer-spider 学用python也有3个多月了,用得最多的还是各类爬 ...

  10. CodeForces - 1040B Shashlik Cooking

    Long story short, shashlik is Miroslav's favorite food. Shashlik is prepared on several skewers simu ...