body,dl,dt,dd{
margin: 0px;
padding: 0px;
list-style: none;
font-family: "隶书";
font-size: 20px;
}
#overall{
width: 600px;
height: 600px;
margin: 0px auto;
background: url(../img/music-bg.jpg)-80px -150px no-repeat;
position: relative;
}
#list{
width: 200px;
height: 85%;
float: left;
}
#list-music{
margin-top: 40px;
margin-left: 30px;
}
#list-music dd{
color: rgba(0,0,0,0);
background: linear-gradient(to right,red,yellow,blue);
-webkit-background-clip: text;
margin-left: 10px;
}
#list dt,dd{
cursor: pointer;
}
#content{
float: right;
width: 400px;
height: 85%;
text-align: center;
}
#content-txt{
color: rgba(0,0,0,0);
background: linear-gradient(to right,red,yellow,blue);
-webkit-background-clip: text;
padding: 100px 50px;
margin: 200px 20px 0px 20px;
}
#music{
color: white;
font-size: 15px;
width: 100%;
height: 15%;
position: absolute;
bottom: 0px;
padding-left: 20px;
}
#music-time{
margin: 0px 20px;
}
#music-can{
margin-left: 20px;
}
#volume span:first-child,span:last-child{
cursor: pointer;
}
.control{
float: left;
line-height: 70px;
}
#ado{
display: none;
}
#note{
position: absolute;
color: yellow;
font-size: 30px;
display: none;
}
<!DOCTYPE html>
<html manifest="../txt/music.appcache">
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" type="text/css" href="../css/music.css"/>
<script src="../js/jquery-1.8.3.min.js" type="text/javascript" charset="utf-8"></script>
<script src="../js/music.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="overall">
<div id="list">
<dl id="list-music">
<dt><canvas id="list-txt" width="120px" height="30px"></canvas></dt>
</dl>
</div>
<div id="content">
<div id="content-txt"></div>
</div>
<div id="music">
<canvas id="top-music" class="control" width="50px" height="80px"></canvas>
<canvas id="pause-key" class="control" width="50px" height="80px"></canvas>
<canvas id="bottom-music" class="control" width="50px" height="80px"></canvas>
<canvas id="music-can" class="control" width="200px" height="80px"></canvas>
<div id="music-time" class="control">00:00/00:00</div>
<div id="volume" class="control">
<span id="volume-jian">-</span>
<span id="volume-num">100</span>
<span id="volume-jia">+</span>
</div>
</div>
</div>
<audio controls="controls" id="ado" autoplay="autoplay">
</audio>
<div id="note">♪</div>
</body>
</html>
$(function(){
var div1 = document.getElementById("overall");
$("#music-can").click(function(e){ //点击改变歌曲进度
div2 = document.getElementById("music-can");
//获取左边与父元素的距离
gaogu = div1.offsetLeft+div2.offsetLeft;
//赋值
time.currentTime=((e.pageX-gaogu)/can.width)*time.duration;
});
var time = document.getElementById("ado");//音频
//总长度
var can = document.getElementById("music-can");
var ctx = can.getContext("2d");
canLength();
//上一首按钮
var canTop = document.getElementById("top-music");
var ctxTop = canTop.getContext("2d");
ctxTop.beginPath();
ctxTop.moveTo(10,35);
ctxTop.lineTo(25,25);
ctxTop.lineTo(25,45);
ctxTop.lineTo(10,35);
ctxTop.closePath();
ctxTop.fillStyle = "white";
ctxTop.fill();
//暂停播放按钮
var cankey = document.getElementById("pause-key");
var ctxkey = cankey.getContext("2d");
canPauseKey();
//下一首按钮
var canbt = document.getElementById("bottom-music");
var ctxbt = canbt.getContext("2d");
ctxbt.beginPath();
ctxbt.moveTo(10,25);
ctxbt.lineTo(25,35);
ctxbt.lineTo(10,45);
ctxbt.lineTo(10,25);
ctxbt.closePath();
ctxbt.fillStyle = "white";
ctxbt.fill();
//绘制歌单文本
var canTxt = document.getElementById("list-txt");
var ctxTxt = canTxt.getContext("2d");
ctxTxt.font = "28px 隶书";
ctxTxt.strokeStyle = "#444";
ctxTxt.strokeText("我的歌单",0,20);
//歌单点击隐藏和显示
$("#list-music dt").click(function(){
$("#list-music dd").toggle();
});
//获取歌曲
var ajax = new XMLHttpRequest;
ajax.open("GET","../txt/music.txt",true);
ajax.send(null);
var ado = document.getElementById("ado");
var music = document.getElementById("list-music");
var div3 = document.getElementById("pause-key");
var not = $("#note");
ajax.onreadystatechange = function(){
if(ajax.status==200 && ajax.readyState==4){
var stuMusic = ajax.responseText;
js = eval("("+stuMusic+")");
for (var i in js) {
var dd = document.createElement("dd");
dd.innerHTML = i;
music.appendChild(dd);
}
$("#list-music dd").click(function(e){ //歌单点击事件
for (var i in js) { //循环所有歌曲
if(this.innerText == i){ //判断点击的歌曲
ado.src = js[i];
}
}
show();//调用进度条和时间重绘函数
redraw();
not.css({"left":e.pageX+"px","top":e.pageY+"px","display":"block"});//音符起点定位
lf = div1.offsetLeft+div3.offsetLeft+10;//获取左边的距离
not.stop().animate({"left":""+lf+"px","top":"520px"},800,function(){ //音符终点定位
not.css("display","none");
});
});
}
};
//上一首
$("#top-music").click(function(){
prevMusic();
});
function prevMusic(){
currentMusic();//获取当前播放歌曲
for (var k=0; k<d.length; k++) {
if(cm == d[k].innerHTML){
if(k==0){
ado.src = js[d[d.length-1].innerHTML];
}else{
ado.src = js[d[k-1].innerHTML];
}
show();//调用进度条和时间重绘函数
redraw();
return;
}
}
}
//下一首
$("#bottom-music").click(function(){
nextMusic();
redraw();
});
time.onended = function(){
nextMusic();
}
//键盘控制音量和切歌
$("body").keydown(function(){
var value= event.keyCode;
if(value==37){
prevMusic();
}
if(value==39){
nextMusic();
redraw();
}
if(value==38){
if(vol<100){
vol+=10;
time.volume = time.volume+0.1;
}else{
alert("已经是最大声了!");
}
$("#volume span:eq(1)").html(vol);
}
if(value==40){
if(vol>0){
vol-=10;
time.volume = time.volume-0.1;
}else{
alert("已经是最小声了!");
}
$("#volume span:eq(1)").html(vol);
}
if(value==32){
if(ado.src==""){
ado.src = js[$("dd:eq(0)").html()];
show();//调用进度条和时间重绘函数
}
cankey.height = cankey.height;
if(time.paused){
time.play();//播放
canPlayKey();//调用绘制播放按钮函数
}else{
time.pause();//暂停
canPauseKey();//调用绘制暂停按钮函数
}
}
});
//音量控制事件
var vol = 100;//总音量
$("#volume span:eq(0),span:last").click(function(){
if(this.innerHTML == "-"){
if(vol>0){
vol-=10;
time.volume = time.volume-0.1;
}else{
alert("已经是最小声了!");
}
}else{
if(vol<100){
vol+=10;
time.volume = time.volume+0.1;
}else{
alert("已经是最大声了!");
}
}
$("#volume span:eq(1)").html(vol);
});
//暂停播放按钮点击事件
$("#pause-key").click(function(){
if(ado.src==""){
ado.src = js[$("dd:eq(0)").html()];
show();//调用进度条和时间重绘函数
}
cankey.height = cankey.height;
if(time.paused){
time.play();//播放
canPlayKey();//调用绘制播放按钮函数
}else{
time.pause();//暂停
canPauseKey();//调用绘制暂停按钮函数
}
});
var d = document.getElementsByTagName("dd");
var cm;
function nextMusic(){ //播放下一首
currentMusic();//获取当前播放歌曲
for (var k=0; k<d.length; k++) {
if(cm == d[k].innerHTML){
if(k==d.length-1){
ado.src = js[d[0].innerHTML];
}else{
ado.src = js[d[k+1].innerHTML];
}
show();//调用进度条和时间重绘函数
return;
}
}
}
function currentMusic(){ //获取当前播放歌曲
for (var i in js) {
if(js[i]==time.attributes.src.nodeValue){
cm = i;
}
}
}
function redraw(){
cankey.height = cankey.height;
if(time.paused){//播放
canPlayKey();//调用绘制播放按钮函数
}else{//暂停
canPauseKey();//调用绘制暂停按钮函数
}
}
function canPlayKey(){ //播放按钮
ctxkey.beginPath();
ctxkey.moveTo(13,25);
ctxkey.lineTo(13,45);
ctxkey.closePath();
ctxkey.moveTo(27,25);
ctxkey.lineTo(27,45);
ctxkey.closePath();
ctxkey.strokeStyle = "white";
ctxkey.stroke();
}
function canPauseKey(){ //暂停按钮
ctxkey.beginPath();
ctxkey.moveTo(15,25);
ctxkey.lineTo(30,35);
ctxkey.lineTo(15,45);
ctxkey.lineTo(15,25);
ctxkey.closePath();
ctxkey.fillStyle = "white";
ctxkey.fill();
}
function show(){ //时间显示和进度条
var curr = 0;//秒
var minute = 0;//分钟
var dura = 0;//总时长分钟
var duras = 0;//总时长秒钟
var plan = 0;//进度条
time.ontimeupdate=function(){ //总时长和播放时长
curr = time.currentTime.toFixed(0);//获取当前播放进度
minute=parseInt(time.currentTime.toFixed(0)/60);//获取当前播放分钟
curr=time.currentTime.toFixed(0)-(minute*60);//获取当前播放秒数
dura = (time.duration/60).toFixed(0);//获取总时长分钟数
duras = (time.duration%60).toFixed(0);//获取总时长秒数
if(minute<10)
minute="0"+minute;
if(curr<10)
curr="0"+curr;
if(dura<10)
dura="0"+dura;
if(duras<10)
duras="0"+duras;
if(isNaN(dura))
dura = "00";
if(isNaN(duras))
duras = "00";
$("#music-time").html(minute+":"+curr+"/"+dura+":"+duras);
can.height = can.height;//通过改变Canvas高度达到重绘
canLength();//调用绘制进度条总长度函数
plan = ((time.currentTime/time.duration)*can.width).toFixed(0);//获取当前进度的位置
ctx.beginPath();//开始绘制当前进度条
ctx.moveTo(0,35);//起点
ctx.lineTo(plan,35);//终点
ctx.closePath();
ctx.strokeStyle = "red";//填充颜色
ctx.stroke();
ctx.arc(plan,35,5,0,2*Math.PI);
ctx.fillStyle = "red";
ctx.fill();
}
currentMusic();
$("#content-txt").html("当前播放歌曲<br />"+cm).css("background-color","rgba(100,100,100,0.2)");
}
function canLength(){ //绘制进度条总长度
ctx.beginPath();
ctx.moveTo(0,35);
ctx.lineTo(200,35);
ctx.strokeStyle = "#ddd";
ctx.closePath();
ctx.stroke();
}
});