用jquery写一个属于自己的音乐播放器

杨志
• 阅读 4184

看到一个用css3实现的CD的动画,演示在这儿http://codepen.io/_kieran/pen/QNRmep

突然那我就想说给自己做一个音乐播放器吧,说做就做。演示在https://echolsx.github.io/music/

Github传送门:https://github.com/EchoLsx/music

用jquery写一个属于自己的音乐播放器

主要代码:

<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);
点赞
收藏
评论区
推荐文章
Jacquelyn38 Jacquelyn38
4年前
你是否有一个梦想?用JavaScript开发一款自定义配置视频播放器
前言沉寂了一周了,打算把这几天的结果呈现给大家。这几天抽空就一直在搞一个自定义视频播放器,为什么会有如此想法?是因为之前看一些学习视频网站时,看到它们做的视频播放器非常Nice!于是,就打算抽空开发一款属于自己的视频播放器。话不多说,一起来实战吧!项目展示(这只是一张图片哦)这张图就是我们的成品,还等什么?赶紧来实战吧!实战我会把完整源码放在github
Wesley13 Wesley13
3年前
C# 一款属于自己的音乐播放器
本文利用C调用Windows自带的WindowsMediaPlayer打造一款属于自己的音乐播放器,以供学习分享使用,如有不足之处,还请指正。概述WindowsMediaPlayer是微软公司出品的一款免费的播放器,属于MicrosoftWindows的一个组件,通常简称"WMP",支持通过插件增强功能。版本WindowsMe
Wesley13 Wesley13
3年前
VScode开源音乐插件
VSCNeteaseMusic是国人开发的VScode开源的音乐插件。遵守MIT开源协议。使用网易音乐的API,基于Webview实现,通过HTMLAudioElement播放音乐,不依赖命令行播放器,在vscode上划水听音乐。!(https://oscimg.oschina.net/oscnet/3633354c5972db931f
Wesley13 Wesley13
3年前
Ubuntu 下安装深度音乐播放器
网上搜了一个安装深度音乐的有问题。我自己又整理一个最新的2014版的深度音乐。Linux环境:Ubuntu14.04LTS64bit深度音乐都是DEB包安装。下面,介绍如何安装深度音乐播放器。需要pythondeepinutils、deepinui、gstreamer0.10ffmpeg、pythondeeping
Easter79 Easter79
3年前
Vue + Element 实现动态添加input
 此篇博客背景:项目开发技术为vueelement,需求为form表单中动态添加input表单,本element中有现成form动态添加案例,但ui小姐姐效果图与ui库有些微差别,固重新整理。废话不多说啦,正式开始了:代码地址:https://codepen.io/newgingkgo/pen/gObMMow (备注:将代码复制至vue项目即可查看
Stella981 Stella981
3年前
React Native (一) react
ReactNative(一)reactnativevideo实现音乐播放器和进度条的功能功能:1.卡片滑动切歌2.显示进度条效果图:!(https://oscimg.oschina.net/oscnet/3c
Wesley13 Wesley13
3年前
JQ面试问题(转载)
1你在公司是怎么用jquery的?答:在项目中是怎么用的是看看你有没有项目经验(根据自己的实际情况来回答)你用过的选择器啊,动画啊,表单啊,ajax事件等配置Jquery环境下载jquery类库在jsp页面引用jquery类库即可<scripttype"text/javascript"src"jquery/jquery1.7.2
Wesley13 Wesley13
3年前
IOS开发之获取MP3音乐信息
每一个音乐文件都有自己的歌手,专辑,封面等信息,我们可以获取这些信息然后做音乐播放器的时候,可以使用这些信息;//// ViewController.m// 02获取mp3音乐信息//// Createdby鹿微微鹿on16/5/6.// Copyright(c)2016年鹿微微鹿.Allrights
Stella981 Stella981
3年前
Image Upload based on jQuery
今天把自己写的一个简单的jQuery上传插件放到了Git@OSC上了,希望能帮助需要的人,并且得到高人的指点,一起用心的维护下去。戳这里((https://git.oschina.net/GoodLoser/ImageUploader)http://git.oschina.net/GoodLoser/iUploader(http://git.osch
隔壁老王 隔壁老王
1年前
歌曲播放器作业(简易&终端版)
使用c&mplayer工具开发简易音乐播放器
隔壁老王 隔壁老王
1年前
QT-LINUX简易版mp3播放器(设计阶段)
在ubuntu下使用qt和mplayer开发的简易音乐播放器
杨志
杨志
Lv1
夜寒茅店不成眠,残月照吟鞭。
文章
3
粉丝
0
获赞
0