简单的HTML5音乐播放器(带歌词滚动)

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

源码:

HTML部分

1 <div class="container">
2      <audio id="player" src="test.mp3" loop controls preload></audio>
3      <div id="lrcArea"></div>
4 </div>
5
6 <script id="lrc" type="text">
7 //lrc歌词
8 </script>

JS部分

  1 var musicPlayer = function() {
  2     return this.init.apply(this, arguments);
  3 };
  4
  5 musicPlayer.prototype = {
  6     constructor: musicPlayer,
  7     init: function(options) {
  8         if (isEmptyObj(options) || typeof options !== ‘object‘) return;
  9         this.player = options.player;
 10         this.lrc = options.lrc;
 11         this.lrcArea = options.lrcArea;
 12         //用于保存歌词
 13         this.lrcArr = [];
 14         //用于保存时间戳
 15         this.timestamp = [];
 16         //处理歌词
 17         this.handleLrc(this.lrc);
 18         var that = this;
 19
 20         this.player.addEventListener(‘play‘,
 21         function() {
 22             that.play();
 23         },
 24         false);
 25
 26         this.player.addEventListener(‘pause‘,
 27         function() {
 28             that.pause();
 29         },
 30         false);
 31
 32         //歌词索引
 33         this.idx = 0;
 34     },
 35     //格式化歌词
 36     handleLrc: function(lrc) {
 37         var re = /(\[.+\])(.+)?/gm,
 38         ul = cEl(‘ul‘),
 39         frag = document.createDocumentFragment(),
 40         tmpArr,
 41         i,
 42         len;
 43         this.lrcArea.innerHTML = ‘‘;
 44         frag.appendChild(ul);
 45         ul.id = ‘c‘;
 46         this.lrcArea.appendChild(frag);
 47
 48         var txt = lrc.replace(re,
 49         function(a, b, c) {
 50             return b + (c === undefined ? ‘&nbsp;‘: c) + ‘\n‘;
 51         });
 52
 53         tmpArr = txt.split(‘\n‘);
 54
 55         //处理歌词
 56         for (i = 0, len = tmpArr.length; i < len; i++) {
 57             var item = trim(tmpArr[i]);
 58             if (item.length > 0) {
 59                 this.lrcArr.push(item);
 60             }
 61         }
 62
 63         frag = document.createDocumentFragment();
 64
 65         for (i = 0, len = this.lrcArr.length; i < len; i++) {
 66             var li = cEl(‘li‘);
 67             if (i === 0) {
 68                 li.className = ‘cur‘;
 69             }
 70             li.innerHTML = this.lrcArr[i].replace(/\[.+\]/i, ‘‘);
 71             //处理时间
 72             this.timestamp.push(this.lrcArr[i].replace(re,
 73             function(a, b, c) {
 74                 return b;
 75             }).replace(‘[‘, ‘‘).replace(‘]‘, ‘‘));
 76             frag.appendChild(li);
 77         }
 78
 79         ul.appendChild(frag);
 80         this.li = $(‘lrcArea‘).getElementsByTagName(‘li‘);
 81     },
 82     //播放
 83     play: function() {
 84         this.stop = false;
 85         var that = this,
 86         player = this.player,
 87         i, len;
 88
 89         this.t = setInterval(function() {
 90             if (that.stop) return;
 91             that.curTime = player.currentTime;
 92
 93             for (i = 0, len = that.timestamp.length - 1; i < len; i++) {
 94                 var prevTime = that.formatTimeStamp(that.timestamp[i]),
 95                 nextTime = that.formatTimeStamp(that.timestamp[i + 1]);
 96                 //当前播放时间与前后歌词时间比较,如果位于这两者之间则转到该歌词
 97                 if (parseFloat(that.curTime) > prevTime && parseFloat(that.curTime) < nextTime) {
 98                     that.scrollToLrc(i);
 99                     return;
100                 }
101             }
102         },
103         300);
104     },
105     //暂停
106     pause: function() {
107         this.stop = true;
108         clearInterval(this.t);
109     },
110     //格式化时间
111     formatTimeStamp: function(timestamp) {
112         var re = /([0-9]+):([0-9]+)\.([0-9]+)/i,
113         seconds = timestamp.replace(re,
114         function(a, b, c, d) {
115             return Number(b * 60) + Number(c) + parseFloat(‘0.‘ + d);
116         });
117         return seconds;
118     },
119     //歌词滚动
120     scrollToLrc: function(idx) {
121         var ds = getOffset(this.li[idx]).top,
122         i,
123         len;
124         //如果歌词索引没有变动,则认为这句没有唱完,不处理
125         if (this.idx === idx) return;
126         //否则更新索引值并更新样式和位置
127         this.idx = idx;
128         for (i = 0, len = this.li.length; i < len; i++) {
129             this.li[i].className = ‘‘;
130         }
131         this.li[idx].className = ‘cur‘;
132         this.lrcArea.scrollTop = ds - this.lrcArea.offsetHeight / 2;
133     }
134 };
135
136 function $(id) {
137     return typeof id === ‘string‘ ? document.getElementById(id) : id;
138 }
139 function cEl(el) {
140     return document.createElement(el);
141 }
142 function trim(str) {
143     return str.replace(/(^\s*)|(\s*$)/g, "");
144 }
145 function isEmptyObj(o) {
146     for (var p in o) return false;
147     return true;
148 }
149 function getOffset(el) {
150     var parent = el.offsetParent,
151     left = el.offsetLeft,
152     top = el.offsetTop;
153
154     while (parent !== null) {
155         left += parent.offsetLeft;
156         top += parent.offsetTop;
157         parent = parent.offsetParent;
158     }
159
160     return {
161         left: left,
162         top: top
163     };
164 }
165
166 var p = new musicPlayer({
167     player: $(‘player‘),
168     lrc: $(‘lrc‘).innerHTML,
169     lrcArea: $(‘lrcArea‘)
170 });

时间: 2024-10-21 18:25:49

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

音乐播放器带歌词切换

代码来自潭州java免费视频教程 <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name="Keywords" content=""> <meta name="Description" content=""> <title>音乐播放器</title

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

好久没出来水了!!!忙忙碌碌的找工作~然后中秋节也算过了,祝各位coding们,直接觉醒第七感小宇宙,直接用心就能找到bug-_-// 最后如题这是一篇很正规的coding的文章 大概么比以前的加了个歌词,之前的炸了,然后最近又修好了,一直东西在搬家,这次估计不搬家了,大不了美橙在买几个空间hoho 效果么大概一下,花了1个钟头快速写出来的~都说每个程序猿都有一颗设计狮的心,但是我记得我以前开始码代码之前做设计的时候,有一句话你设计不出来不会抄啊,然后我就无耻的盗图了.23333 头部很多人说丑

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

技术点:ES6+Webpack+HTML5 Audio+Sass 这里,我们将一步步的学到如何从零去实现一个H5音乐播放器. 首先来看一下最终的实现效果:Demo链接 接下来就步入正题: 要做一个音乐播放器就要非常了解在Web中音频播放的方式,通常都采用HTML5的audio标签关于audio标签,它有大量的属性.方法和事件,在这里我就做一个大致的介绍. 属性:src:必需,音频来源:controls:常见,设置后显示浏览器默认的audio控制面板,不设置默认隐藏audio标签:autoplay

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

mui实现简单的手机音乐播放器 最近先来无事,我用mui写了一个可以跨页面控制的音乐播放器.主要功能有上一曲,下一曲,播放,暂停,感兴趣的可以继续看下去. 说的总是不实在,直接上源码,有兴趣的可以读下注释. 1首页代码 ①首页的html代码 1 <a> 2 <i id="bofang" class="iconfont icon-play-o"></i> <!--就是一个播放按钮没啥特殊的--> 3 </a>

jqm视频播放器,html5视频播放器,html5音乐播放器,html5播放器,video开发demo,html5视频播放示例,html5手机视频播放器

最近在论坛中看到了很多实用html5开发视频播放,音乐播放的功能,大部分都在寻找答案.因此我就在这里做一个demo,供大家相互学习.html5开发越来越流行了,而对于视频这一块也是必不可少的一部分.如何让你的网站占据优势,就要看你的功能和用户体验了.html5对video还是做了很多优惠的东西,我们使用起来很得心应手. 在过去 flash 是网页上最好的解决视频的方法,截至到目前还算是主流,像那些优酷之类的视频网站.虾米那样的在线音乐网站,仍然使用 flash 来提供播放服务.但是这种状况将会随

非常漂亮的HTML5音乐播放器

APlayer是一个非常漂亮的HTML5音频播放器,它将audio标签封装,并结合CSS制作出漂亮的播放器UI,它支持设置歌名.歌手和歌词,可以设置是否自动播放,支持缩略图,支持播放进度以及设置播放源. 查看演示 下载源码 HTML 首先是要加载播放器样式文件,这个播放器的样式酷似网易云音乐播放器.然后在body中加入播放器div#player1,待会要调用播放.接着载入APlayer.js文件. <link rel="stylesheet" href="APlayer

iOS 简单实用的音乐播放器,少年,自己做个歌单吧。。。。。。

我也不知道为什么突然会想写一下音乐播放器的,感觉应该挺好的玩,自己把自己喜欢的歌曲导出来,用程序加载跑 起来,那歌听起来必定很带感啊......不过那首Love Story被我听了无数遍......听吐了 各位看官有兴趣也可以听听.其实前期准备是很坑爹的,找歌词真的蛋疼啊. 废话不多说,老规矩,看成品先: 尼玛这东西占得空间太大了,录不了太多...... 先介绍吧 首先 做个播放器的界面出来,上面是个tableView来加载歌词,底部两个Slider,一个声音,一个进度,最底下三个Button.

安卓音乐播放器中歌词同步问题

音乐文件是.lrc格式的,以一首歌曲为例, [ti:回忆的沙漏][ar:邓紫棋][al:G.E.M.][by:][offset:0][00:02.50]回忆的沙漏 - G.E.M. 邓紫棋[00:04.62]词:庭竹[00:05.72]曲:G.E.M.[00:15.03]拼图一片片失落[00:18.56]像枫叶的冷漠[00:21.87]墙上的钟[00:23.79]默默数着寂寞[00:29.30]咖啡飘散过香味[00:33.06]剩苦涩陪着我[00:36.68]想念的心[00:39.44]埋葬我在

iOS音乐播放器(歌词自动滚动)

简单实现基于IOS的音乐播放器,并且带有歌词,随播放自动滚动,实现效果如下: 首先,需要建立一个解析歌词的类ZMPlrc,解析歌词主要就是把时间和对应的歌词分离出来,然后存储到数组中. ZMPlrc.h #import <Foundation/Foundation.h> @interface ZMPlrc : NSObject /** 时间 */ @property (nonatomic,strong)NSMutableArray *timeArray; /** 歌词 */ @property