//
// 0) {
this.lrcArr.push(item);
}
}

frag = document.createDocumentFragment();

for(i = 0,len = this.lrcArr.length; i ','').replace('//','');
//处理时间
this.timestamp.push(this.lrcArr[i].replace(re,function(a,b,c) {
return b;
}).replace('[','').replace(']',''));
frag.appendChild(li);
}

ul.appendChild(frag);
this.li = g('lrcArea').getElementsByTagName('li');
},
//播放
play:function() {
this.stop = false;
var that = this,
player = this.player,
i,len;

this.t = setInterval(function() {
if(that.stop) return;
that.curTime = player.currentTime;

for(i = 0,len = that.timestamp.length - 1; i prevTime && parseFloat( that.curTime )

首先需要整理好lrc格式的歌词放到script标签中以供程序处理。然后把音乐链接放到audio的src属性里就可以了。

源码:

HTML部分

 <div class="container">
<audio id="player" src="test.mp3" loop controls preload></audio>
<div id="lrcArea"></div>
</div> <script id="lrc" type="text">
//lrc歌词
</script>

JS部分

 var musicPlayer = function() {
return this.init.apply(this, arguments);
}; musicPlayer.prototype = {
constructor: musicPlayer,
init: function(options) {
if (isEmptyObj(options) || typeof options !== 'object') return;
this.player = options.player;
this.lrc = options.lrc;
this.lrcArea = options.lrcArea;
//用于保存歌词
this.lrcArr = [];
//用于保存时间戳
this.timestamp = [];
//处理歌词
this.handleLrc(this.lrc);
var that = this; this.player.addEventListener('play',
function() {
that.play();
},
false); this.player.addEventListener('pause',
function() {
that.pause();
},
false); //歌词索引
this.idx = 0;
},
//格式化歌词
handleLrc: function(lrc) {
var re = /(\[.+\])(.+)?/gm,
ul = cEl('ul'),
frag = document.createDocumentFragment(),
tmpArr,
i,
len;
this.lrcArea.innerHTML = '';
frag.appendChild(ul);
ul.id = 'c';
this.lrcArea.appendChild(frag); var txt = lrc.replace(re,
function(a, b, c) {
return b + (c === undefined ? '&nbsp;': c) + '\n';
}); tmpArr = txt.split('\n'); //处理歌词
for (i = 0, len = tmpArr.length; i < len; i++) {
var item = trim(tmpArr[i]);
if (item.length > 0) {
this.lrcArr.push(item);
}
} frag = document.createDocumentFragment(); for (i = 0, len = this.lrcArr.length; i < len; i++) {
var li = cEl('li');
if (i === 0) {
li.className = 'cur';
}
li.innerHTML = this.lrcArr[i].replace(/\[.+\]/i, '');
//处理时间
this.timestamp.push(this.lrcArr[i].replace(re,
function(a, b, c) {
return b;
}).replace('[', '').replace(']', ''));
frag.appendChild(li);
} ul.appendChild(frag);
this.li = $('lrcArea').getElementsByTagName('li');
},
//播放
play: function() {
this.stop = false;
var that = this,
player = this.player,
i, len; this.t = setInterval(function() {
if (that.stop) return;
that.curTime = player.currentTime; for (i = 0, len = that.timestamp.length - 1; i < len; i++) {
var prevTime = that.formatTimeStamp(that.timestamp[i]),
nextTime = that.formatTimeStamp(that.timestamp[i + 1]);
//当前播放时间与前后歌词时间比较,如果位于这两者之间则转到该歌词
if (parseFloat(that.curTime) > prevTime && parseFloat(that.curTime) < nextTime) {
that.scrollToLrc(i);
return;
}
}
},
300);
},
//暂停
pause: function() {
this.stop = true;
clearInterval(this.t);
},
//格式化时间
formatTimeStamp: function(timestamp) {
var re = /([0-9]+):([0-9]+)\.([0-9]+)/i,
seconds = timestamp.replace(re,
function(a, b, c, d) {
return Number(b * 60) + Number(c) + parseFloat('0.' + d);
});
return seconds;
},
//歌词滚动
scrollToLrc: function(idx) {
var ds = getOffset(this.li[idx]).top,
i,
len;
//如果歌词索引没有变动,则认为这句没有唱完,不处理
if (this.idx === idx) return;
//否则更新索引值并更新样式和位置
this.idx = idx;
for (i = 0, len = this.li.length; i < len; i++) {
this.li[i].className = '';
}
this.li[idx].className = 'cur';
this.lrcArea.scrollTop = ds - this.lrcArea.offsetHeight / 2;
}
}; function $(id) {
return typeof id === 'string' ? document.getElementById(id) : id;
}
function cEl(el) {
return document.createElement(el);
}
function trim(str) {
return str.replace(/(^\s*)|(\s*$)/g, "");
}
function isEmptyObj(o) {
for (var p in o) return false;
return true;
}
function getOffset(el) {
var parent = el.offsetParent,
left = el.offsetLeft,
top = el.offsetTop; while (parent !== null) {
left += parent.offsetLeft;
top += parent.offsetTop;
parent = parent.offsetParent;
} return {
left: left,
top: top
};
} var p = new musicPlayer({
player: $('player'),
lrc: $('lrc').innerHTML,
lrcArea: $('lrcArea')
});

简单的HTML5音乐播放器(带歌词滚动)的更多相关文章

  1. jquery音乐播放器(歌词滚动版)

    好久没出来水了!!!忙忙碌碌的找工作~然后中秋节也算过了,祝各位coding们,直接觉醒第七感小宇宙,直接用心就能找到bug-_-// 最后如题这是一篇很正规的coding的文章 大概么比以前的加了个 ...

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

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

  3. 一款非常简单的android音乐播放器源码分享给大家

    一款非常简单的android音乐播放器源码分享给大家,该应用虽然很小,大家常用的播放器功能基本实现了,可能有点还不够完善,大家也可以自己完善一下,源码在源码天堂那里已经有了,大家可以到那里下载学习吧. ...

  4. 【源码分享】mui实现简单的手机音乐播放器

    mui实现简单的手机音乐播放器 最近先来无事,我用mui写了一个可以跨页面控制的音乐播放器.主要功能有上一曲,下一曲,播放,暂停,感兴趣的可以继续看下去. 说的总是不实在,直接上源码,有兴趣的可以读下 ...

  5. android快捷简单的实现音乐播放器

    自己做了一个相对完整的音乐播放器,现在把播放模块提取出来,分享给大家.音乐播放器基本功能都实现了的,可能有些BUG,希望谅解. 播放器功能如下: 1.暂停,播放 2.拖动条实现,快进,快退 3.歌词同 ...

  6. jqm视频播放器,html5视频播放器,html5音乐播放器,html5媒体播放器,video开展demo,html5视频播放演示示例,html5移动视频播放器

    最近看到很多有用的论坛html5视频播放的发展,音乐播放功能,大多数都在寻找答案.所以,我在这里做一个demo.对于大家互相学习.html5开发越来越流行,至于这也是一个不可缺少的一部分的视频. 如何 ...

  7. iOS开发手记-仿QQ音乐播放器动态歌词的实现

    最近朋友想做个音乐App,让我帮忙参考下.其中歌词动态滚动的效果,正好我之前也没做过,顺便学习一下,先来个预览效果. 实现思路 歌词常见的就是lrc歌词了,我们这里也是通过解析lrc歌词文件来获取其播 ...

  8. HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器

    HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道 ...

  9. 使用Audio API设计绚丽的HTML5音乐播放器

    HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道 ...

随机推荐

  1. [CODEVS1916] 负载平衡问题(最小费用最大流)

    传送门 输入所有 a[i],求出平均值 sum,每个 a[i] -= sum 那么如果 a[i] > 0,从 s 向 i 连一条容量为 a[i] 费用为 0 的有向边 如果 a[i] < ...

  2. AIX 常用命令 第一步(uname,lspv)

    如何知道自己在运行单处理器还是多处理器内核? /unix 是指向已启动内核的符号链接.要了解正在运行什么内核模式,可输入 ls -l /unix 并查看 /unix 链接到什么文件.下面是 ls -l ...

  3. CountDownLatch和CyclicBarrier 的用法

    CountDownLatch是减计数方式,计数==0时释放所有等待的线程:CyclicBarrier是加计数方式,计数达到构造方法中参数指定的值时释放所有等待的线程.CountDownLatch当计数 ...

  4. bzoj 2795 [Poi2012]A Horrible Poem hash+线性筛

    题目大意 bzoj 2795 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节. 如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. n<=500 ...

  5. C#实现键盘钩子

    前言: 因为项目中需要使用到快捷键,所以上网找资料了解关于快捷键的实现技术,于是有了键盘钩子的使用学习.在网上了解到,键盘钩子其实只是很多种钩子中的其中一种.所谓钩子:请看下面关于钩子的描述(来自百度 ...

  6. js-jquery 中$.ajax -浅显接触

    工作了将近2年,终于开始自己写ajax了!!!真紧张的! 当年培训时就没有学ajax,就让我们自己看看,我是那种主动学习的人吗?不是!!!所以搞不懂ajax!!!!! 在工作中,数据的绑定我们之前都是 ...

  7. js-解决移动端点击事件的延迟问题

    众所周知,在手机上的点击事件会有延迟300ms的问题.但在做手机端某些点击小游戏时,我们就需要取消这个延迟的问题: 第一步:禁止页面的缩放 <meta name="viewport&q ...

  8. python笔记3:注释命名风格

    6.注释: 行注释采用  # 开头,多行注释使用三个单引号 (''') 或三个双引号 ("' '"),注释不需要对齐 三引号让程序员从引号和特殊字符串的泥潭里面解脱出来,自始至终保 ...

  9. 微信小程序踩坑之一【weui-wxss-master单选按钮图标修改思路】

    小程序原生所带的weui框架做小程序UI实在太方便了,但是他的一些细微变化也是让开发中碰到不少头疼的问题 一直以来单选多选的美化都是设计师重点表达的地方之一 而weui-wxss-master中的单选 ...

  10. 信号板拼包:数组方式(bug长度只是截短,并未清空,若之后拷贝数据长度小于之前数据长度,老数据会接在后面)

    class SignalobardMsgReadHandler : public SessionVectChar::ReadHandler{public:  SignalobardMsgReadHan ...