自己基于豆瓣FM的ui仿写qq音乐时,基于Jquery手写的进度条插件,效果图如下:
主要特色:
① 可自适应挂载元素的宽度,也可以自己设置进度条宽度;
② 支持部分默认参数修改(具体见使用说明);
③ 允许最大时间为23:59:59,高于此值将默认修改为此值;
④ 可以自己控制进度条动画的开关及重置;
⑤ 可以获取进度条当前时间和宽度,与H5的audio标签协调使用。
使用说明:
/* * 功能描述:播放器进度条 * 参数: * option:挂载父元素 * inTime:进度条时间长度 * 示例: * $.playBar.addBar($(\'.wrap\'),400); -- 初始化进度条 * $.playBar.setDefault({ -- 默认参数修改 * width:200, -- 进度条宽度 * bgColor:\'blue\', -- 进度条背景颜色 * progressColor:\'red\', -- 进度条颜色 * ballColor:\'yellow\', -- 拖动触发小圆球颜色 * beginColor:\'lightgrey\', -- 初始时间字体颜色 * finishColor:\'gray\' -- 结束时间字体颜色 * }) * $.playBar.beginPlay(); -- 播放进度条 * $.playBar.endPlay(); -- 结束播放进度条 * $.playBar.resetPlay(200); -- 重置进度条,参数为新输入时间 */
插件源码:
(function($,document){ //定义初始化变量、方法构造函数 var InitVariables = function(){ this.barWidth = null; //进度条宽度 this.barTime = null; //进度条展示时间 this.onOff = false; //记录进度条是否进行播放 this.timer = null; //记录播放定时器 this.curTime = 0; //记录当前播放时间 this.curWidth = 0; //记录当前播放时间对应的宽度 this.ballEl = null; this.timeBeginEl = null; this.timeEndEl = null; this.bgEl = null; this.curTimeEl = null; } InitVariables.prototype = { \'setWidth\':function(w){ //设置进度条宽度 this.barWidth = w; this.bgEl.width(w); }, \'setTime\':function(t){ //设置进度条时间 this.barTime = t; }, \'setBGColor\':function(color){ //设置进度条背景色 this.bgEl.css(\'background-color\',color); }, \'setProgressColor\':function(color){ //设置进度条颜色 this.curTimeEl.css(\'background-color\',color); }, \'setBallColor\':function(color){ //设置拖动小球颜色 this.ballEl.css(\'background-color\',color); }, \'setBeginColor\':function(color){ //设置起始时间 this.timeBeginEl.css(\'color\',color); }, \'setFinishColor\':function(color){ //设置结束时间 this.timeEndEl.css(\'color\',color); }, \'timeToString\':function(time){ //时间转00:00:00样式 if(time>24*3600){ console.log("Error In \'timeToString\':输入时间超过允许值,已默认修改为24*3600-1"); time = 24*3600-1; } var strHour = parseInt(time/3600)>0 ? ((parseInt(time/3600)>9 ? \'\' : \'0\') + parseInt(time/3600)) : false; var strMinute = (parseInt(time/60%60)>9 ? \'\' : \'0\') + parseInt(time/60%60); var strSecond = (parseInt(time%60)>9 ? \'\' : \'0\') + parseInt(time%60); return strHour ? strHour+\':\'+strMinute+\':\'+strSecond: strMinute+\':\'+strSecond; }, \'beginPlay\':function(){ //开始运动指令 var that = this; this.onOff = !this.onOff; this.timer=setInterval(that.changeBar.bind(this),1000); }, \'stopPlay\':function(){ //停止运动指令 this.onOff = !this.onOff; clearInterval(this.timer); }, \'resetPlay\':function(){ //重置指令 this.curTime = 0; this.curWidth = 0; this.curTimeEl.css("width",this.curWidth); this.ballEl.css("left",this.curWidth-this.ballEl.width()/2); this.timeBeginEl.html(this.timeToString(this.curTime)); this.timeEndEl.html(this.timeToString(this.barTime)); }, \'changeBar\':function(){ //动态改变函数 this.curTime++; this.curWidth = this.curTime*this.barWidth/this.barTime; if (this.curWidth>=this.barWidth){this.stopPlay();this.resetPlay();} this.curTimeEl.css("width",this.curWidth); this.ballEl.css("left",this.curWidth-this.ballEl.width()/2); this.timeBeginEl.html(this.timeToString(this.curTime)); }, \'moveEvent\':function(ballEl,curTimeEl,contentEl){ //拖动函数 var that = this; ballEl.on(\'mousedown\',function(ev){ var e=ev||document.event; var disX=event.clientX; e.preventDefault(); e.stopPropagation(); if (that.onOff){ clearInterval(that.timer);} $(document).on(\'mousemove\',function(ev){ var e=ev||document.event; e.preventDefault(); var newX=event.clientX; var lefts=e.clientX-contentEl.offset().left; if (lefts>that.barWidth){ lefts=that.barWidth; }else if(lefts<0){ lefts=0; } that.curWidth = lefts; that.curTime = parseInt(that.curWidth/that.barWidth*that.barTime); that.curTimeEl.css("width",that.curWidth); that.ballEl.css("left",that.curWidth-that.ballEl.width()/2); that.timeBeginEl.html(that.timeToString(that.curTime)); }); $(document).on(\'mouseup\',function(){ if (that.onOff){ that.timer=setInterval(that.changeBar.bind(that),1000);} $(document).off(\'mousemove mouseup\'); }); }) } } //初始化变量对象 var init = new InitVariables(); $.playBar={ //初始化进度条 \'addBar\':function(option,inTime){ if (arguments.length<2){return false;} init.setTime(inTime); option.empty(); //载入DOM元素 option.append($( `<div class=\'progress-bar\'> <div class=\'progress-bar-begin\'>00:00</div> <div class="progress-bar-content"> <div class="progress-bar-ball"></div> <div class="progress-bar-cur"></div> </div> <div class="progress-bar-finish">${init.timeToString(inTime)}</div> </div> `)); //获取DOM元素 init.ballEl = $(\'.progress-bar-ball\'); init.timeBeginEl = $(\'.progress-bar-begin\'); init.timeEndEl = $(\'.progress-bar-finish\'); init.bgEl = $(\'.progress-bar-content\'); init.curTimeEl = $(\'.progress-bar-cur\'); //初始化进度条宽度 init.barWidth = init.bgEl.width(); //绑定滑动事件 init.moveEvent(init.ballEl,init.curTimeEl,init.bgEl); }, \'beginPlay\':function(){ init.beginPlay(); }, \'endPlay\':function(){ init.stopPlay(); }, \'resetPlay\':function(time){ init.setTime(time); init.resetPlay(); }, \'setDefault\':function(obj){ if(obj.width){init.setWidth(obj.width);} if(obj.bgColor){init.setBGColor(obj.bgColor);} if(obj.progressColor){init.setProgressColor(obj.progressColor);} if(obj.ballColor){init.setBallColor(obj.ballColor);} if(obj.beginColor){init.setBeginColor(obj.beginColor);} if(obj.finishColor){init.setFinishColor(obj.finishColor);} }, \'getCurTime\':function(){ return init.curTime; }, \'getCurWidth\':function(){ return init.curWidth; } } })(jQuery,document);
首次写jquery插件,还有很大值得改进的地方~~