1. 程式人生 > >一步一步實戰HTML音樂播放器

一步一步實戰HTML音樂播放器

在這裡我用HTML5從頭開始一步一步來製作一個簡約的音樂播放器,大家可以參考一下,接下來正式開始。


音樂播放器效果


播放器分析

這裡將播放器分兩塊來做:

  • 檢視層(html + css)
  • 邏輯層 ( js )

檢視層分析

檢視中包含:

  • 播放器容器
    • 播放器名稱
    • 音樂專輯圖
    • 音樂資訊
      • 歌曲名
      • 歌手
      • 專輯名
    • 控制區
      • 上一曲
      • 播放
      • 下一曲
    • 播放進度條
    • 播放時間
      • 當前時間
      • 歌曲總時間
    • 音訊控制元件
  • 頁面背景

邏輯層分析

邏輯層處理包括:

  • 載入歌單
  • 渲染歌曲資訊
    • 專輯圖
    • 歌曲名
    • 歌手
    • 專輯名
    • 歌曲時長
    • 歌曲音訊地址
  • 監聽控制按鈕
    • 播放按鈕 (修改播放狀態)
    • 上一曲(判斷歌單邊界,重新渲染歌曲資訊)
    • 下一曲(判斷歌單邊界,重新渲染歌曲資訊)
  • 定時器
    • 同步歌曲當前時間和播放進度條
    • 歌曲播放完,自動切換下一曲

好了,播放器基本分析完成,接下來開始編碼了,先進行檢視層的編寫。


檢視層結構編寫

根據我在上面的檢視層分析,來構建HTML結構。

建立index.html,結構編碼如下:

<!-- 頁面背景 -->
<body>
    <!-- 播放器容器 -->
    <div class="player">

        <!-- 播放器名稱 -->
        <div class="header">音樂播放器</div>

        <!-- 音樂專輯圖 -->
<div class="albumPic"></div> <!-- 音樂資訊 --> <div class="trackInfo"> <!-- 歌曲名 --> <div class="name"></div> <!-- 歌手 --> <div class="artist"></div> <!-- 專輯名 --> <div class="album"></div> </div> <!-- 播放進度條 --> <div class="progress"></div> <!-- 控制區 --> <div class="controls"> <!-- 播放 --> <div class="play"> <i class="icon-play"></i> </div> <!-- 上一曲 --> <div class="previous"> <i class="icon-previous"></i> </div> <!-- 下一曲 --> <div class="next"> <i class="icon-next"></i> </div> </div> <!-- 播放時間 --> <div class="time"> <!-- 當前時間 --> <div class="current"></div> <!-- 歌曲總時間 --> <div class="total"></div> </div> <!-- 音訊控制元件 --> <audio id="audio"><source src=""></audio> </div> </body>

好了,結構編寫完畢,接下來編寫檢視層樣式。


檢視層樣式編寫

:這裡我是用LESS寫的CSS,後面我會貼出完整程式碼,或者到 CSDN CODE 下載原始碼

先重置標記樣式:

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
    display: block;
}
body {
    line-height: 1;
}
ol, ul {
    list-style: none;
}
blockquote, q {
    quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
    content: '';
    content: none;
}
table {
    border-collapse: collapse;
    border-spacing: 0;
}

設定body

//這裡主要設定背景和flex佈局,用於播放器垂直居中
@body-bg: #111;

html,body{
    height: 100%;
}

body{
    background-color: @body-bg;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font: 16px "微軟雅黑";
}

設定播放器容器 .player

//主要設定播放器的大小、背景顏色、定位等資訊
@player-bg: lighten(@body-bg, 10%);
@player-w: 375px;
@player-h: 550px;

.player{
    width: @player-w;
    height: @player-h;
    background-color: @player-bg;
    border-radius: 10px;
    position: relative;
}

設定播放器名稱.header樣式:

.player{    
    .header{
        padding: 15px 0;
        text-align: center;
    }
}

專輯圖.albumPic樣式:

.player{
    .albumPic{
        background-image: url(http://p3.music.126.net/SR9eFEjRB0NsscxN7-fHMw==/3344714372906000.jpg); //這裡先放一張臨時圖片,用於看效果,編寫完成後,把這條屬性刪除即可
        background-size: cover; //背景模式
        width: @player-w * 0.72; //通過計算設定寬高,可直接用百分比
        height: @player-w * 0.72;
        margin: auto; //居中
        border-radius: 10px;
    }
}

專輯資訊區域樣式:

.player{
    .trackInfo{
        text-align: center;
        padding: 20px 0 15px;
        font-size: 14px;
        white-space: nowrap;

        //單獨將歌曲名設定一下大小
        .name{
            font-size: 24px;
            margin-bottom: 10px;
            font-weight: bold;
        }
    }
}

播放進度條樣式:

.player{
    .progress{
        width: 30%; //這裡用於看效果,製作完成後,設定為0
        height: 20%;
        position: absolute; //用絕對定位放到播放器容器最下面和最左面
        bottom: 0;
        left: 0;
        background-image: linear-gradient(top, rgba(255, 255, 255, 0), #0099FF); //背景採用從上到下的線性漸變
        border-bottom-left-radius: 10px;
        border-bottom-right-radius: 10px;
        opacity: .4;
    }
}

按鈕控制區域樣式設定:

.player{
    .controls{
        //位置方面不用再額外設定了,按照對上面的設定,當前控制區的位置正好
        position: relative;

        //播放按鈕同樣採用flex佈局,用於對內部的網路字型按鈕垂直居中
        .play{
            cursor: pointer;
            width: 75px;
            height: 75px;
            border: 2px solid #ccc;
            border-radius: 50%; //加個圓框
            margin: auto;
            display: flex;
            align-items:center;
            justify-content:center;
            color: #fff;
            font-size: 35px;

            &:hover{
                font-size: 40px; //滑鼠經過變大字型
            }
        }

        //上、下一曲 共用樣式
        .btn(){
            cursor: pointer;
            position: absolute;         
            top: 25px;
            font-size: 30px;

            &:hover{
                font-size: 32px;
            }
        }

        //設定一下按鈕位置
        .previous{  
            .btn;       
            left: 60px;
        }

        .next{
            .btn;
            right: 60px;
        }
    }
}

播放時間區域設定:

.player{
    .time{
        width: @player-w - 40px; //計算pdding後的寬度,可自行計算
        display: flex;
        position: absolute;
        bottom: 0;
        padding: 20px;
        align-items: center;
        justify-content: space-between; //兩端分佈
    }
}

好了,通過上面的樣式設定,播放器的檢視層已完畢,看下效果(三個播放控制按鈕是引用的字型):

接下來開始編寫邏輯層。


邏輯層編寫

邏輯層用到了Jquery和歌曲清單資料playlist.js,先引用一下:

<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/playlist.js"></script>

playlist.js就是一堆json的歌單資料,資料是從網易雲音樂上獲取的,基本內容如下:

//因為做靜態頁有跨域問題,所以就直接把資料拿出來賦值給`playlist`這個物件上了,下面只保留了需要用到的資料物件
var playlist = {
    "result": {
        "tracks": [
            {
                "name": "歌曲名",
                "artists": [
                    {
                        "name": "演唱者",
                    }
                ],
                "album": {
                    "name": "專輯名",
                    "picUrl":專輯圖",
                "duration": 時長(ms),
                "mp3Url": "音樂地址"
            },

            ...//等等等
        ],
    },
};

網易雲音樂歌單json資料介面:http://music.163.com/api/playlist/detail?id=xxx

建立index.js,開始編碼:

先定義一個播放狀態物件playStatus

//當前播放器狀態
var playStatus = {
    currentTrackLen: playlist.result.tracks.length, //歌單歌曲數
    currentTrackIndex: 0, //當前播放的歌曲索引,預設載入第一首歌
    currentTime: 0, //當前歌曲播放的時間
    currentTotalTime: 0, //當前歌曲的總時間
    playStatus: true, //true為播放狀態,false為暫停狀態
};

因為要用到時間的轉換,所以編寫一個時間轉換函式:

var timeConvert = function(timestamp){
    var minutes = Math.floor(timestamp / 60);
    var seconds = Math.floor(timestamp - (minutes * 60));

    if(seconds < 10) {
      seconds = '0' + seconds;
    }

    timestamp = minutes + ':' + seconds;
    return timestamp;
};

接下來編寫一個物件,內部方法是控制播放器的:

//播放器控制方法物件
var playerControls = {
    //歌曲基本資訊設定
    trackInfo: function(args){
        //playerlist是playlist.js中的歌單資料,根據需求進行資料讀取即可
        var obj = playlist.result.tracks[playStatus.currentTrackIndex];

        args = args || {
            name:obj.name,
            artist:obj.artists[0].name,
            album:obj.album.name,
            albumPic:obj.album.picUrl + '?param=270y270',
            total:obj.duration,
            src: obj.mp3Url,
        };

        $('.player .trackInfo .name').text(args.name);
        $('.player .trackInfo .artist').text(args.artist);
        $('.player .trackInfo .album').text(args.album);   
        $('.player .albumPic').css('background','url(' + args.albumPic + ')');         
        $('.player .time .total').text(timeConvert(args.total / 1000)); //因為歌單資料中的播放長度用ms表示的,所以這裡 / 1000
        playStatus.currentTotalTime = Math.floor(args.total / 1000);
        $('#audio source').attr('src',args.src); //切換音樂通過修改<source>中的src
    },

    //播放、暫停狀態處理
    playStatus: function(){
        $('.player .controls .play i').attr('class', 'icon-' + (playStatus.playStatus?'pause':'play'));

        if(playStatus.playStatus){
            //用jquery獲取<audio>物件,必須加上[0]
            $('#audio')[0].play();
        }else{
            $('#audio')[0].pause();
        }
    },

    //當前時間和進度處理
    playTime: function(){
        $('.player .time .current').text(timeConvert(playStatus.currentTime));
        $('.player .progress').css('width', playStatus.currentTime / playStatus.currentTotalTime * 100 + '%'); //同步進度條
    }

};

還剩下一個初始化方法了:

var init = function(){
    //置一下歌曲資訊和播放狀態
    playerControls.trackInfo();     
    playerControls.playStatus();

    //播放按鈕事件監聽
    $('.player .controls .play').click(function(){
        //修改播放狀態
        playStatus.playStatus = !playStatus.playStatus; 
        //置播放資訊
        playerControls.playStatus();
    });

    //上一曲按鈕事件監聽
    $('.player .controls .previous').click(function(){
        //邊界判斷
        if(playStatus.currentTrackIndex - 1 < 0){
            alert('已經沒有上一首了');
        }else{
            playStatus.currentTrackIndex --;
        }

        //此處切換歌曲功能,原來打算採用直接修改src的方法實現,但是修改src後,之前播放的音樂還繼續播放著,切換後的音樂卻不播放,所以最終採用移除<audio>,再加入<audio>的方式來切換音樂
        $('#audio').remove();
        $('.player').append('<audio id="audio"><source src=""></audio>');  

        //更新音軌資訊和播放狀態       
        playerControls.trackInfo();
        playerControls.playStatus();
    });

    //下一曲按鈕事件監聽
    $('.player .controls .next').click(function(){
        if(playStatus.currentTrackIndex + 1 >= playStatus.currentTrackLen){
            alert('已經沒有下一首了');
        }else{
            playStatus.currentTrackIndex ++;
        }

        //換src的方法沒法切換聲音,試了好幾種方法都不行,只能刪了再重建了
        $('#audio').remove();
        $('.player').append('<audio id="audio"><source src=""></audio>');          
        playerControls.trackInfo();
        playerControls.playStatus();
    });

    //用時鐘來實時修改當前播放時間及播放完當前曲目自動下一曲
    setInterval(function(){
        playStatus.currentTime = $('#audio')[0].currentTime;           
        playerControls.playTime();

        if(playStatus.currentTime >= playStatus.currentTotalTime){
            $('.player .controls .next').click();
        }
    }, 300);
};

其後,再加入init()執行一下就OK了。


完整程式碼

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>H5音樂播放器</title>
    <link rel="stylesheet" type="text/css" href="css/index.css">
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript" src="js/playlist.js"></script>
    <script type="text/javascript" src="js/index.js"></script>
</head>
<body>
    <div class="player">
        <div class="header">音樂播放器</div>
        <div class="albumPic"></div>
        <div class="trackInfo">
            <div class="name"></div>
            <div class="artist"></div>
            <div class="album"></div>
        </div>
        <div class="progress"></div>
        <div class="controls">
            <div class="play">
                <i class="icon-play"></i>
            </div>
            <div class="previous">
                <i class="icon-previous"></i>
            </div>
            <div class="next">
                <i class="icon-next"></i>
            </div>
        </div>      
        <div class="time">
            <div class="current"></div>
            <div class="total"></div>
        </div>
        <audio id="audio"><source src=""></audio>
    </div>
</body>
</html>

index.css

@import 'reset.css';
@import 'fonts.css';
html,
body {
  height: 100%;
}
body {
  background-color: #111111;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  color: #fff;
  font: 16px "微軟雅黑";
}
.player {
  width: 375px;
  height: 550px;
  background-color: #2b2b2b;
  border-radius: 10px;
  position: relative;
}
.player .header {
  padding: 15px 0;
  text-align: center;
}
.player .albumPic {
  background-size: cover;
  width: 270px;
  height: 270px;
  margin: auto;
  border-radius: 10px;
}
.player .trackInfo {
  text-align: center;
  padding: 20px 0 15px;
  font-size: 14px;
  white-space: nowrap;
}
.player .trackInfo .name {
  font-size: 24px;
  margin-bottom: 10px;
  font-weight: bold;
}
.player .progress {
  width: 0;
  height: 20%;
  position: absolute;
  bottom: 0;
  left: 0;
  background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, 0), #0099ff);
  background-image: linear-gradient(top, rgba(255, 255, 255, 0), #0099ff);
  border-bottom-left-radius: 10px;
  border-bottom-right-radius: 10px;
  opacity: .4;
}
.player .controls {
  position: relative;
}
.player .controls .play {
  cursor: pointer;
  width: 75px;
  height: 75px;
  border: 2px solid #ccc;
  border-radius: 50%;
  margin: auto;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
      -ms-flex-pack: center;
          justify-content: center;
  color: #fff;
  font-size: 35px;
}
.player .controls .play:hover {
  font-size: 40px;
}
.player .controls .previous {
  cursor: pointer;
  position: absolute;
  top: 25px;
  font-size: 30px;
  left: 60px;
}
.player .controls .previous:hover {
  font-size: 32px;
}
.player .controls .next {
  cursor: pointer;
  position: absolute;
  top: 25px;
  font-size: 30px;
  right: 60px;
}
.player .controls .next:hover {
  font-size: 32px;
}
.player .time {
  width: 335px;
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  position: absolute;
  bottom: 0;
  padding: 20px;
  -webkit-box-align: center;
  -webkit-align-items: center;
      -ms-flex-align: center;
          align-items: center;
  -webkit-box-pack: justify;
  
            
           

相關推薦

實戰HTML音樂播放

在這裡我用HTML5從頭開始一步一步來製作一個簡約的音樂播放器,大家可以參考一下,接下來正式開始。 音樂播放器效果 播放器分析 這裡將播放器分兩塊來做: 檢視層(html + css) 邏輯層 ( js ) 檢視

Android AIDL技術實戰專案-音樂播放

實現功能 使用AIDL服務實現: 音樂播放、暫停、上一曲、下一曲、歌詞功能 音樂播放模式:順序播放 、隨機播放、單曲播放 多個頁面呼叫AIDL服務 主頁面底部音樂迷你控制器 音樂詳情頁面 程式

Qt終極教程----使用Qt製作款精緻小巧的開源音樂播放(HiPlayer)

HiPlay 是一款精緻小巧的音樂播放器。 其主要功能如下: 新增本地歌曲到播放列表; 自動通過網路獲取專輯圖片和歌詞; 歌詞桌面顯示,且帶有歌詞遮罩效果; Mini模式顯示。 以下是部分軟體截圖: 播放器主介面: 歌詞顯示效果: Mini視窗: Abou

實戰React音樂播放

上篇文章《一步一步實戰HTML音樂播放器》中,我用HTML+JS + CSS的方式一步步實現了一個音樂播放器,因為最近接觸了一下React,感覺挺不錯的,在這裡我用React的方式實現一個同樣的音樂播放器。 播放器功能 自動顯示 專輯圖片、歌手名、歌曲名、專輯名

Android AIDL技術實戰專案-音樂播放(二)-使用retrofit完成音樂API的封裝

使用retrofit完成音樂API的封裝 程式碼結構 1、匯入retrofit相關庫 compile 'com.squareup.retrofit2:retrofit:2.2.0' 2、編寫介面API public interfac

關於仿酷狗音樂播放開源:尋求音樂播放素材,讓仿酷狗開源

替換 log 設有 ext 軟件 水平 iss 開源 可靠 轉載請說明原出處,謝謝~~ 距離公布測試版的仿酷狗音樂播放器。已經幾個月過去了。期間非常多網友加我QQ來問我開源的問題,我也早有開源意向。但我也一直沒有得到可靠的信息,保證開

Android實現音樂播放

simple ani call ket 打開文件 界面 方式 .cn 點擊 Graphical User Interface 本篇文章記錄了我實現Android簡單音樂播放器的過程,(一)中介紹了怎麽構建音樂播放器的前端頁面。首先大家看一下,界面最後是這樣的(界面有

Android Studio學寫英語聽寫APP(音樂播放)

最近迷上了AndroidAPP,看了點資料就邊學邊寫,只是打發時間的個人愛好,工具為Android Studio3.0.1,為了偷懶,準備給孩子寫個聽寫APP,思路是到時候從APP下載音訊資源包到SD卡,APP播放直接讀取儲存路徑下的音訊,不用從Android自帶的媒體庫讀取(因為還不會遍歷

用c# -Winform開發音樂播放專案

最近一段時間有時間,就試著用c#-winform寫個音樂播放器的窗體,接著就進行了,我先前在網上收集好素材,另外還看了幾篇有關音樂播放器的專案,整合,融合自己的風格就完成了以下專案.雖然現在功能不多,但是在慢慢完善,如果有人想要看一下原始碼,請聯絡我QQ:1439802478 &n

70行python程式碼製作款簡易的音樂播放

今天整理了以前的python作業程式碼,發現了一些有趣的小東西,比如下面這個,大概70行程式碼製作一款簡易的音樂播放器。 install some packages pip install pygame pygame是跨平臺Python模組,專為電子遊戲設計,包含影象

基於QT的網路音樂播放

自學Qt已經有一段時間了,但是始終感覺自己還是很弱(其實並不是感覺自己很弱,是自己本來就很弱,哈哈)。自己也照著書上敲了幾個例子,但覺得還是要寫點東西才能真正運用起來。所以,前段時間就寫了個很簡單的音樂播放器。在這裡總結一下,寫得不好,所以請各位不要介意。 先看

70行python程式碼製作款簡易的音樂播放

今天整理了以前的python作業程式碼,發現了一些有趣的小東西,比如下面這個,大概70行程式碼製作一款簡易的音樂播放器。 install some packages pip install pygame pygame是跨平臺Python模組,專為電子遊戲設計,包含影象、聲音。 我這裡

Android應用開發 MP3音樂播放程式碼實現

                Android應用開發--MP3音樂播放器程式碼實現(一)需求1:將記憶體卡中的MP3音樂讀取出來並顯示到列表當中1.   從資料庫中查詢所有音樂資料,儲存到List集合當中,List當中存放的是Mp3Info物件2.   迭代List集合,把每一個Mp3Info物件的所有屬性

Python學習之windows音樂播放之路(

1.python讀取檔案操作 與函式返回值: def getFilePath(): try: f = open("C:\\Users\\tangjing\\Desktop\\t

Android開源專案(音樂播放

作為一個有追求的程式設計師來說,專案原始碼必須看,但是網上那麼多資源是不讓你無從下手啊,博主今天為大家推薦五個經典專案吧。 一、android-UniversalMusicPlayer 這個開源專案展示瞭如何實現一個橫跨各種Android平臺的音樂播放器,包括手機,平板,汽車,手錶,電視等。 架構:

【Android】Android開源專案(音樂播放原始碼彙總

作為一個有追求的程式設計師來說,專案原始碼必須看,但是網上那麼多資源是不讓你無從下手啊,博主今天為大家推薦五個經典專案吧。 一、android-UniversalMusicPlayer 這個開源專案展示瞭如何實現一個橫跨各種Android平臺的音樂播放器,包

android-音樂播放實現及原始碼下載(

從本文開始,詳細講述一個音樂播放器的實現,以及從網路解析資料獲取最新推薦歌曲以及歌曲下載的功能。 功能介紹如下: 1、獲取本地歌曲列表,實現歌曲播放功能。 2、利用硬體加速感應器,搖動手機實現切換歌曲的功能 3、利用jsoup解析網頁資料,從網路獲取歌曲

基於android的網路音樂播放-本地音樂的載入和後臺播放

作為android初學者,最近把瘋狂android講義和瘋狂Java講義看了一遍,看到書中介紹的知識點非常多,很難全部記住,為了更好的掌握基礎知識點,我將開發一個網路音樂播放器-EasyMusic來鞏固下,也當作是練練手。感興趣的朋友可以看看,有設計不足的地方也

個人專案——音樂播放()

1 功能需求及技術可行性分析 1.1編寫目的   現今社會生活緊張,而欣賞音樂史其中最好的舒緩壓力的方式之一,音樂播放類的軟 件數不勝數,為什麼我還要再寫一個播放器出來呢?因為現有的音樂播放器功能實在是有些多了,多未必不好,但是我總想要一個乾淨純粹的音樂播放器,只為聽歌的

Android之自定義一個可播放時間段的音樂播放

本文純屬蛋疼,實現一個可以拖動,選擇需要播放的時間段,然後播放效果是隻播放這一段選中的音樂。 需求:自定義一個Android播放器 可以隨意選擇需要播放音樂片段 返回選中播放部分的音樂資料 分析: