qq音樂播放小Demo

效果圖

在這裏插入圖片描述

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <link rel="stylesheet" href="css/reset.min.css">
    <link rel="stylesheet" href="css/index.css">
    <script>
        (function () {
            function computedFont() {
                let winW = document.documentElement.clientWidth;
                document.documentElement.style.fontSize = winW/750*100+"px";
            }
            computedFont();
            window.addEventListener("resize",computedFont)
        })();
    </script>
</head>
<body>
<div  class="container">
    <audio src="img/myDream.m4a" id="music"></audio>
    <div class="imgBg"></div>
    <div class="bg"></div>
    <header class="header">
        <div class="content">
            <img src="img/myDream.jpg" alt="">
            <h3>
                <span>我的夢</span>
                <span>張靚穎</span>
            </h3>
        </div>
        <a href="javascript:;" id="musicBtn"></a>
    </header>
    <main class="main">
        <div class="wrap">
            <p>明天會更好</p>
            <p>明天會更好</p>
            <p>明天會更好</p>
            <p>明天會更好</p>
            <p>明天會更好</p>
            <p>明天會更好</p>
            <p>明天會更好</p>
            <p>明天會更好</p>
            <p>明天會更好</p>
        </div>
    </main>
    <footer class="footer">
        <div class="progress">
            <div class="proBg">
                <div class="lineBg"></div>
            </div>
            <span id="left">00:00</span>
            <span id="right">00:00</span>
        </div>
        <a href="##" id="down">下載這首歌曲</a>
    </footer>
</div>
<script src="js/zepto.min.js"></script>
<script src="js/index1.js"></script>
</body>
</html>

css


html,body{
    width:100%;
    height:100%;
}
.container{
    width:100%;
    height:100%;
}
.container .imgBg,.container  .bg{
    position: absolute;
    width:100%;
    height:100%;
    left:0;
    top:0;
    z-index:-2;
}
.container .imgBg{
    background: url("../img/myDream.jpg") no-repeat;
    background-size: cover;
    /*模糊度*/
    filter:blur(7px);
}
.container  .bg{
    background: rgba(0,0,0,0.2);
}
/*header的樣式*/
.header{
    width:100%;
    padding:0.3rem;
    box-sizing: border-box;
    background: rgba(0,0,0,0.3);
    position: relative;
}
.header .content img{
    width:1.2rem;
    height:1.2rem;
}
.header .content h3{
    display: inline-block;
    /* 把元素的頂端與行中最高元素的頂端對齊*/
    vertical-align: top;
}
.header .content span{
    color:white;
    display: block;
}
.header .content span:nth-child(1){
    font-size: 0.45rem;
}
.header #musicBtn{
    position: absolute;
    right:0.3rem;
    top:50%;
    margin-top: -0.3rem;
    display: inline-block;
    width:0.6rem;
    height:0.6rem;
    background: url("../img/music.svg") no-repeat;
    background-size:100% 100%;
}
.header #musicBtn.select{
    animation: move 2s linear infinite;
}
@keyframes move {
    from{
        transform: rotate(0deg);
    }
    to{
        transform: rotate(360deg);
    }
}
/*main部分*/
.main{
    width:100%;
    /* height:9rem; */
    padding:0.3rem;
    position: relative;
    overflow: hidden;
    box-sizing: border-box;
}
.main .wrap{
    position: absolute;
    width:96%;
    top:0;
    transition: all 0.5s linear;
}
.main .wrap  p{
    width:100%;
    text-align: center;
    line-height: 0.84rem;
    height:0.84rem;
    color:rgba(255,255,255,0.6);
    font-size: 0.4rem;
}
.main .wrap  p.select{
    color:#31C27C;
}
/*footer的樣式*/
.footer{
    width:100%;
    position: relative;
}
.footer .progress{
    position: relative;
}
.footer .progress .proBg{
    width:65%;
    margin:auto;
    height:0.04rem;
    background: rgba(255,255,255,0.5);
}
.footer .progress .proBg .lineBg{
    height:0.04rem;
    width:0;
    background: #31C27C;
}
.footer .progress span{
    color:rgba(255,255,255,0.5);
    position: absolute;
    top:-0.15rem;
}
.footer .progress #left{
    left:0.5rem;
}
.footer .progress #right{
    right:0.5rem;
}
.footer #down{
    display: block;
    width:60%;
    height:1rem;
    line-height: 1rem;
    text-align: center;
    color:white;
    font-size: 0.4rem;
    border-radius: 0.5rem;
    margin:0 auto;
    background: url("../img/sprite_play.png") 0.2rem -5.86rem no-repeat #31C27C;
    background-size:0.8rem 7rem;
}

js

let music = $("#music")[0];
let timer;
//1. 計算出內容區的高度,動態設置
function computedMain(){
    // 用屏幕的高度-header的高度-footer的高度來計算main的高度;
    let winH = document.documentElement.clientHeight;
    let headerH = $(".header")[0].offsetHeight;
    let footerH = $(".footer")[0].offsetHeight;
    // 獲取最新的fontSize值;
    let fontSize = parseFloat(document.documentElement.style.fontSize);
    // debugger
    let mainH  = (winH-headerH-footerH)/fontSize+"rem"; 
    // console.log(mainH);
    $(".main").css("height",mainH);
}
computedMain();

// 2.請求數據,並綁定數據
$.ajax({
    url:"./json/lyric.json",
    type:"get",
    async:false,
    success:function(data){
        // 將data中屬性名是lyric的屬性值傳遞給bindHtml;
        bindHtml(data.lyric);
    }
});

// 3.數據綁定
function bindHtml(data){
    data=data.replace(/&#(\d+);/g,function(res,a){
        switch(a){
            case "32":
                return " ";
            case "40":
                return "(";
            case "41":
                return ")";
            case "45":
                return "-";
        }
        return res;
    });
    let arr = [];
    data.replace(/\[(\d+)&#58;(\d+)&#46;\d+\]([^&#]+)(?:(&#\d+))/g,function(res,a,b,val){
        arr.push({
            a,
            b,
            val
        });
    });
    // 循環準備好的數組,拼接字符串,並放入wrap這個元素中;
    let str=``;
    for(let i=0;i<arr.length;i++){
        let cur = arr[i];
        str+=`<p data-min="${cur.a}" data-sec="${cur.b}">${cur.val}</p>`
    }
    $(".wrap").html(str);
    music.addEventListener("canplay",function(){
        // 當音頻加載完畢,會執行這個元素的canplay事件;
        $("#right").html(formate(music.duration));
    });
}
// 3.給按鈕綁定點擊事件;如果當前是暫停狀態,就讓其播放,如果是播放狀態,就讓其暫停
// tap: 沒有延遲;
$("#musicBtn").tap(function(){
    if(music.paused){
         music.play();
         $(this).addClass("select");
         timer=setInterval(computedTime,100);
         return;
    }else{
        music.pause();
        $(this).removeClass("select");
        clearInterval(timer);
        return;
    }
});
function formate(time){// time : 是秒;返回一個分鐘:秒
    let min = Math.floor(time/60);
    let sec = Math.floor(time%60);
    min = min<10?"0"+min:min;
    sec=sec<10?"0"+sec:sec;
    return min+":"+sec;
}
// audio :currentTime
let curT = 0;
let flag = 0;
function computedTime(){
    let curTime = music.currentTime;
    let duration = music.duration;
    let cur = formate(curTime);// "00:16"
    if(curTime>=duration){
        // 播放完以後的執行
        clearInterval(timer);
        $("#musicBtn").removeClass("select");
        $(".wrap").css("top", 0);
        return;
    }
    $("#left").html(cur);
    $(".lineBg").css("width",curTime/duration*100+"%");
    let min = cur.split(":")[0];
    let sec = cur.split(":")[1];
    // 獲取到所有的p元素;
    let allP = document.getElementsByTagName("p");
    for(let i=0;i<allP.length;i++){
        let curP = allP[i];
        // 獲取當前行分鐘以及秒數
        let minP = curP.getAttribute("data-min");// 00  01
        let secP = curP.getAttribute("data-sec");
        // 讓左下角的時間和這個行上的時間進行比較,如果相同,音樂已經播放到了這一行,加顏色
        if(min===minP&&sec===secP){
            // 只要這一行加
            //curP.removeAttribute("data-min");
            if(curP.className!=="select"){
                //console.log(curP.className);
                //flag++;
                $(curP).addClass("select").siblings().removeClass("select");
                // i : 第幾個p元素;
                if(i>=6){
                    curT-=0.84;
                    $(".wrap").css("top",curT+"rem");
                }
            }
            
        }
    }

}

json

{
  "retcode": 0,
  "code": 0,
  "subcode": 0,
  "type": 1,
  "songt": 0,
  "lyric": "[ti&#58;《我的夢》]&#10;[ar&#58;張靚穎]&#10;[al&#58;]&#10;[by&#58;]&#10;[offset&#58;0]&#10;[00&#58;01&#46;36]我的夢&#32;&#40;華爲手機主題曲&#41;&#32;&#45;&#32;張靚穎&#10;[00&#58;02&#46;11]詞:王海濤/張靚穎&#10;[00&#58;02&#46;64]曲:Andy&#32;Love&#10;[00&#58;03&#46;48]編曲:崔迪&#10;[00&#58;04&#46;49]&#10;[00&#58;08&#46;73]一直地一直地往前走&#10;[00&#58;11&#46;65]&#10;[00&#58;13&#46;02]瘋狂的世界&#10;[00&#58;14&#46;58]&#10;[00&#58;16&#46;68]迎着痛把眼中所有夢&#10;[00&#58;20&#46;52]&#10;[00&#58;21&#46;03]都交給時間&#10;[00&#58;22&#46;71]&#10;[00&#58;24&#46;24]想飛就用心地去飛&#10;[00&#58;26&#46;98]誰不經歷狼狽&#10;[00&#58;30&#46;68]&#10;[00&#58;31&#46;60]我想我會忽略失望的灰&#10;[00&#58;34&#46;99]擁抱遺憾的美&#10;[00&#58;39&#46;05]我的夢說別停留等待&#10;[00&#58;43&#46;94]就讓光芒折射淚溼的瞳孔&#10;[00&#58;47&#46;74]映出心中最想擁有的彩虹&#10;[00&#58;51&#46;78]帶我奔向那片有你的天空&#10;[00&#58;55&#46;74]因爲你是我的夢&#10;[01&#58;01&#46;06]&#10;[01&#58;07&#46;19]我的夢&#10;[01&#58;08&#46;72]&#10;[01&#58;16&#46;75]執着地勇敢地不回頭&#10;[01&#58;20&#46;29]&#10;[01&#58;21&#46;05]穿過了黑夜踏過了邊界&#10;[01&#58;24&#46;87]路過雨路過風往前衝&#10;[01&#58;28&#46;39]&#10;[01&#58;28&#46;96]總會有一天站在你身邊&#10;[01&#58;32&#46;52]淚就讓它往下墜&#10;[01&#58;35&#46;00]濺起傷口的美&#10;[01&#58;38&#46;60]&#10;[01&#58;39&#46;55]哦別以爲失去的最寶貴&#10;[01&#58;43&#46;00]才讓今天浪費&#10;[01&#58;47&#46;04]我的夢說別停留等待&#10;[01&#58;51&#46;93]就讓光芒折射淚溼的瞳孔&#10;[01&#58;55&#46;66]映出心中最想擁有的彩虹&#10;[01&#58;59&#46;75]帶我奔向那片有你的天空&#10;[02&#58;03&#46;67]因爲你是我的夢&#10;[02&#58;09&#46;14]&#10;[02&#58;11&#46;72]我的夢&#10;[02&#58;13&#46;09]&#10;[02&#58;15&#46;13]我的夢&#10;[02&#58;16&#46;64]&#10;[02&#58;19&#46;60]我的夢&#10;[02&#58;21&#46;39]&#10;[02&#58;24&#46;27]世界會怎麼變化&#10;[02&#58;26&#46;58]都不是意外&#10;[02&#58;28&#46;33]記得用心去回答&#10;[02&#58;30&#46;52]命運的精彩&#10;[02&#58;32&#46;34]世界會怎麼變化&#10;[02&#58;34&#46;51]都離不開愛&#10;[02&#58;36&#46;25]記得成長的對話&#10;[02&#58;38&#46;28]&#10;[02&#58;39&#46;11]勇敢地說我不再等待&#10;[02&#58;45&#46;63]就讓光芒折射淚溼的瞳孔&#10;[02&#58;49&#46;75]映出心中最想擁有的彩虹&#10;[02&#58;53&#46;74]帶我奔向那片有你的天空&#10;[02&#58;57&#46;73]因爲你是我的夢&#10;[03&#58;02&#46;71]&#10;[03&#58;05&#46;51]我的夢&#10;[03&#58;07&#46;32]&#10;[03&#58;09&#46;20]我的夢&#10;[03&#58;14&#46;12]因爲你是我的夢"
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章