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

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

May 22, 2018 pm 04:40 PM

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

Klipsch 推出 Flexus Core 300 旗艦條形音箱,支援 8K、12 個揚聲器和房間校正 Klipsch 推出 Flexus Core 300 旗艦條形音箱,支援 8K、12 個揚聲器和房間校正 Sep 05, 2024 am 10:16 AM

Klipsch Flexus Core 300 是該系列中的頂級型號,位於該公司條形音箱系列中現有的 Flexus Core 200 之上。根據 Klipsch 的說法,這是世界上第一個聲音可以適應現實的條形音箱。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

See all articles