简单的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 });
View Code

 

转载于:https://www.cnblogs.com/undefined000/p/5118673.html

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现歌词的 HTML 音乐播放器,可以使用 HTML5 的 `<audio>` 标签和 JavaScript 来实现。 以下是一个简单的示例: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>音乐播放器</title> </head> <body> <audio id="myAudio" controls> <source src="music.mp3" type="audio/mpeg"> </audio> <div id="lyrics"></div> <script> // 歌词数据 var lyrics = [ { time: 0, text: "Verse 1" }, { time: 5, text: "Line 1" }, { time: 10, text: "Line 2" }, { time: 15, text: "Chorus" }, { time: 20, text: "Chorus Line 1" }, { time: 25, text: "Chorus Line 2" } ]; // 获取音频元素 var audio = document.getElementById("myAudio"); // 获取歌词容器元素 var lyricsDiv = document.getElementById("lyrics"); // 监听音频时间更新事件 audio.addEventListener("timeupdate", function() { // 获取当前播放时间 var currentTime = audio.currentTime; // 查找当前播放时间对应的歌词 var currentLyric = lyrics.find(function(lyric) { return currentTime >= lyric.time; }); // 显示当前歌词 if (currentLyric) { lyricsDiv.innerHTML = currentLyric.text; } else { lyricsDiv.innerHTML = ""; } }); </script> </body> </html> ``` 在这个示例中,我们使用了一个数组来存储歌词数据。在 JavaScript 中,我们可以通过监听音频元素的 `timeupdate` 事件来获取当前播放时间,并根据播放时间查找当前应该显示的歌词。然后,我们将当前歌词显示在一个 `<div>` 元素中。 需要注意的是,这个示例并不完整,只是提供了一个基本的思路。如果要实现一个真正的歌词音乐播放器,还需要考虑更多的细节和功能,比如歌词滚动歌词高亮、歌词同步等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值