//
// 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. 二进制<1>

    Matrix67:位运算简介及实用技巧(一) 基础篇 什么是位运算?    程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.比如,and运 ...

  2. 关于 lambda expression 返回值的类型转换

    lambda expression(lambda 表达式,$\lambda$ 表达式) 是 C++ 11 引入的特性. 一般而言,lambda 表达式的返回值类型可不指定,而由返回值推断. 需要注意的 ...

  3. 正则表达式的\b与\B总结

    \b 单词边界,是指单词与符号之间的边界,是一个位置,不是空格或字符.(这里单词可以是中文字符,英文字符,数字:  符号可以是中文符号,英文符号,空格,制表符,换行).不能与量词?+*{1}{2,5} ...

  4. [POI2007]MEG-Megalopolis (树状数组,Dfs序)

    题目描述 Solution 这道题考试的时候竟然没有仔细想,结果只拿了暴力分... 其实就是一个 DFS序+树状数组. 我们先把用 DFS 把它变成一个序列,同时记录它们的 \(siz\). 那么我们 ...

  5. bzoj 2794 [Poi2012]Cloakroom 离线+背包

    题目大意 有n件物品,每件物品有三个属性a[i], b[i], c[i] (a[i]<b[i]). 再给出q个询问,每个询问由非负整数m, k, s组成,问是否能够选出某些物品使得: 对于每个选 ...

  6. FWT 学习笔记

    FWT学习笔记 好久以前写的,先粘上来 定义数组 \(n=2^k\) \(A=[a_0,a_1,a_2,a_3,...,a_{n-1}]\) 令\(A_0=[a_0,a_1,a_2,...,a_{\f ...

  7. 洛谷P1469找筷子

    题目描述 经过一段时间的紧张筹备,电脑小组的“RP餐厅”终于开业了,这天,经理LXC接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘手的问题,筷子!CX ...

  8. 【CF676C】Vasya and String(二分查找,线性扫描尺取法)

    题意: 给出一个长度为n的字符串,只有字符'a'和'b'.最多能改变k个字符,即把'a'变成'b'或把'b'变成'a'. 问改变后的最长连续相同字符的字串长度为多少. 首先是二分查找,好想也好写 .. ...

  9. Android4.2.2 动态显示隐藏屏幕底部的导航栏(对系统源码进行修改)

    需求如题. 在Android4.2.2中,导航栏(也就是屏幕底部的三个按钮,home,back,recentapp)是系统应用SystemUi.apk的一部分,简言之,我们的需求就是让我们的app来控 ...

  10. HDU 2874 Connections between cities(LCA)

    题目链接 Connections between cities LCA的模板题啦. #include <bits/stdc++.h> using namespace std; #defin ...