首页>案例集>JavaScript案例集

H5 Audio API+jQuery+ajax实现一个迷你播放器!

今天翻资料,发现一个还算完整的播放器案例,主要是练习H5提供的Audio API,结合jQuery+Ajax完成。

1.jpg

点击图片看效果。

功能:

1、默认不播放,点击播放按钮,播放音乐。

2、点击暂停按钮,暂停播放。

3、点击上一首,下一首播放音乐。

4、点击停止,进度条归零,停止播放音乐。

5、可以拖拉播放进度条。

6、点击列表可以切换音乐并播放。

7、播放完后自动播放下一首。

核心代码:

        // ajax获取本地json数据
        $.get('data/music.json', function (data) {
            const musicList = data.music;
            // 1、初始化界面
            let num = 0;
            // 初始化音乐和图片
            $('.playerImg').html(`
                <img src="${musicList[num].coverSrc}" alt="" width="150" height="150" id="cover">
                <audio id="audio" src="${musicList[num].videoSrc}"></audio>`);

            // 初始化音乐列表
            let str = '';
            musicList.forEach(function (item, index) {
                str += ` <li>
                <span class="mr10">${index + 1}</span>
                <span>${item.title}</span>
                <span>-</span>
                <span>${item.author}</span>
            </li>`
            })
            $('#musicList').html(str);

            // 初始化高亮            
            let len = musicList.length;
            $('#musicList > li').removeClass('active').eq(num).addClass('active');

            // 2、点击播放按钮,让音乐播放,点击切换成暂停,点击暂停
            // 获取对象或者值
            let totalWidth = $('#progrees').width();
            const oAudio = document.querySelector('#audio');
            // 默认没有播放
            let isOn = false;
            // 播放和暂停功能
            $('#play').on('click', playAndPause);
            // 停止播放
            $('.stop').on('click', stop);

            // timeupdate 事件在音频/视频(audio/video)的播放位置发生改变时触发。
            oAudio.addEventListener('timeupdate', setProgress);
            
            // 3、点击下一首播放
            $('.next').on('click', function () {
                autoPlay();
            })
            // 3、点击上一首播放
            $('.prev').on('click', function () {
                isOn = false;
                num--;
                if (num <= -1) {
                    num = len - 1;
                }
                init(num);
                playAndPause();

            })
            // 4、点击切换歌曲
            $('#musicList > li').on('click', function () {
                num = $(this).index();
                isOn = false;
                init(num);
                playAndPause();
            })

            // 5、点击进度条改变播放的位置
            $('#progrees').on('click', function (e) {
                // 获取被点击的偏移值
                let offsetX = e.offsetX;
                // 获取被点击的位置和整个进度条长度的比例
                let radio = offsetX / totalWidth;
                let totalTime = oAudio.duration;
                // 通过比例乘以总的时间,得到当前时间,赋值给audio对象。
                oAudio.currentTime = totalTime * radio;
                // currentTime变化之后,会自动触发timeupdate事件,会去执行setProgress函数
                // setProgress函数会设置进度条的宽度样式等。
            })

            // 6、自动播放下一首
            oAudio.addEventListener('ended', function () {
                autoPlay();
            })

            function autoPlay () {
                num++;
                if (num >= len) {
                    num = 0;
                }
                isOn = false;
                init(num);
                playAndPause();
            }

            // 播放或者暂停的切换函数
            function playAndPause() {
                isOn = !isOn;
                // 播放和暂停按钮的切换
                if (isOn) {
                    oAudio.play();
                    $('#play').removeClass('play1').addClass('play2');
                    $('#play').attr('title', '暂停');
                } else {
                    oAudio.pause();
                    $('#play').removeClass('play2').addClass('play1');
                    $('#play').attr('title', '播放');
                }
            }

            // 停止播放功能
            // 点击停止按钮,停止播放,进度条归零
            function stop() {
                oAudio.pause();
                // 状态归为初始状态
                isOn = false;
                // 当前的时间归0,同时触发timeupdate事件。
                oAudio.currentTime = 0;
                $('#play').removeClass('play2').addClass('play1');
                $('#play').attr('title', '播放');
            }

            // 进度条和时间的更新,当currentTime更新的时候,会触发timeupdate这个事件
            // 这个事件触发的时候,不断更新进度条的宽度和当前的播放时间
            function setProgress() {
                let currentTime = this.currentTime;
                let totaltime = this.duration;
                let radio = currentTime / totaltime;
                let currentWidth = totalWidth * radio;
                $('#curProgrees').css('width', currentWidth);
                $('#totalTime').html(formate(totaltime));
                // console.log(currentTime , totaltime)
                $('#presentTime').html(formate(currentTime));
            }
            // 初始化界面和当前音乐的总时间
            function init(num) {
                // 隐藏时间,避免看到NaN
                $('#playTime').hide();
                // 出现音乐加载loading
                $('.loading').show();
                oAudio.src = musicList[num].videoSrc;
                $('#cover').attr('src', musicList[num].coverSrc);
                $('#musicList > li').removeClass('active').eq(num).addClass('active');
                // 当音乐加载完毕,才获取总的时间,去掉loading
                oAudio.addEventListener('loadedmetadata', function () {
                    // 隐藏loading
                    $('.loading').hide();
                    let totaltime = this.duration;
                    // 显示时间
                    $('#playTime').show();
                    $('#totalTime').html(formate(totaltime));
                })
            }
        }, "json")

        // 格式化时间
        function formate(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}`;
        }


点赞


4
保存到:

相关文章

发表评论:

◎请发表你卖萌撒娇或一针见血的评论,严禁小广告。

Top