好程序员前端分享使用JS开发简单的音乐播放器

好程序员前端分享使用JS开发简单的音乐播放器,最近,我们在教学生使用JavaScript,今天就带大家开发一款简单的音乐播放器。首先,最终效果如图所示:


首先,我们来编写html界面index.html,代码如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<title></title>

<link rel="stylesheet" type="text/css" href="css/style.css"/>

<script src="js/jquery-2.1.0.js" type="text/javascript" charset="utf-8"></script>

<script src="js/common.js" type="text/javascript" charset="utf-8"></script>

</head>

<body>

<!--播放器-->

<audio id="song" autoplay="autoplay"></audio>

<!--整体结构-->

<div id="boxDiv">

<!--歌词展示区域-->

<div id="contentDiv">

<!--歌词显示-->

<div id="lrcDiv"></div>

<!--上部阴影-->

<span id="bgTopSpan"></span>

<!--下部阴影-->

<span id="bgBottomSpan"></span>

</div>

<!--控制区域-->

<div id="controlDiv">

<!--进度条-->

<div id="progressDiv"></div>

<!--进度条圆点-->

<img id="pointerImg" src="img/audio/progress_pointer@2x.png"/>

<!--播放时间-->

<span id="playTimeSpan">00:00</span>

<!--歌曲标题-->

<span id="titleSpan"></span>

<!--总时间-->

<span id="totalTimeSpan">00:00</span>

<!--按钮区域-->

<div id="buttonDiv">

<!--上一首按钮-->

<img id="prevImg" src="img/audio/play_above_song@2x.png"/>

<!--播放暂停按钮-->

<img id="playOrPauseImg" src="img/audio/play@2x.png"/>

<!--下一首按钮-->

<img id="nextImg" src="img/audio/play_next_song@2x.png"/>

</div>

</div>

</div>

</body>

</html>


接下来,编写style.css,代码如下:

body{

margin: 0px;

background-color: #ccc;

}


#boxDiv{

width: 375px;

height: 568px;

margin: 10px auto;

position: relative;

}


#contentDiv{

width: 375px;

height: 460px;

background-image: url(../img/audio/play_bg@2x.png);

overflow: hidden;

}


#lrcDiv{

margin-top: 260px;

}


#lrcDiv span{

display: block;

line-height: 40px;

text-align: center;

color: white;

font-size: 20px;

}


#bgTopSpan{

position: absolute;

display: block;

width: 375px;

height: 30px;

top: 0px;

background-image: url(../img/audio/play_top_shadow@2x.png);

}


#bgBottomSpan{

top: 430px;

position: absolute;

background-image: url(../img/audio/play_bottom_shadow@2x.png);

display: block;

width: 375px;

height: 30px;

}


#controlDiv{

width: 375px;

height: 180px;

position: relative;

background-color: white;

}


#progressDiv{

background-color: red;

height: 1.5px;

width: 0px;

}


#pointerImg{

width: 18px;

height: 18px;

position: absolute;

top: -8.5px;

left: -3px;

}


#playTimeSpan{

display: block;

position: absolute;

font-size: 14px;

width: 35px;

top: 5px;

left: 5px;

}


#totalTimeSpan{

display: block;

position: absolute;

font-size: 14px;

width: 35px;

top: 5px;

left: 335px;

}


#titleSpan{

display: block;

position: absolute;

height: 30px;

width: 295px;

font-size: 20px;

text-align: center;

left: 40px;

top: 5px;

}


#buttonDiv{

margin-top: 40px;

position: relative;

}


#prevImg{

width: 40px;

height: 40px;

position: absolute;

top: 20px;

left: 60px;

}


#playOrPauseImg{

width: 70px;

height: 70px;

position: absolute;

top: 5px;

left: 152px;

}


#nextImg{

width: 40px;

height: 40px;

position: absolute;

top: 20px;

left: 275px;

}


最后,编写common.js,代码如下:

$(function(){

// 歌曲列表

var playList = ["红日", "狼的诱惑", "漂洋过海来看你"];

// 当前播放的歌曲序号

var currentIndex = 0;

// 播放器的原生对象

var audio = $("#song")[0];

// 播放时间数组

var timeArr = [];

// 歌词数组

var lrcArr = [];


// 调用播放前设置

setup();

// 播放歌曲

playMusic();


// 播放歌曲

function playMusic(){

// 播放歌曲

audio.play();

// 设置为暂停的图片

$("#playOrPauseImg").attr("src", "img/audio/pause@2x.png");

}


// 歌曲播放前设置

function setup(){

// 设置播放哪一首歌曲

// img/audio/红日.mp3

audio.src = "img/audio/" + playList[currentIndex] + ".mp3";

// 设置歌曲的名字

$("#titleSpan").text(playList[currentIndex]);

// 设置歌词

setLrc();

}


// 设置歌词

function setLrc(){

// 清空上一首的歌词

$("#lrcDiv span").remove();

// 清空数组

timeArr = [];

lrcArr = [];

// 加载歌词文件

$.get("img/audio/" + playList[currentIndex] + ".lrc", {}, function(data){

if(data){

// 按行切割字符串

var arr = data.split("\n");

// 分割歌词

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

// 分割时间和歌词

var tempArr = arr[i].split("]");

if (tempArr.length > 1){

// 添加时间和歌词到数组

timeArr.push(tempArr[0]);

lrcArr.push(tempArr[1]);

}

}

// 显示歌词

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

$("#lrcDiv").append("<span>"+lrcArr[i]+"</span>");

}

}

});

}


// 播放暂停事件

$("#playOrPauseImg").click(function(){

// 如果播放器是暂停状态

if(audio.paused){

// 继续播放

playMusic();

}else{

// 暂停

audio.pause();

// 变成播放的图片

$("#playOrPauseImg").attr("src", "img/audio/play@2x.png");

}

});


// 上一首

$("#prevImg").click(function(){

// 如果是第一首,那么跳到最后一首

if(currentIndex == 0){

currentIndex = playList.length - 1;

}else{

currentIndex--;

}

// 播放前设置

setup();

// 播放

playMusic();

});

// 下一首

$("#nextImg").click(function(){

// 如果是最后一首,就跳到第一首

if(currentIndex == playList.length - 1){

currentIndex = 0;

}else{

currentIndex++;

}

// 播放前设置

setup();

// 播放

playMusic();

});


// 监听播放器播放时间改变事件

audio.addEventListener("timeupdate", function(){

// 当前播放时间

var currentTime = audio.currentTime;

// 总时间

var totalTime = audio.duration;

// 当是数字的时候

if(!isNaN(totalTime)){

// 得到播放时间与总时长的比值

var rate = currentTime / totalTime;

// 设置时间显示

// 播放时间

$("#playTimeSpan").text(getFormatterDate(currentTime));

// 总时长

$("#totalTimeSpan").text(getFormatterDate(totalTime));

// 设置进度条

$("#progressDiv").css("width", rate * 375 + "px");

// 设置进度圆点

$("#pointerImg").css("left", (375 - 15) * rate - 3 + "px");

// 设置歌词的颜色和内容的滚动

for (var i = 0; i < timeArr.length - 1; i++) {

if(!isNaN(getTime(timeArr[i]))){

// 当前播放时间大于等于i行的时间,并且小于下一行的时间

if (currentTime >= getTime(timeArr[i]) && currentTime < getTime(timeArr[i+1])){

// 当前行歌词变红色

$("#lrcDiv span:eq("+i+")").css("color", "#FF0000");

// 其他行歌词变白色

$("#lrcDiv span:not(:eq("+i+"))").css("color", "#FFFFFF");

// 当前行歌词滚动

$("#lrcDiv").stop(false, true).animate({"margin-top": 260 - 40 * i + "px"}, 1000);

}

}

}

}

});


function getTime(timeStr){

// 去掉左边的[

var arr = timeStr.split("[");

if(arr.length > 1){

// 得到右边的时间

var str = arr[1];

// 分割分、秒

var tempArr = str.split(":");

// 分

var m = parseInt(tempArr[0]);

// 秒

var s = parseFloat(tempArr[1]);

return m * 60 + s;

}

return 0;

}


// 格式化时间(00:00)

function getFormatterDate(time){

// 分

var m = parseInt(time / 60);

// 秒

var s = parseInt(time % 60);

// 补零

m = m > 9 ? m : "0" + m;

s = s > 9 ? s : "0" + s;

return m + ":" + s;

}

});


图片和歌曲、歌词请自行下载,最后,可以运行试试了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学生管理系统stuSystem函数

void stuSystem(){ struct student *head,*stu; int lookup_num; int Delete_num; int Modify_num; char ckeya; int istate0; do { system("cls"); //vc清屏函数&#xff0c;包含在#include<stdlib.h>中 printf(" 欢迎进入学生管理系统&#xff01;\n&q…

OpenCL用于计算机领域的13个经典案例

摘要&#xff1a;当使用加速器和OpenCL时&#xff0c;哪种类型的算法更加快速&#xff1f;来自弗吉尼亚理工大学的Wu Feng教授和他的团队例举了一份算法列表&#xff0c;分享了OpenCL常被用于计算机领域的13个经典案例。 哪种算法可以最好的映射GPU及矢量处理器呢&#xff1f;…

版本控制:集中式(SVN) vs 分布式(GIT)

Linus一直痛恨的CVS及SVN都是集中式的版本控制系统&#xff0c;而Git是分布式版本控制系统&#xff0c;集中式和分布式版本控制系统有什么区别呢&#xff1f; 先说集中式版本控制系统&#xff0c;版本库是集中存放在中央服务器的&#xff0c;而干活的时候&#xff0c;用的都是…

Knative 核心概念介绍:Build、Serving 和 Eventing 三大核心组件

为什么80%的码农都做不了架构师&#xff1f;>>> 作者| 阿里云智能事业群高级开发工程师 元毅 Knative 主要由 Build、Serving 和 Eventing 三大核心组件构成。Knative 正是依靠这三个核心组件&#xff0c;驱动着 Knative 这艘 Serverless 巨轮前行。下面让我们来分…

树莓派基金会来号召用键盘生物学家研究企鹅

伦敦动物学会&#xff08;Zoological Society of London&#xff09;于2014年&#xff0c;与伍兹霍尔海洋研究所和牛津大学等组织合作监控企鹅的计划Penguin Lifelines有了新进展&#xff0c;伦敦动物学会现与其他动物保护组织合作Penguin Watch项目&#xff0c;邀请民众在网上…

BlockingCollectionT 类实现 列队操作

官方文档 为实现 IProducerConsumerCollection<T> 的线程安全集合提供阻塞和限制功能。 通过 BlockingCollection<T> 实现列队调用函数 建立全局变量 BlockingCollection<string> blockingCollection new BlockingCollection<string>(); 建立调用函数…

Git 版本回退

现在&#xff0c;你已经学会了修改文件&#xff0c;然后把修改提交到Git版本库&#xff0c;现在&#xff0c;再练习一次&#xff0c;修改readme.txt文件如下&#xff1a; Git is a distributed version control system. Git is free software distributed under the GPL.然后尝…

AMD院士站台 异构计算与OpenCL编程师资培训首站清华开讲

摘要&#xff1a;2013年10月14日&#xff0c;“2013年异构计算与OpenCL编程师资培训”在清华大学召开。本活动邀请到AMD、Khronos Group及清华大学的多位并行计算领域专家&#xff0c;与参会者共同探讨OpenCL异构开发和优化技术。 2013年10月14日&#xff0c;由教育部科技发展…

【问题记录】RIDE-1.7.3.1控制台及日志中文乱码处理

RIDE-1.7.3.1运行结果界面展示: 解决方法参考链接&#xff1a; https://blog.csdn.net/panda62/article/details/88535376 转载于:https://www.cnblogs.com/quietCorner/p/11046656.html

GPU Saturday技术沙龙:OpenCL程序员眼中的下一代APU架构

摘要&#xff1a;GPU Saturday技术沙龙在北京3WCoffee成功举办。本次活动邀请AMD资深技术人员及清华大学项目研究员就AMD最新的GCN架构、GPU加速计算在挖掘比特币、典型图像算法、深度神经网络算法等领域的分析与应用展开深入讨论。 [CSDN报道] 9月5日&#xff0c;GPU Saturda…

直接取出 post 请求中的 json、得请求体参数、查看 post 请求参数

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 方法如下&#xff1a; try{ServletRequestAttributes requestAttributes (ServletRequestAttributes) RequestContextHolder.getReques…

SparkSQL调优

1、执行计划&#xff08;过往记忆https://www.iteblog.com/archives/2562.html&#xff09; df.explain(true)//显示逻辑计划和物理计划&#xff0c;不加true只显示物理计划 2、逻辑计划优化方法&#xff1a; 谓词下推&#xff0c;列裁剪&#xff0c;常量替换&#xff0c;常量累…

AMD发布APPML源码,构建clMath库

摘要&#xff1a;日前&#xff0c;AMD将加速并行处理数学库&#xff08;Accelerated Parallel Processing Math Library简称APPML&#xff09;开源&#xff0c;内容包含了BLAS和FFT的OpenCL实现&#xff0c;项目托管在GitHub上&#xff0c;命名为clMath&#xff0c;该项目基于A…

最简单的 post 请求发起方式、调用其它系统接口

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 调用其它系统接口&#xff0c;发起一个 post 请求&#xff0c;写法如下&#xff1a; import cn.com.infinitus.yunxiao.jira.vo.EpicV…

CSS基础学习 18.CSS多列

四种常见的浏览器内核&#xff1a; 转载于:https://www.cnblogs.com/songsongblue/p/11050210.html

BGP

BGP&#xff1a;border gateway protocol 边界网关路由协议 路由协议分类&#xff1a;内部网关路由协议IGP&#xff1a;rip ospf isis &#xff08;eigrp&#xff09;外部 网关路由协议EGP&#xff1a;EGP&#xff08;早期淘汰&#xff09; BGP BGP特点&#xff1a;1、针对大型…

OpenCL 2.0发布,带来更强悍的异构计算能力

摘要&#xff1a;Khronos Group本周一发布了OpenCL 2.0&#xff0c;可为显示芯片提供更好的独立性&#xff0c;以便能为通用软件计算出更大的力。该组织已经发布了2.0的临时标准&#xff0c;预计正式版本的发布要等到6个月以后。 Khronos小组于本周一&#xff08;7月22日&…

从一个OutOfMemoryError 学会了分析Java内存泄漏问题

从一个OutOfMemoryError 学会了分析Java内存泄漏问题 以前都是好好的&#xff0c;最近出现了 oom。 问题 开始是&#xff1a; java.lang.OutOfMemoryError: Java heap space 2019-06-14 11:02:41.678 ERROR 13789 --- [nio-8082-exec-3] c.e.p.s.c.c.core.ELDictionaryControll…

Ubuntu安装php7.2

1、使用ppa增加源apt-get install python-software-propertiesapt-get install software-properties-commonadd-apt-repository ppa:ondrej/php2、更新apt-get update3、查看源中PHP7.2版本apt list | grep php 列表中已经包含你想要的PHP版本了4、安装PHP7.2apt-get -y …

会出现 unreachable statement 的可能

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 java编译器把unreachable statement标记为运行时错误&#xff0c;一个unreachable statement就是编译器决定永远不会执行它。 下面的几…