demojava code前端项目实操

使用原生JavaScript制作一个漂亮的音乐播放器

2017-03-20  本文已影响2470人  xhr_bird

简单介绍

起初在简书上发现了这篇博客——【html、css、jq】制作一个简洁的音乐播放器。这是一个用jQuery库实现的音乐播放器,界面简约大气。

我在这个基础上,反其道而行,使用原生JavaScript实现。这个播放器是面向移动端的设备。在此感谢饥人谷张新望,有了他们开路,使用原生的JS实现起来也并不费力。

播放器的界面

怎么样,样式还可以吧?比较简单,最下面是可以操作的进度条和按钮,按钮从左至右依次是“显示歌词/隐藏歌词”、“切换频道”、“播放/暂停”、“下一曲”、“随机播放/单曲循环”。只有下一曲,没有上一曲,而且你永远不知道下一曲是啥,所以title就用了“与喜欢的音乐不期而遇”。

HTML部分

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="referrer" content="no-referrer">
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
        <title>与喜欢的音乐不期而遇</title>
        <link rel="shortcut icon" href="img/pic.jpg"/>
        <link rel="stylesheet" type="text/css" href="css/html5-doctor-reset-stylesheet.min.css"/>
        <link rel="stylesheet" type="text/css" href="css/index.css"/>
        <script src="js/flexible.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <header>
            <h1 class="song-title"></h1>
            <div class="singer"></div>
        </header>
        <div class="content">
            <div class="record-wrapper" style="display: block;">
                <div class="record-bg mid">
                    <div class="record-pic mid">
                        ![](img/pic.jpg)
                    </div>
                </div>
            </div>
            <div class="lyrics-wrapper">
                <ul class="lyrics"></ul>
            </div>
        </div>
        <footer>
            <div class="channel" data-channel-id=""></div>
            <div class="progress-bar">
                <div class="progress"></div>
                <div class="progress-btn"></div>
            </div>
            <div class="btns">
                <div class="show-lyrics icon-sides"></div>
                <div class="change-channel icon-middle"></div>
                <div class="play"></div>
                <div class="next icon-middle"></div>
                <div class="mode icon-sides"></div>
            </div>
        </footer>
        <div class="glass">
            <img>
        </div>
        <audio id="mic_audio"></audio>

        <script src="js/original_ajax.js" type="text/javascript" charset="utf-8"></script>
        <script src="js/index.js" type="text/javascript" charset="utf-8"></script>
    </body>
</html>

页面主要分为三部分,最上面的歌名和歌手名,中间的唱片和歌词,下面的操作面板,最下方,class为glass的div和img是整个页面的背景。

CSS部分

样式点击这里来看

JavaScript部分

js目录结构

这里面使用了一个flexible.js文件。这是rem布局(所以css文件里有好多单位是rem)为了多终端适配而增加的一个库。了解更多

还使用了一个original_ajax.js文件,封装一个ajax方法,用来发送Ajax请求

先把页面滚动禁掉(index.js)

    //取消body的touchmove默认行为,阻止页面滚动
    document.body.addEventListener('touchmove', function (event) {
        event.preventDefault();
    }, false);

original_ajax.js

 /* 封装ajax函数
    * @param {string}opt.type http连接的方式,包括POST和GET两种方式
   * @param {string}opt.url 发送请求的url
   * @param {boolean}opt.async 是否为异步请求,true为异步的,false为同步的
   * @param {object}opt.data 发送的参数,格式为对象类型
   * @param {function}opt.success ajax发送并接收成功调用的回调函数
   */
    function ajax(opt) {
        opt = opt || {};
        opt.method = opt.method.toUpperCase() || 'POST';
        opt.url = opt.url || '';
        opt.async = opt.async || true;
        opt.data = opt.data || null;
        opt.success = opt.success || function () {};
        var xmlHttp = null;
        if (XMLHttpRequest) {
            xmlHttp = new XMLHttpRequest();
        }
        else {
            xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
        }
        var params = [];
        for (var key in opt.data){
            params.push(key + '=' + opt.data[key]);
        }
        var postData = params.join('&');
        if (opt.method.toUpperCase() === 'POST') {
            xmlHttp.open(opt.method, opt.url, opt.async);
            xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
            xmlHttp.send(postData);
        }
        else if (opt.method.toUpperCase() === 'GET') {
            xmlHttp.open(opt.method, opt.url + '?' + postData, opt.async);
            xmlHttp.send(null);
        } 
        xmlHttp.onreadystatechange = function () {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                 opt.success(xmlHttp.responseText);
            }
        };
    }

获取频道和歌曲

    // 获取频道
    function getChannel () {
        ajax({
            method: 'GET',
            async: false,
            url: 'http://api.jirengu.com/fm/getChannels.php',
            success: function (response) {
                var jsonObj = JSON.parse(response);
                channelArr = jsonObj['channels'];
                getRandomChannel(channelArr);
                getMusic();
            }
        });
    }

    // 获取随机频道
    function getRandomChannel (channelArr) {
        var randomNum = Math.floor(channelArr.length * Math.random());
        var randomChannel = channelArr[randomNum];

        channel.innerHTML = randomChannel.name;
        channel.setAttribute('data-channel-id', randomChannel.channel_id);
    }

    // 获取音乐
    function getMusic () {
        ajax({
            method: 'GET',
            url: 'http://api.jirengu.com/fm/getSong.php',
            data: {
                "channel": channel.getAttribute("data-channel-id")
            },
            success: function (response) {
                var jsonObj = JSON.parse(response);
                var songObj = jsonObj['song'][0];

                songTitle.innerHTML = songObj.title;
                singer.innerHTML = songObj.artist;
                recordImg.src = songObj.picture;
                bigBg.src = songObj.picture;
                musicAudio.src = songObj.url;
                musicAudio.setAttribute('data-sid', songObj.sid);
                musicAudio.setAttribute('data-ssid', songObj.ssid);
                musicAudio.play();
                isLoading = false;
                getlyric();

                // 解决首次进入页面时,自动播放的兼容问题,不自动播放
                if (num === 1) {
                    musicAudio.onplaying = function () {
                        this.pause();
                        musicAudio.onplaying = null;
                    };
                    num++;
                }
            }
        });
    }

其他的部分,可以通过下载源码来查看。

上一篇下一篇

猜你喜欢

热点阅读