首頁 >web前端 >H5教程 >詳細介紹HTML5使用Audio標籤實現歌詞同步的效果

詳細介紹HTML5使用Audio標籤實現歌詞同步的效果

黄舟
黄舟原創
2018-05-22 16:40:436812瀏覽

HTML5的最強之處莫過於對媒體檔案的處理,如利用一個簡單的vedio標籤就可以實現影片播放。類似地,在HTML5中也有對應的處理音訊檔案的標籤,那就是audio標籤。透過本文介紹HTML5使用Audio標籤實現歌詞同步的效果,有興趣的朋友一起學習吧 HTML5的最強之處莫過於對媒體檔案的處理,如利用一個簡單的vedio標籤就可以實現影片播放。類似地,在HTML5中也有對應的處理音頻文件的標籤,那就是audio標籤
HTML5出來這麼久了,但是關於它裡面的audio標籤也就用過那麼一次,當然還僅僅只是把這個標籤插入到了頁面中。這次呢就剛好趁著幫朋友做幾個頁面,拿這個audio標籤來練練手。
首先你需要在頁面中插入一個audio標籤,注意這裡最好不要設定loop='loop',這個屬性使用來設定循環播放的,因為到後面需要使用ended屬性的時候,如果loop被設定為loop的話,ended屬性將一直是false。
autoplay='autoplay'設定頁面載入後自動播放音樂,preload和autoplay屬性的作用是一樣的,如果標籤中出現了autoplay屬性,那麼preload屬性將被忽略。
controls='controls'設定顯示音樂的控制條。 

XML/HTML Code复制内容到剪贴板
<audio src="music/Yesterday Once More.mp3" id="aud" autoplay="autoplay" controls="controls" preload="auto">
您的浏览器不支持audio属性,请更换浏览器在进行浏览。    
</audio>

有了這個標籤之後,那麼恭喜你,你的頁面已經可以播放音樂了。但這樣會不會顯得頁面太過於單調了,於是我又為頁面添加了一些東西,讓歌詞能夠同步的顯示在頁面上,還能夠選擇要播放的音樂。那麼先要做成這樣的效果,我們就得要去下載一些lrc格式的歌詞文件,然後你需要把這些音樂格式化一番。因為剛開始的音樂檔案是這樣的

詳細介紹HTML5使用Audio標籤實現歌詞同步的效果


我們需要把每一句歌詞插入到一個二位元陣列裡面,經過格式化之後歌詞就變成這樣的格式了
這裡附上格式化歌詞的程式碼

詳細介紹HTML5使用Audio標籤實現歌詞同步的效果


XML/HTML Code复制内容到剪贴板
//歌词同步部分    
function parseLyric(text) {    
//将文本分隔成一行一行,存入数组    
var lines = text.split(&#39;\n&#39;),    
//用于匹配时间的正则表达式,匹配的结果类似[xx:xx.xx]    
pattern = /\[\d{2}:\d{2}.\d{2}\]/g,    
//保存最终结果的数组    
result = [];    
//去掉不含时间的行    
while (!pattern.test(lines[0])) {    
lineslines = lines.slice(1);    
};    
//上面用&#39;\n&#39;生成生成数组时,结果中最后一个为空元素,这里将去掉    
lines[lines.length - 1].length === 0 && lines.pop();    
lines.forEach(function(v /*数组元素值*/ , i /*元素索引*/ , a /*数组本身*/ ) {    
//提取出时间[xx:xx.xx]    
var time = v.match(pattern),    
//提取歌词    
vvalue = v.replace(pattern, &#39;&#39;);    
//因为一行里面可能有多个时间,所以time有可能是[xx:xx.xx][xx:xx.xx][xx:xx.xx]的形式,需要进一步分隔    
time.forEach(function(v1, i1, a1) {    
//去掉时间里的中括号得到xx:xx.xx    
var t = v1.slice(1, -1).split(&#39;:&#39;);    
//将结果压入最终数组    
result.push([parseInt(t[0], 10) * 60 + parseFloat(t[1]), value]);    
});    
});    
//最后将结果数组中的元素按时间大小排序,以便保存之后正常显示歌词    
result.sort(function(a, b) {    
return a[0] - b[0];    
});    
return result;    
}

到了這裡我們就能夠很容易的使用每首音樂的歌詞了,我們需要有一個function來獲得歌詞,並且讓他同步的顯示在頁面上,能夠正常的切換音樂。下面附上程式碼。

XML/HTML Code复制内容到剪贴板
function fn(sgname){    
$.get(&#39;music/&#39;+sgname+&#39;.lrc&#39;,function(data){    
var str=parseLyric(data);    
for(var i=0,li;i<str.length;i++){    
li=$(&#39;<li>&#39;+str[i][1]+&#39;</li>&#39;);    
$(&#39;#gc ul&#39;).append(li);    
}    
$(&#39;#aud&#39;)[0].ontimeupdate=function(){//视屏 音频当前的播放位置发生改变时触发    
for (var i = 0, l = str.length; i < l; i++) {    
if (this.currentTime /*当前播放的时间*/ > str[i][0]) {    
//显示到页面    
$(&#39;#gc ul&#39;).css(&#39;top&#39;,-i*40+200+&#39;px&#39;); //让歌词向上移动    
$(&#39;#gc ul li&#39;).css(&#39;color&#39;,&#39;#fff&#39;);    
$(&#39;#gc ul li:nth-child(&#39;+(i+1)+&#39;)&#39;).css(&#39;color&#39;,&#39;red&#39;); //高亮显示当前播放的哪一句歌词    
}    
}    
if(this.ended){ //判断当前播放的音乐是否播放完毕    
var songslen=$(&#39;.songs_list li&#39;).length;    
for(var i= 0,val;i<songslen;i++){    
val=$(&#39;.songs_list li:nth-child(&#39;+(i+1)+&#39;)&#39;).text();    
if(val==sgname){    
i=(i==(songslen-1))?1:i+2;    
sgname=$(&#39;.songs_list li:nth-child(&#39;+i+&#39;)&#39;).text(); //音乐播放完毕之后切换下一首音乐    
$(&#39;#gc ul&#39;).empty(); //清空歌词    
$(&#39;#aud&#39;).attr(&#39;src&#39;,&#39;music/&#39;+sgname+&#39;.mp3&#39;);    
fn(sgname);    
return;    
}    
}    
}    
};    
});    
} fn($(&#39;.songs_list li:nth-child(1)&#39;).text());

那麼到了這裡你的音樂歌詞已經能夠正常的同步顯示在頁面上了。不過還缺少一個東西,就是一個音樂的列表,我希望能夠點擊這個列表裡的音樂,從而播放該音樂,下面附上程式碼。
HTML程式碼 

XML/HTML Code复制内容到剪贴板
<p class="songs_cnt">
<ul class="songs_list">
<li>Yesterday Once More</li>
<li>You Are Beautiful</li>
</ul>
<button class="sel_song">点<br/><br/>我</button>
</p>
<p id="gc">
<ul></ul>
</p>

css程式碼

XML/HTML Code复制内容到剪贴板
#gc{    
width: 400px;    
height: 400px;    
background: transparent;    
margin: 100px auto;    
color: #fff;    
font-size: 18px;    
overflow: hidden;    
position: relative;    
}    
#gc ul{    
position: absolute;    
top: 200px;    
}    
#gc ul li{    
text-align: center;    
height: 40px;    
line-height: 40px;    
}    
.songs_cnt{    
float: left;    
margin-top: 200px;    
position: relative;    
}    
.songs_list{    
background-color: rgba(0,0,0,.2);    
border-radius: 5px;    
float: left;    
width: 250px;    
padding: 15px;    
margin-left: -280px;    
}    
.songs_list li{    
height: 40px;    
line-height: 40px;    
font-size: 16px;    
color: rgba(255,255,255,.8);    
cursor: pointer;    
}    
.songs_list li:hover{    
font-size: 20px;    
color: rgba(255,23,140,.6);    
}    
.sel_song{    
position: absolute;    
top: 50%;    
width: 40px;    
height: 80px;    
margin-top: -40px;    
font-size: 16px;    
text-align: center;    
background-color: transparent;    
border: 1px solid #2DCB70;    
font-weight: bold;    
cursor: pointer;    
border-radius: 3px;    
font-family: sans-serif;    
transition:all 2s;    
-moz-transition:all 2s;    
-webkit-transition:all 2s;    
-o-transition:all 2s;    
}    
.sel_song:hover{    
color: #fff;    
background-color: #2DCB70;    
}    
.songs_list li.active{    
color: #f00;    
}

##js

#######################################
XML/HTML Code复制内容到剪贴板
$(&#39;.songs_list li:nth-child(1)&#39;).addClass(&#39;active&#39;);    
$(&#39;.songs_cnt&#39;).mouseenter(function () {    
var e=event||window.event;    
var tag= e.target||e.srcElement;    
if(tag.nodeName==&#39;BUTTON&#39;){    
$(&#39;.songs_list&#39;).animate({&#39;marginLeft&#39;:&#39;0px&#39;},&#39;slow&#39;);    
}    
});    
$(&#39;.songs_cnt&#39;).mouseleave(function () {    
$(&#39;.songs_list&#39;).animate({&#39;marginLeft&#39;:&#39;-280px&#39;},&#39;slow&#39;);    
});    
$(&#39;.songs_list li&#39;).each(function () {    
$(this).click(function () {    
$(&#39;#aud&#39;).attr(&#39;src&#39;,&#39;music/&#39;+$(this).text()+&#39;.mp3&#39;);    
$(&#39;#gc ul&#39;).empty();    
fn($(this).text());    
$(&#39;.songs_list li&#39;).removeClass(&#39;active&#39;);    
$(this).addClass(&#39;active&#39;);    
});    
})

以上是詳細介紹HTML5使用Audio標籤實現歌詞同步的效果的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn