好程序員前端分享使用JS開發簡單的音樂播放器

好程序員前端分享使用JS開發簡單的音樂播放器,最近,我們在教學生使用JavaScript,今天就帶大家開發一款簡單的音樂播放器。首先,最終效果如圖所示:


首先,我們來編寫html界面index.html,代碼如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title></title>

<link rel="stylesheet" type="text/css" href="css/style.css"/>

<script src="js/jquery-2.1.0.js" type="text/javascript" charset="utf-8"></script>

<script src="js/common.js" type="text/javascript" charset="utf-8"></script>

</head>

<body>

<!--播放器-->

<audio id="song" autoplay="autoplay"></audio>

<!--整體結構-->

<div id="boxDiv">

<!--歌詞展示區域-->

<div id="contentDiv">

<!--歌詞顯示-->

<div id="lrcDiv"></div>

<!--上部陰影-->

<span id="bgTopSpan"></span>

<!--下部陰影-->

<span id="bgBottomSpan"></span>

</div>

<!--控制區域-->

<div id="controlDiv">

<!--進度條-->

<div id="progressDiv"></div>

<!--進度條圓點-->

<img id="pointerImg" src="img/audio/progress_pointer@2x.png"/>

<!--播放時間-->

<span id="playTimeSpan">00:00</span>

<!--歌曲標題-->

<span id="titleSpan"></span>

<!--總時間-->

<span id="totalTimeSpan">00:00</span>

<!--按鈕區域-->

<div id="buttonDiv">

<!--上一首按鈕-->

<img id="prevImg" src="img/audio/play_above_song@2x.png"/>

<!--播放暫停按鈕-->

<img id="playOrPauseImg" src="img/audio/play@2x.png"/>

<!--下一首按鈕-->

<img id="nextImg" src="img/audio/play_next_song@2x.png"/>

</div>

</div>

</div>

</body>

</html>


接下來,編寫style.css,代碼如下:

body{

margin: 0px;

background-color: #ccc;

}


#boxDiv{

width: 375px;

height: 568px;

margin: 10px auto;

position: relative;

}


#contentDiv{

width: 375px;

height: 460px;

background-image: url(../img/audio/play_bg@2x.png);

overflow: hidden;

}


#lrcDiv{

margin-top: 260px;

}


#lrcDiv span{

display: block;

line-height: 40px;

text-align: center;

color: white;

font-size: 20px;

}


#bgTopSpan{

position: absolute;

display: block;

width: 375px;

height: 30px;

top: 0px;

background-image: url(../img/audio/play_top_shadow@2x.png);

}


#bgBottomSpan{

top: 430px;

position: absolute;

background-image: url(../img/audio/play_bottom_shadow@2x.png);

display: block;

width: 375px;

height: 30px;

}


#controlDiv{

width: 375px;

height: 180px;

position: relative;

background-color: white;

}


#progressDiv{

background-color: red;

height: 1.5px;

width: 0px;

}


#pointerImg{

width: 18px;

height: 18px;

position: absolute;

top: -8.5px;

left: -3px;

}


#playTimeSpan{

display: block;

position: absolute;

font-size: 14px;

width: 35px;

top: 5px;

left: 5px;

}


#totalTimeSpan{

display: block;

position: absolute;

font-size: 14px;

width: 35px;

top: 5px;

left: 335px;

}


#titleSpan{

display: block;

position: absolute;

height: 30px;

width: 295px;

font-size: 20px;

text-align: center;

left: 40px;

top: 5px;

}


#buttonDiv{

margin-top: 40px;

position: relative;

}


#prevImg{

width: 40px;

height: 40px;

position: absolute;

top: 20px;

left: 60px;

}


#playOrPauseImg{

width: 70px;

height: 70px;

position: absolute;

top: 5px;

left: 152px;

}


#nextImg{

width: 40px;

height: 40px;

position: absolute;

top: 20px;

left: 275px;

}


最后,編寫common.js,代碼如下:

$(function(){

// 歌曲列表

var playList = ["紅日", "狼的誘惑", "漂洋過海來看你"];

// 當前播放的歌曲序號

var currentIndex = 0;

// 播放器的原生對象

var audio = $("#song")[0];

// 播放時間數組

var timeArr = [];

// 歌詞數組

var lrcArr = [];


// 調用播放前設置

setup();

// 播放歌曲

playMusic();


// 播放歌曲

function playMusic(){

// 播放歌曲

audio.play();

// 設置為暫停的圖片

$("#playOrPauseImg").attr("src", "img/audio/pause@2x.png");

}


// 歌曲播放前設置

function setup(){

// 設置播放哪一首歌曲

// img/audio/紅日.mp3

audio.src = "img/audio/" + playList[currentIndex] + ".mp3";

// 設置歌曲的名字

$("#titleSpan").text(playList[currentIndex]);

// 設置歌詞

setLrc();

}


// 設置歌詞

function setLrc(){

// 清空上一首的歌詞

$("#lrcDiv span").remove();

// 清空數組

timeArr = [];

lrcArr = [];

// 加載歌詞文件

$.get("img/audio/" + playList[currentIndex] + ".lrc", {}, function(data){

if(data){

// 按行切割字符串

var arr = data.split("\n");

// 分割歌詞

for (var i = 0; i < arr.length; i++) {

// 分割時間和歌詞

var tempArr = arr[i].split("]");

if (tempArr.length > 1){

// 添加時間和歌詞到數組

timeArr.push(tempArr[0]);

lrcArr.push(tempArr[1]);

}

}

// 顯示歌詞

for (var i = 0; i < lrcArr.length; i++) {

$("#lrcDiv").append("<span>"+lrcArr[i]+"</span>");

}

}

});

}


// 播放暫停事件

$("#playOrPauseImg").click(function(){

// 如果播放器是暫停狀態

if(audio.paused){

// 繼續播放

playMusic();

}else{

// 暫停

audio.pause();

// 變成播放的圖片

$("#playOrPauseImg").attr("src", "img/audio/play@2x.png");

}

});


// 上一首

$("#prevImg").click(function(){

// 如果是第一首,那么跳到最后一首

if(currentIndex == 0){

currentIndex = playList.length - 1;

}else{

currentIndex--;

}

// 播放前設置

setup();

// 播放

playMusic();

});

// 下一首

$("#nextImg").click(function(){

// 如果是最后一首,就跳到第一首

if(currentIndex == playList.length - 1){

currentIndex = 0;

}else{

currentIndex++;

}

// 播放前設置

setup();

// 播放

playMusic();

});


// 監聽播放器播放時間改變事件

audio.addEventListener("timeupdate", function(){

// 當前播放時間

var currentTime = audio.currentTime;

// 總時間

var totalTime = audio.duration;

// 當是數字的時候

if(!isNaN(totalTime)){

// 得到播放時間與總時長的比值

var rate = currentTime / totalTime;

// 設置時間顯示

// 播放時間

$("#playTimeSpan").text(getFormatterDate(currentTime));

// 總時長

$("#totalTimeSpan").text(getFormatterDate(totalTime));

// 設置進度條

$("#progressDiv").css("width", rate * 375 + "px");

// 設置進度圓點

$("#pointerImg").css("left", (375 - 15) * rate - 3 + "px");

// 設置歌詞的顏色和內容的滾動

for (var i = 0; i < timeArr.length - 1; i++) {

if(!isNaN(getTime(timeArr[i]))){

// 當前播放時間大于等于i行的時間,并且小于下一行的時間

if (currentTime >= getTime(timeArr[i]) && currentTime < getTime(timeArr[i+1])){

// 當前行歌詞變紅色

$("#lrcDiv span:eq("+i+")").css("color", "#FF0000");

// 其他行歌詞變白色

$("#lrcDiv span:not(:eq("+i+"))").css("color", "#FFFFFF");

// 當前行歌詞滾動

$("#lrcDiv").stop(false, true).animate({"margin-top": 260 - 40 * i + "px"}, 1000);

}

}

}

}

});


function getTime(timeStr){

// 去掉左邊的[

var arr = timeStr.split("[");

if(arr.length > 1){

// 得到右邊的時間

var str = arr[1];

// 分割分、秒

var tempArr = str.split(":");

// 分

var m = parseInt(tempArr[0]);

// 秒

var s = parseFloat(tempArr[1]);

return m * 60 + s;

}

return 0;

}


// 格式化時間(00:00)

function getFormatterDate(time){

// 分

var m = parseInt(time / 60);

// 秒

var s = parseInt(time % 60);

// 補零

m = m > 9 ? m : "0" + m;

s = s > 9 ? s : "0" + s;

return m + ":" + s;

}

});


圖片和歌曲、歌詞請自行下載,最后,可以運行試試了。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448704.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448704.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448704.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學生管理系統stuSystem函數

void stuSystem(){ struct student *head,*stu; int lookup_num; int Delete_num; int Modify_num; char ckeya; int istate0; do { system("cls"); //vc清屏函數&#xff0c;包含在#include<stdlib.h>中 printf(" 歡迎進入學生管理系統&#xff01;\n&q…

OpenCL用于計算機領域的13個經典案例

摘要&#xff1a;當使用加速器和OpenCL時&#xff0c;哪種類型的算法更加快速&#xff1f;來自弗吉尼亞理工大學的Wu Feng教授和他的團隊例舉了一份算法列表&#xff0c;分享了OpenCL常被用于計算機領域的13個經典案例。 哪種算法可以最好的映射GPU及矢量處理器呢&#xff1f;…

版本控制:集中式(SVN) vs 分布式(GIT)

Linus一直痛恨的CVS及SVN都是集中式的版本控制系統&#xff0c;而Git是分布式版本控制系統&#xff0c;集中式和分布式版本控制系統有什么區別呢&#xff1f; 先說集中式版本控制系統&#xff0c;版本庫是集中存放在中央服務器的&#xff0c;而干活的時候&#xff0c;用的都是…

Knative 核心概念介紹:Build、Serving 和 Eventing 三大核心組件

為什么80%的碼農都做不了架構師&#xff1f;>>> 作者| 阿里云智能事業群高級開發工程師 元毅 Knative 主要由 Build、Serving 和 Eventing 三大核心組件構成。Knative 正是依靠這三個核心組件&#xff0c;驅動著 Knative 這艘 Serverless 巨輪前行。下面讓我們來分…

樹莓派基金會來號召用鍵盤生物學家研究企鵝

倫敦動物學會&#xff08;Zoological Society of London&#xff09;于2014年&#xff0c;與伍茲霍爾海洋研究所和牛津大學等組織合作監控企鵝的計劃Penguin Lifelines有了新進展&#xff0c;倫敦動物學會現與其他動物保護組織合作Penguin Watch項目&#xff0c;邀請民眾在網上…

BlockingCollectionT 類實現 列隊操作

官方文檔 為實現 IProducerConsumerCollection<T> 的線程安全集合提供阻塞和限制功能。 通過 BlockingCollection<T> 實現列隊調用函數 建立全局變量 BlockingCollection<string> blockingCollection new BlockingCollection<string>(); 建立調用函數…

Git 版本回退

現在&#xff0c;你已經學會了修改文件&#xff0c;然后把修改提交到Git版本庫&#xff0c;現在&#xff0c;再練習一次&#xff0c;修改readme.txt文件如下&#xff1a; Git is a distributed version control system. Git is free software distributed under the GPL.然后嘗…

AMD院士站臺 異構計算與OpenCL編程師資培訓首站清華開講

摘要&#xff1a;2013年10月14日&#xff0c;“2013年異構計算與OpenCL編程師資培訓”在清華大學召開。本活動邀請到AMD、Khronos Group及清華大學的多位并行計算領域專家&#xff0c;與參會者共同探討OpenCL異構開發和優化技術。 2013年10月14日&#xff0c;由教育部科技發展…

【問題記錄】RIDE-1.7.3.1控制臺及日志中文亂碼處理

RIDE-1.7.3.1運行結果界面展示: 解決方法參考鏈接&#xff1a; https://blog.csdn.net/panda62/article/details/88535376 轉載于:https://www.cnblogs.com/quietCorner/p/11046656.html

GPU Saturday技術沙龍:OpenCL程序員眼中的下一代APU架構

摘要&#xff1a;GPU Saturday技術沙龍在北京3WCoffee成功舉辦。本次活動邀請AMD資深技術人員及清華大學項目研究員就AMD最新的GCN架構、GPU加速計算在挖掘比特幣、典型圖像算法、深度神經網絡算法等領域的分析與應用展開深入討論。 [CSDN報道] 9月5日&#xff0c;GPU Saturda…

直接取出 post 請求中的 json、得請求體參數、查看 post 請求參數

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 方法如下&#xff1a; try{ServletRequestAttributes requestAttributes (ServletRequestAttributes) RequestContextHolder.getReques…

SparkSQL調優

1、執行計劃&#xff08;過往記憶https://www.iteblog.com/archives/2562.html&#xff09; df.explain(true)//顯示邏輯計劃和物理計劃&#xff0c;不加true只顯示物理計劃 2、邏輯計劃優化方法&#xff1a; 謂詞下推&#xff0c;列裁剪&#xff0c;常量替換&#xff0c;常量累…

AMD發布APPML源碼,構建clMath庫

摘要&#xff1a;日前&#xff0c;AMD將加速并行處理數學庫&#xff08;Accelerated Parallel Processing Math Library簡稱APPML&#xff09;開源&#xff0c;內容包含了BLAS和FFT的OpenCL實現&#xff0c;項目托管在GitHub上&#xff0c;命名為clMath&#xff0c;該項目基于A…

最簡單的 post 請求發起方式、調用其它系統接口

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 調用其它系統接口&#xff0c;發起一個 post 請求&#xff0c;寫法如下&#xff1a; import cn.com.infinitus.yunxiao.jira.vo.EpicV…

CSS基礎學習 18.CSS多列

四種常見的瀏覽器內核&#xff1a; 轉載于:https://www.cnblogs.com/songsongblue/p/11050210.html

BGP

BGP&#xff1a;border gateway protocol 邊界網關路由協議 路由協議分類&#xff1a;內部網關路由協議IGP&#xff1a;rip ospf isis &#xff08;eigrp&#xff09;外部 網關路由協議EGP&#xff1a;EGP&#xff08;早期淘汰&#xff09; BGP BGP特點&#xff1a;1、針對大型…

OpenCL 2.0發布,帶來更強悍的異構計算能力

摘要&#xff1a;Khronos Group本周一發布了OpenCL 2.0&#xff0c;可為顯示芯片提供更好的獨立性&#xff0c;以便能為通用軟件計算出更大的力。該組織已經發布了2.0的臨時標準&#xff0c;預計正式版本的發布要等到6個月以后。 Khronos小組于本周一&#xff08;7月22日&…

從一個OutOfMemoryError 學會了分析Java內存泄漏問題

從一個OutOfMemoryError 學會了分析Java內存泄漏問題 以前都是好好的&#xff0c;最近出現了 oom。 問題 開始是&#xff1a; java.lang.OutOfMemoryError: Java heap space 2019-06-14 11:02:41.678 ERROR 13789 --- [nio-8082-exec-3] c.e.p.s.c.c.core.ELDictionaryControll…

Ubuntu安裝php7.2

1、使用ppa增加源apt-get install python-software-propertiesapt-get install software-properties-commonadd-apt-repository ppa:ondrej/php2、更新apt-get update3、查看源中PHP7.2版本apt list | grep php 列表中已經包含你想要的PHP版本了4、安裝PHP7.2apt-get -y …

會出現 unreachable statement 的可能

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 java編譯器把unreachable statement標記為運行時錯誤&#xff0c;一個unreachable statement就是編譯器決定永遠不會執行它。 下面的幾…