cccylove

死生契阔,与子成说。执子之手,与子偕老

HTML5 CSS3 JS 音乐播放器

cc2013-04-10 18:09:16

几个月后,又重新写了一下。对比第一次偿试,虽然仍是有很大不足,但进步较第一次确实挺大的。 

在线演示:http://love.lenton.cn/html5/audio.html

 

使用技术:

1.HTML5 AUDIO核心

2.CSS3写皮

3.JS实现功能

播放器功能:

1.播放/暂停

2.进度调整/音量调整/时间显示【进度条实测仅Chrome支持,SO想兼容,可能要自己写进度条控件】

3.曲目信息/歌词同步

4.曲目列表资源载入


1.HTML5新DOM,AUDIO

<audio id="player" loop>

<source src="">

<source src="">

</audio>

2.CSS3 写皮

这里用到的技术不多。就是阴影(box-shadow),圆角(border-radius),及一点点动画。帖出CSS代dcg,详细自行看演示网址的源码

 

<style type="text/css" media="screen">

#playerTheme{width:400px;border:1px solid #FFF;background:#3390b3;

box-shadow:2px 2px 3px rgba(0,0,0,0.3),-2px -2px 3px rgba(0,0,0,0.3),

150px -100px 100px rgba(0,255,255,0.3) inset;

margin:0 auto;padding:20px;border-radius:5px;position: relative;

}

#playerTheme:hover{

box-shadow:15px 15px 15px rgba(0,0,0,0.1),-15px -15px 15px rgba(0,0,0,0.1),

150px -100px 100px rgba(0,255,255,0.3) inset;

}

#playerTheme p{color: #FFF;vertical-align: middle;}

#lenton{width: 50px;height:50px;position: absolute;left: 20px;top: 15px;border-radius: 25px;background: #0fa4f6;z-index: 10;

box-shadow: 20px 20px 20px rgba(255,255,255,0.3) inset, -20px -20px 20px rgba(0,0,0,0.1) inset,1px 1px 2px rgba(0,0,0,0.3);}

#lenton:hover{

transform: rotate(360deg);

-ms-transform: rotate(360deg);

-webkit-transform: rotate(360deg);

-o-transform: rotate(360deg);

-moz-transform: rotate(360deg);

}

#lenton,#playerTheme{

transition: all 1s;

-moz-transition: all 1s;

-webkit-transition: all 1s;

-o-transition: all 1s;

}

#lenton2{width: 42px;height:42px;position: absolute;right: 4px;top: 4px;border-radius: 21px;background: #000;z-index: 11;

box-shadow: 15px 10px 0 rgba(255,255,255,0.3) inset;}

#lenton3{width: 20px;height:20px;position: absolute;left: 4px;top: 4px;border-radius: 10px;background: #FFF;z-index: 12;}

#lenton4{width: 10px;height:10px;position: absolute;left: 17px;top: 16px;border-radius: 5px;background: #FFF;z-index: 13;}

#lenton5{width: 5px;height:5px;position: absolute;left: -6px;top: 5px;border-radius: 2.5px;background: #FFF;z-index: 14;}

#mVol{width:100px;}

#mLon{width:220px;height:25px;line-height:25px;}

#playerLs #mNowTime{font-size: 30px;}

#playerLs #mAllTime{color:#3390b3;}

#playerLs{color:#FFF;border-radius:10px;}

#playerLs strong{font-family:"微软雅黑";font-size: 18px;color:#FFF;display: inline-block;height:30px;}

#playerLs{border:1px solid #3dbcec;padding:5px;height:30px;line-height:30px;background:#277694;}

button{border:none;border-radius:5px;background:#124355;color:#FFF;display: inline-block;height:30px;

padding:5px 15px;box-shadow:0px 10px 20px rgba(255,255,255,0.3) inset;cursor: pointer;}

button:hover{color:#00ffff;}

button:active{color:#008181;box-shadow:0px -10px 20px rgba(255,255,255,0.3) inset;

text-shadow:-1px -1px 0 #000;}

h1{padding:0;margin:0;color:#FFF;padding-left: 60px;}

dl{background:#EEE;border:1px solid #FFF;border-radius:5px;}

dt{background:#62b3d1;color:#FFF;padding:5px;border-radius:5px 5px 0 0;

box-shadow:0px 10px 10px rgba(255,255,255,0.3) inset;text-shadow:1px 1px 0 #1e6985;}

dd{padding:5px 10px;border:1px dotted #DDD;margin:0;font-size:12px;color: #3390b3;}

dd:hover{background:#DDD;}

dd:active{text-shadow:1px 1px 0 #FFF;text-indent:2px;}

dd.this{background:#b1d4e1;color:#FFF;border:none;text-shadow:1px 1px 0 #1e6985;}

#mLrc{font-size: 12px; color:#00ffff;height: 30px;padding:20px 0 10px 20px;}

#mLrc p{margin: 0;}

#mLrc p.lrcu{margin: 0; color: #FFF;}

#mLrc p.lrcd{margin: 0; color: #0FF;}

footer{font-size: 12px;text-align: right;color: #FFF;}

</style>

 

3.HTML5提供AUDIO的JS API,实现功能

<script>

var player   = document.getElementById('player');

var play     = document.getElementById('play');

var pause    = document.getElementById('pause');

var mVol     = document.getElementById('mVol');

var mLon     = document.getElementById('mLon');

var mAllTime = document.getElementById('mAllTime');

var mNowTime = document.getElementById('mNowTime');

var mTitle   = document.getElementById('mTitle');

var mLrc     = document.getElementById('mLrc');


function mPlay(){

if(player.src == "" || player.src == null){

alert("请选择曲目");

return;

}

player.play();

mAllTime.innerHTML = formatTime(player.duration);

appTime(player.duration);

}


play.onclick = function(){

mPlay();

}

pause.onclick = function(){

player.pause();

}

mVol.onchange = function(){

player.volume = mVol.value/100;

}

mLon.onchange = function(){

var ml = 0;

if(player.duration > -1){

ml = player.duration;

}else{

ml = 0;

}

player.currentTime = mLon.value/100 * ml;

}


function formatTime(timeString){

   var minute = parseInt(timeString / 60);

   var second = parseInt(timeString % 60);


   minute = minute >= 10 ? minute : "0" + minute;

   second = second >= 10 ? second : "0" + second;

   return minute + ":" + second;

}

var tmp = 0;

function appTime(timeString){


if(tmp < timeString){

tmp ++;

}else{

tmp = 0;

return;

}

//return tmp;

mNowTime.innerHTML = formatTime(player.currentTime);

mLon.value = player.currentTime/player.duration*100;

setTimeout(function(){appTime(timeString)},1000);

}


function setList(){

var mList  = document.getElementById('mList');

var tmpstr = "";

for(var i = 0 ;i < m.length; i++){

tmpstr += "<dd onclick='playThis(" + i + ")' id='mIndex" + i + "'>" + m[i].name + "</dd>";

}

mList.innerHTML = tmpstr;

}


function playThis(i){

player.src = m[i].src;

//player.load();

mTitle.innerHTML = m[i].name;

mLrc.innerHTML = "...";

for(var j=0 ; j < m.length; j++){document.getElementById("mIndex"+j).className = ""; }

document.getElementById("mIndex"+i).className = "this";

expLrc(m[i].lrc);

//mPlay();

}

var lrcText;

var lrcTime = new Array();

function expLrc(lrc){

/*时间数组*/

var i = 0;

var s;

var re = new RegExp("[0-9][0-9]\:[0-9][0-9]","g");

while((s = re.exec(lrc)) != null){

lrcTime[i] = s;

i++;

}

/*歌词数组*/

var s = /[\[][0-9][0-9]\:[0-9][0-9]\.[0-9][0-9]\]/g;

lrcText = lrc.split(s);


playLrc();

}

/*显示歌词*/

function playLrc(){

for(var j = 0; j < lrcTime.length ; j++){

if(lrcTime[j] == formatTime(player.currentTime) =="00:00"){

mLrc.innerHTML = "歌词暂无。。"

}else if(lrcTime[j] == formatTime(player.currentTime)){

mLrc.innerHTML = "<p class='lrcu'>" + lrcText[j] + "</p><p class='lrcd'>" + lrcText[j + 1] +"</p>";

}else{

//mLrc.innerHTML = "music..."

}

}

setTimeout(function(){playLrc()},10);

}

var playl    = document.getElementById('playl');

var playr    = document.getElementById('playr');

var cIs = 0;

var lIs = true;

function cLight(num){

if(num == 1){

if(player.loop){

playl.innerHTML = "><";

playl.title = "单曲循环已关闭";

}else{

playl.innerHTML = "~>";

playl.title = "单曲循环已打开";

}

player.loop = !player.loop;

}else{

var tmp = document.getElementById('mList');

if(cIs == 0){

tmp.style.display = "none";

playr.innerHTML = "-";

cIs = 1;

}else{

tmp.style.display = "block";

playr.innerHTML = "=";

cIs = 0;

}

}

}


playl.onclick = function(){

cLight(1);

}

playr.onclick = function(){

cLight(2);

}

window.onload = function(){setList();};

</script>

 

音乐资源文件:mlist.js

<script>

/***********************************

*

*  创建音乐对象

*

************************************/

function mObj(){

this.src     = "Music src URL";

this.name    = "曲目标题";

this.lrc     = "Music lrc text";

this.singer  = "歌手";

this.alltime = 0;

}

/*------------音乐资源-------------*/

var m1 = new mObj();

m1.src = "audio3.mp3";

m1.name = "千千阙歌";

m1.lrc = "[00:15.88]徐徐回望"

+ "[00:18.88]曾属于彼此的晚上"

+ "[00:23.12]红红仍是你"

+ "[00:25.92]赠我的心中艳阳"

+ "[00:30.35]如流傻泪"

+ "[00:32.92]祈望可体恤兼见谅"

+ "[00:37.28]明晨离别你"

+ "[00:40.00]路也许孤单得漫长"

+ "[00:44.39]一瞬间"

+ "[00:46.12]太多东西要讲"

+ "[00:48.09]可惜即将在各一方"

+ "[00:51.33]只好深深把这刻尽凝望"

+ "[00:57.94]来日纵是千千阙歌"

+ "[01:01.39]飘于远方我路上"

+ "[01:05.03]来日纵是千千晚星"

+ "[01:08.46]亮过今晚月亮"

+ "[01:12.45]都比不起这宵美丽"

+ "[01:16.10]亦绝不可使我更欣赏"

+ "[01:19.75]ah..因你今晚共我唱"

+ "[01:26.82](music)"

+ "[01:58.08]临行临别"

+ "[02:01.59]才顿感哀伤的漂亮"

+ "[02:05.64]原来全是你"

+ "[02:08.62]令我的思忆漫长"

+ "[02:12.87]何年何月"

+ "[02:15.67]才又可今宵一样"

+ "[02:20.04]停留凝望里"

+ "[02:22.74]让眼睛讲彼此立场"

+ "[02:26.84]当某天"

+ "[02:28.85]雨点轻敲你窗"

+ "[02:30.52]当风声吹乱你构想"

+ "[02:34.08]可否抽空想这张旧模样"

+ "[02:40.11]来日纵是千千阙歌"

+ "[02:44.10]飘于远方我路上"

+ "[02:47.66]来日纵是千千晚星"

+ "[02:51.16]亮过今晚月亮"

+ "[02:55.27]怎都比不起这宵美丽"

+ "[02:58.80]亦绝不可使我更欣赏"

+ "[03:02.39]ah..因你今晚共我唱"

+ "[03:08.83]music..."

+ "[03:22.72]怎都比不起这宵美丽"

+ "[03:27.00]亦绝不可使我更欣赏"

+ "[03:30.65]因你今晚我共唱"

+ "[03:37.23]来日纵是千千阙歌"

+ "[03:40.89]飘于远方我路上"

+ "[03:44.29]来日纵是千千晚星"

+ "[03:47.71]亮过今晚月亮"

+ "[03:51.72]都比不起这宵美丽"

+ "[03:55.36]亦绝不可使我更欣赏"

+ "[03:59.14]ah..因你今晚共我唱"

+ "[04:05.40]来日纵是千千阙歌"

+ "[04:09.23]飘于远方我路上"

+ "[04:12.65]来日纵是千千晚星"

+ "[04:16.12]亮过今晚月亮"

+ "[04:20.18]都比不起这宵美丽"

+ "[04:23.72]都洗不清今晚我所思"

+ "[04:27.42]因不知哪天再共你唱"

+ "[04:34.37]";

this.singer  = "陈慧闲";

var m2 = new mObj();

m2.src = "audio1.mp3";

m2.name = "领悟";

m2.lrc = "[00:01:01]辛晓琪 领悟" 

+ "[00:01.00]我以为我会哭" 

+ "[00:05.00]但是我没有" 

+ "[00:09.00]我只是怔怔望着你的脚步" 

+ "[00:14.00]给你我最后的祝福" 

+ "[00:19.00]这何尝不是一种领悟" 

+ "[00:23.00]让我把自己看清楚" 

+ "[00:27.00]虽然那共爱的痛苦" 

+ "[00:30.00]将日日夜夜" 

+ "[00:32.00]在我灵魂最深处 "

+ "[00:37.00]我以为我会报复" 

+ "[00:41.00]但是我没有" 

+ "[00:45.00]当我看到我深爱过的男人" 

+ "[00:48.00]竟然像孩子一样无助" 

+ "[00:53.00]这何尝不是一种领悟" 

+ "[00:57.00]让你把自己看清楚" 

+ "[01:01.00]被爱是奢侈的幸福" 

+ "[01:03.00]可惜你从来不在乎 "

+ "[01:08.00]啊!一段感情就此结束" 

+ "[01:15.00]啊!一颗心眼看要荒芜" 

+ "[01:22.00]我们的爱若是错误" 

+ "[01:26.00]愿你我没有白白受苦" 

+ "[01:30.00]若曾真心真意付出" 

+ "[01:33.00]就应该满足 "

+ "[01:37.00]啊!多么痛的领悟" 

+ "[01:40.00]你曾是我的全部" 

+ "[01:45.00]只是我回首来时路的每一步" 

+ "[01:49.00]都走的好孤独" 

+ "[01:52.00]啊!多么痛的领悟" 

+ "[01:55.00]你曾是我的全部" 

+ "[01:59.00]只愿你挣脱情的枷锁" 

+ "[02:02.00]爱的束缚 任意追逐" 

+ "[02:08.00]别再为爱受苦 "

+ "[02:14.00](music)" 

+ "[02:34.00]我以为我会报复" 

+ "[02:38.00]但是我没有" 

+ "[02:42.00]当我看到我深爱过的男人" 

+ "[02:44.00]竟然像孩子一样无助" 

+ "[02:50.00]这何尝不是一种领悟" 

+ "[02:54.00]让你把自己看清楚" 

+ "[02:57.00]被爱是奢侈的幸福" 

+ "[02:59.00]可惜你从来不在乎 "

+ "[03:04.00]啊!一段感情就此结束" 

+ "[03:12.00]啊!一颗心眼看要荒芜" 

+ "[03:18.00]我们的爱若是错误" 

+ "[03:22.00]愿你我没有白白受苦" 

+ "[03:26.00]若曾真心真意付出" 

+ "[03:30.00]就应该满足 "

+ "[03:32.00]啊!多么痛的领悟" 

+ "[03:37.00]你曾是我的全部" 

+ "[03:41.00]只是我回首来时路的每一步" 

+ "[03:46.00]都走的好孤独" 

+ "[03:48.00]啊!多么痛的领悟" 

+ "[03:52.00]你曾是我的全部" 

+ "[03:56.00]只愿你挣脱情的枷锁" 

+ "[03:59.00]爱的束缚 任意追逐 "

+ "[04:04.00]啊!多么痛的领悟" 

+ "[04:07.00]你曾是我的全部" 

+ "[04:10.00]只是我回首来时路的每一步" 

+ "[04:15.00]都走的好孤独" 

+ "[04:17.00]啊!多么痛的领悟" 

+ "[04:21.00]你曾是我的全部" 

+ "[04:25.00]只愿你挣脱情的枷锁" 

+ "[04:28.00]爱的束缚 任意追逐" 

+ "[04:34.00]别再为爱受苦 ";

this.singer  = "辛晓琪";

var m3 = new mObj();

m3.src = "audio.mp3";

m3.name = "红豆";

m3.lrc = "[00:00.00]王菲红豆" 

+ "[00:08.00]曲.柳重言词.林夕" 

+ "[00:16.00]还没好好的感受" 

+ "[00:20.00]雪花绽放的气候" 

+ "[00:24.00]我们一起颤抖" 

+ "[00:27.00]会更明白什么是温柔" 

+ "[00:33.00]还没跟你牵著手" 

+ "[00:37.00]走过荒芜的沙丘" 

+ "[00:41.00]可能从此以後学会珍惜" 

+ "[00:46.00]天长和地久" 

+ "[00:50.00]有时候有时候" 

+ "[00:54.00]我会相信一切有尽头" 

+ "[00:58.00]相聚离开都有时候" 

+ "[01:03.00]没有什么会永垂不朽" 

+ "[01:07.00]可是我有时候" 

+ "[01:11.00]宁愿选择留恋不放手" 

+ "[01:16.00]等到风景都看透" 

+ "[01:20.00]也许你会陪我看细水长流" 

+ "[01:30.00](music)" 

+ "[01:41.00]还没为你把红豆" 

+ "[01:45.00]熬成缠绵的伤口" 

+ "[01:50.00]然後一起分享" 

+ "[01:53.00]会更明白相思的哀愁" 

+ "[01:58.00]还没好好的感受" 

+ "[02:03.00]醒著亲吻的温柔" 

+ "[02:07.00]可能在我左右" 

+ "[02:10.00]你才追求孤独的自由" 

+ "[02:18.00]有时候有时候" 

+ "[02:22.00]我会相信一切有尽头" 

+ "[02:26.00]相聚离开都有时候" 

+ "[02:31.00]没有什么会永垂不朽" 

+ "[02:35.00]可是我有时候" 

+ "[02:39.00]宁愿选择留恋不放手" 

+ "[02:44.00]等到风景都看透" 

+ "[02:48.00]也许你会陪我看细水长流" 

+ "[03:07.00]有时候有时候" 

+ "[03:11.00]我会相信一切有尽头" 

+ "[03:15.00]相聚离开都有时候" 

+ "[03:20.00]没有什么会永垂不朽" 

+ "[03:24.00]可是我有时候" 

+ "[03:28.00]宁愿选择留恋不放手" 

+ "[03:33.00]等到风景都看透" 

+ "[03:37.00]也许你会陪我看细水长流 ";

this.singer  = "王菲";

var m4 = new mObj();

m4.src = "audio2.mp3";

m4.name = "Oh ba ba";

m4.lrc = "[00:01.00]这歌是DJ,没词儿。";

this.singer  = "spnshiy";

/*------------音乐集-------------*/

var m = new Array(3);

m[0] =m1;

m[1] =m2;

m[2] =m3;

m[3] =m4;

</script>

 

 

感谢阅读!发表下看法?

留言

蓝瞳视觉|西西用户体验设计|Zblog