今天翻资料,发现一个还算完整的播放器案例,主要是练习H5提供的Audio API,结合jQuery+Ajax完成。
点击图片看效果。
功能:
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}`; }
发表评论:
◎请发表你卖萌撒娇或一针见血的评论,严禁小广告。