看到一个用css3实现的CD的动画,演示在这儿http://codepen.io/_kieran/pen/QNRmep
突然那我就想说给自己做一个音乐播放器吧,说做就做。演示在https://echolsx.github.io/music/
Github传送门:https://github.com/EchoLsx/music
主要代码:
<div id="background"></div>
<div id="player">
<div class="cover"></div>
<div class="ctrl">
<div class="tag">
<strong>Title</strong>
<span class="artist">Artist</span>
<span class="album">Album</span>
</div>
<div class="control">
<div class="left">
<div class="rewind icon"></div>
<div class="playback icon"></div>
<div class="fastforward icon"></div>
</div>
<div class="volume right">
<div class="mute icon left"></div>
<div class="slider left">
<div class="pace"></div>
</div>
</div>
</div>
<div class="progress">
<div class="slider">
<div class="loaded"></div>
<div class="pace"></div>
</div>
<div class="timer left">0:00</div>
<div class="right">
<div class="repeat icon"></div>
<div class="shuffle icon"></div>
</div>
</div>
</div>
</div>
<ul id="playlist"></ul>
JS部分:
(function($){
// Settings
var repeat = localStorage.repeat || 0,
shuffle = localStorage.shuffle || 'false',
continous = true,
autoplay = true,
playlist = [
{
title: 'Lost Stars',
artist: 'Adam Levine',
album: 'Begin Again (Music From and Inspired By the Original Motion Picture)',
cover:'img/1.jpg',
mp3: 'mp3/Adam Levine - Lost Stars.mp3',
ogg: ''
},
{
title: 'Color Blind',
artist: 'Matt B',
album: 'LOVE AND WAR',
cover: 'img/8.jpg',
mp3: 'mp3/Matt B - Color Blind.mp3',
ogg: ''
},
];
// Load playlist
for (var i=0; i<playlist.length; i++){
var item = playlist[i];
$('#playlist').append('<li>'+item.artist+' - '+item.title+'</li>');
}
var time = new Date(),
currentTrack = shuffle === 'true' ? time.getTime() % playlist.length : 0,
trigger = false,
audio, timeout, isPlaying, playCounts;
var play = function(){
audio.play();
$('.playback').addClass('playing');
timeout = setInterval(updateProgress, 500);
isPlaying = true;
}
var pause = function(){
audio.pause();
$('.playback').removeClass('playing');
clearInterval(updateProgress);
isPlaying = false;
}
// Update progress
var setProgress = function(value){
var currentSec = parseInt(value%60) < 10 ? '0' + parseInt(value%60) : parseInt(value%60),
ratio = value / audio.duration * 100;
$('.timer').html(parseInt(value/60)+':'+currentSec);
$('.progress .pace').css('width', ratio + '%');
$('.progress .slider a').css('left', ratio + '%');
}
var updateProgress = function(){
setProgress(audio.currentTime);
}
// Progress slider
$('.progress .slider').slider({step: 0.1, slide: function(event, ui){
$(this).addClass('enable');
setProgress(audio.duration * ui.value / 100);
clearInterval(timeout);
}, stop: function(event, ui){
audio.currentTime = audio.duration * ui.value / 100;
$(this).removeClass('enable');
timeout = setInterval(updateProgress, 500);
}});
// Volume slider
var setVolume = function(value){
audio.volume = localStorage.volume = value;
$('.volume .pace').css('width', value * 100 + '%');
$('.volume .slider a').css('left', value * 100 + '%');
}
var volume = localStorage.volume || 0.5;
$('.volume .slider').slider({max: 1, min: 0, step: 0.01, value: volume, slide: function(event, ui){
setVolume(ui.value);
$(this).addClass('enable');
$('.mute').removeClass('enable');
}, stop: function(){
$(this).removeClass('enable');
}}).children('.pace').css('width', volume * 100 + '%');
$('.mute').click(function(){
if ($(this).hasClass('enable')){
setVolume($(this).data('volume'));
$(this).removeClass('enable');
} else {
$(this).data('volume', audio.volume).addClass('enable');
setVolume(0);
}
});
// Switch track
var switchTrack = function(i){
if (i < 0){
track = currentTrack = playlist.length - 1;
} else if (i >= playlist.length){
track = currentTrack = 0;
} else {
track = i;
}
$('audio').remove();
loadMusic(track);
if (isPlaying == true) play();
}
// Shuffle
var shufflePlay = function(){
var time = new Date(),
lastTrack = currentTrack;
currentTrack = time.getTime() % playlist.length;
if (lastTrack == currentTrack) ++currentTrack;
switchTrack(currentTrack);
}
// Fire when track ended
var ended = function(){
pause();
audio.currentTime = 0;
playCounts++;
if (continous == true) isPlaying = true;
if (repeat == 1){
play();
} else {
if (shuffle === 'true'){
shufflePlay();
} else {
if (repeat == 2){
switchTrack(++currentTrack);
} else {
if (currentTrack < playlist.length) switchTrack(++currentTrack);
}
}
}
}
var beforeLoad = function(){
var endVal = this.seekable && this.seekable.length ? this.seekable.end(0) : 0;
$('.progress .loaded').css('width', (100 / (this.duration || 1) * endVal) +'%');
}
// Fire when track loaded completely
var afterLoad = function(){
if (autoplay == true) play();
}
// Load track
var loadMusic = function(i){
var item = playlist[i],
newaudio = $('<audio>').html('<source src="'+item.mp3+'"><source src="'+item.ogg+'">').appendTo('#player');
$('.cover').html('<img src="'+item.cover+'" alt="'+item.album+'">');
$('.tag').html('<strong>'+item.title+'</strong><span class="artist">'+item.artist+'</span><span class="album">'+item.album+'</span>');
$('#playlist li').removeClass('playing').eq(i).addClass('playing');
audio = newaudio[0];
audio.volume = $('.mute').hasClass('enable') ? 0 : volume;
audio.addEventListener('progress', beforeLoad, false);
audio.addEventListener('durationchange', beforeLoad, false);
audio.addEventListener('canplay', afterLoad, false);
audio.addEventListener('ended', ended, false);
}
loadMusic(currentTrack);
$('.playback').on('click', function(){
if ($(this).hasClass('playing')){
pause();
} else {
play();
}
});
$('.rewind').on('click', function(){
if (shuffle === 'true'){
shufflePlay();
} else {
switchTrack(--currentTrack);
}
});
$('.fastforward').on('click', function(){
if (shuffle === 'true'){
shufflePlay();
} else {
switchTrack(++currentTrack);
}
});
$('#playlist li').each(function(i){
var _i = i;
$(this).on('click', function(){
switchTrack(_i);
});
});
if (shuffle === 'true') $('.shuffle').addClass('enable');
if (repeat == 1){
$('.repeat').addClass('once');
} else if (repeat == 2){
$('.repeat').addClass('all');
}
$('.repeat').on('click', function(){
if ($(this).hasClass('once')){
repeat = localStorage.repeat = 2;
$(this).removeClass('once').addClass('all');
} else if ($(this).hasClass('all')){
repeat = localStorage.repeat = 0;
$(this).removeClass('all');
} else {
repeat = localStorage.repeat = 1;
$(this).addClass('once');
}
});
$('.shuffle').on('click', function(){
if ($(this).hasClass('enable')){
shuffle = localStorage.shuffle = 'false';
$(this).removeClass('enable');
} else {
shuffle = localStorage.shuffle = 'true';
$(this).addClass('enable');
}
});
})(jQuery);