本文demo下載:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1065css
實例經過jQuery技術在html網頁中實現一個音樂播放器, 播放器可以播放在線音樂, 實現了暫停,開始,拖動進度等功能,雙擊播放器界面還能夠變成 Mini模式, 趕忙來看看吧html
視頻觀看地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1065java
實例講解】dom
1. 實例運行起來的效果見下圖的 實例效果ide
2. 爲了讓音樂播放器可以自動拖拽, 在滑塊演示 中實現了這樣的小功能函數
3. 播放器演示中,點擊 播放圖片,音樂播放,再點擊,音樂中止, 拖動到指定位置,音樂從相應的位置開始播放this
4. 雙擊黑色區域,音樂播放器切換成Mini模式,再雙擊,從Mini模式切回正常模式spa
【實例效果】code
【實例代碼】orm
</head> <body> <div class="ss-player"> <div class="ss-box"> <div class="pbcell"> <div class="btn-ctrl"></div> </div> <div class="pbcell"> <div class="progressbar"> <div class="currenttime"><i class="btn-drag"></i></div> <div class="buffertime"></div> </div> </div> <div class="pbcell"> <span class="timelabel">00:00/00:00</span> </div> </div> <audio id="player" src="http://jq22.qiniudn.com/the.mp3" controls=""></audio> </div> <p style="border:1px solid #B3E4FF;background-color: aliceblue;padding: 20px;"> 有時間作了一個播放器,作的過程當中,要作拖動和滑塊兩個小功能,因此順便一塊兒演示給你們看。但願能幫到要學的人。 </p> <h1>一、滑塊演示</h1> 拖動我試試 : <div class="ZZZ" style="width:400px;height: 20px; background-color:#F1F1F1;margin:50px 0;display: inline-block;vertical-align: middle;"> <div class="AAA" style="width: 0%;height: 100%;background-color:#44C2FF; text-align: center; "><span class="BBB"></span></div> </div> <h1>二、播放器演示</h1> <p>浮動着呢,左下角哈。雙擊播放器會切成Mini模式啊</p> <script> $(function() { function formatTime(seconds) { var min = Math.floor(seconds / 60), second = seconds % 60, hour, newMin, time; min = parseInt(min); second = parseInt(second); if (min > 60) { hour = Math.floor(min / 60); newMin = min % 60; } if (second < 10) { second = '0' + second; } if (min < 10) { min = '0' + min; } return time = hour ? (hour + ':' + newMin + ':' + second) : (min + ':' + second); } $('body').on('dragstart', '.ss-player', function() { return false; }); function ssplayer() { var ssplayer = $('#player')[0]; ssplayer.ontimeupdate = function() { //console.log(ssplayer.currentTime+'/'+ssplayer.duration); var duration = ssplayer.duration; var currentTime = ssplayer.currentTime; var p = currentTime / duration * 100; var dlen = formatTime(duration); var clen = formatTime(currentTime); var bfp = ssplayer.buffered.end(0) / duration * 100; //console.log(dlen+'/'+clen); $('.ss-player .timelabel').html(clen + '/' + dlen); $('.ss-player .currenttime').stop(false, true).css({ width: p + '%' }); $('.ss-player .buffertime').stop(false, true).css({ width: bfp + '%' }); } ssplayer.onended = function() { $('.ss-player .btn-ctrl').removeClass('pause'); } ssplayer.onprogress = function() { } return $('#player')[0]; } $('body').on('dblclick', '.ss-player', function() { $(this).toggleClass('mini'); }); var player = ssplayer(); $('body').on('click', '.ss-player .btn-ctrl', function(e) { if (player.paused) { player.play(); $('.ss-player .btn-ctrl').removeClass('pause').addClass('pause'); } else { player.pause(); $('.ss-player .btn-ctrl').removeClass('pause'); } e.stopPropagation(); }); //拖動 $.fn.extend({ initDrag: function(options) { var defaults = { range: false, //可拖動範圍元素對象 sx: true, //是否可橫向拖動 sy: true, //是否可縱向拖動 slider: false, //是否爲滑塊模式,是則爲對象 sliding: function() {}, //滑動滑塊時的回調函數 bans: false //禁用哪些內部對象拖動 } var opts = $.extend(defaults, options); var _this = $(this); _this.isDragStart = false; //是否拖動模式 _this.dragStartX = null; //起始座標X _this.dragStartY = null; //起始座標Y _this.mousedown(function(e) { _this.isDragStart = true; //標記爲手動模式 _this.dragStartX = e.pageX - _this.offset().left; //對象起始位置相對座標X _this.dragStartY = e.pageY - _this.offset().top; //對象起始位置相對座標Y if ($(document).setCapture) { $(document).setCapture(); } //滑塊模式(當點擊範圍滑動和點擊處) if (opts.slider !== false) { var x = e.pageX - opts.slider.offset().left; var y = e.pageY - opts.slider.offset().top; var ww = opts.range.width(); var hh = opts.range.height(); if (x > ww) { x = ww; } if (y > hh) { y = hh; } if (opts.sx) { opts.slider.css('width', x + 'px'); opts.sliding(x / ww); } if (opts.sy) { opts.slider.css('height', y + 'px'); opts.sliding(y / hh); } } e.stopPropagation(); }); //禁用哪些內部元素拖動 if (opts.bans !== false) { opts.bans.each(function() { $(this).mousedown(function(e) { e.stopPropagation(); }); }); } //拖動時 $(document).mousemove(function(e) { if (!_this.isDragStart) { return false; } if (opts.slider !== false) { x = e.pageX - opts.slider.offset().left; y = e.pageY - opts.slider.offset().top; } else { var x = e.pageX - _this.dragStartX - _this.css('margin-left').replace('px', ''); var y = e.pageY - _this.dragStartY - _this.css('margin-top').replace('px', ''); } //是否啓用拖動範圍 if (opts.range !== false) { var ww = opts.range.width(); var hh = opts.range.height(); var zw = _this.outerWidth(true); var zh = _this.outerHeight(true); if (x < 0) { x = 0; } if (y < 0) { y = 0; } if (opts.slider !== false) { if (x > ww) { x = ww; } if (y > hh) { y = hh; } } else { if (x > ww - zw) { x = ww - zw; } if (y > hh - zh) { y = hh - zh; } } } //是否滑塊模式,拖動模式 if (opts.slider !== false) { if (opts.sx) { opts.slider.css('width', x + 'px'); opts.sliding(x / ww); } if (opts.sy) { opts.slider.css('height', y + 'px'); opts.sliding(y / hh); } } else { if (opts.sx) { _this.css('left', x + 'px').css('right', 'auto'); } if (opts.sy) { _this.css('top', y + 'px').css('bottom', 'auto'); } } }); $(document).mouseup(function() { if ($(this).releaseCapture) { $(this).releaseCapture(); } _this.isDragStart = false; }); } }); $('.ss-player .btn-drag,.ss-player .progressbar').initDrag({ slider: $('.ss-player .currenttime'), sy: false, range: $('.ss-player .progressbar'), sliding: function(p) { var s = p * player.duration; player.currentTime = s; } }); $('.ss-player').initDrag({ range: $('body'), bans: $('.ss-player .progressbar,.ss-player .btn-ctrl') }); $('.ZZZ').initDrag({ slider: $('.AAA'), sy: false, range: $('.ZZZ'), sliding: function(p) { $('.BBB').html(Math.round(p * 100) + '%'); } }); }); </script> </body> </html>