美文网首页demojava code前端项目实操
使用原生JavaScript制作一个漂亮的音乐播放器

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

作者: xhr_bird | 来源:发表于2017-03-20 00:43 被阅读2470次

简单介绍

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

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

  • 音乐是通过豆瓣FM的API获取到的
  • 界面类似于网易云音乐的样子
播放器的界面

怎么样,样式还可以吧?比较简单,最下面是可以操作的进度条和按钮,按钮从左至右依次是“显示歌词/隐藏歌词”、“切换频道”、“播放/暂停”、“下一曲”、“随机播放/单曲循环”。只有下一曲,没有上一曲,而且你永远不知道下一曲是啥,所以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++;
                }
            }
        });
    }

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

相关文章

网友评论

  • 77033b1c745d:谢谢分享
  • 02daf6a8b046:大佬,请问你的源码怎么才能看到
    xhr_bird:@鸭鸭_6c2b github下载
  • 浩看星辰大海:请教一下用ajax时,跨域是用什么解决的?
    xhr_bird: @时光澔韵 不存在跨域问题,你可以看一下我引用的原文,有一个meta标签,加上就好了。
  • Klart:也在饥人谷看
  • 5d1f2b50e2df:请问播放器的界面去哪里找得到?
    5d1f2b50e2df: @Runner_Yang 可以加一下你扣扣吗?
    5d1f2b50e2df: @Runner_Yang 哪我该如何请问呢?
    xhr_bird: @H伟 界面自己写,专辑图片是请求来的地址,放在img的src属性里面即可
  • 5d1f2b50e2df:你好
    xhr_bird: @H伟 你好
  • 5d1f2b50e2df:你好!请问方便说一下联系方式吗?
  • 未央生::+1: 自己动,手丰衣足食
    xhr_bird:@时光澔韵 通过数据请求拿到的数据。
    xhr_bird: @未央生 哈哈,是啊。

本文标题:使用原生JavaScript制作一个漂亮的音乐播放器

本文链接:https://www.haomeiwen.com/subject/ovyqgttx.html