HTML5 CSS3实战——自定义音乐播放器(一)

article/2025/11/5 17:56:07

前几天才刚开始接触HTML5和CSS3。学习了一下里面的一些炫酷的新特性。不过,对于原生的HTML5的媒体播放器,真的不得不吐槽:就三个按钮 界面还那么丑。所以觉得自己整一个好看的播放器。老话说:说不如干,纸上谈兵终觉浅。所以结合这几天来学的东西,自己写了一个HTML5的播放器。
这里写图片描述
HTML5原生播放器:
这里写图片描述

我们的效果图:

这里写图片描述

歌曲列表:

这里写图片描述

首先分析下界面,将主面板解剖一下:
这里写图片描述
整个界面都是用Html5的Canvas绘制的,切换歌曲的时候,中间的歌曲名和后面的专辑封面也会动态切换。默认顺序循环播放,就是一首接下一首,也可以切换成随机播放。

最上边的按钮是切换到歌曲列表面板;
中间的一排按钮,最左边的是顺序播放;
第二个是上一首;第三个是暂停/播放;
第四个是下一首;第五个是随机播放。
下面的是音量条,拖动控制音量;
最下面是歌词面板,点击后显示歌词。
最外边有一圈蓝色的进度条,提示歌曲当前播放进度。

代码实现:

主要的html5代码:

    <!--Music Box--><div id="musicbox"><div id="container"><label class="to-back-label" for="to-back"><i class="fa fa-bars fa-lg"></i></label><input type="checkbox" id="to-back"><!-- playlist toggle --><canvas id="progress" width="320" height="320"></canvas><!-- progress bar --><div id="player"><audio id="audio" controls></audio><img id="imcover" src="images/music/回梦游仙.png"><!-- album cover --><label class="to-lyrics-label" for="to-lyrics"><i class="fa fa-caret-down fa-lg"></i></label><input type="checkbox" id="to-lyrics"><!-- lyrics toggle --><div class="cover"><div class="controls"><div id="currentM" >正在播放:<strong id="rmusic">回梦游仙</strong></div><button id="randoms" title="随机播放"><i class="fa fa-retweet fa-lg"></i></button><button id="backward" title="上一首"><i class="fa fa-backward fa-2x"></i></button><button id="play-pause" title="Play" onclick="togglePlayPause()"><i class="fa fa-play fa-3x"></i></button><button id="forward" title="下一首"><i class="fa fa-forward fa-2x"></i></button><button id="sequence" title="顺序播放"><i class="fa fa-random fa-lg"></i></button><input id="volume" name="volume" min="0" max="1" step="0.1" type="range" onchange="setVolume()" /></div><!-- #controls --><!-- <div class="info"><p class="song"><a href="#" target="_blank">Abitude</a></p><p class="author"><a href="#" target="_blank">Abi</a></p></div><!-- #info --><div id="lycs" class="lyrics"><p>仙剑奇侠传4——回梦游仙.</p><p> 冰封的泪 如流星陨落</p><p> 跌碎了谁的思念</p><p> 轮回之间 前尘已湮灭</p><p> 梦中模糊容颜</p><p> 昆仑巅 江湖远 花谢花开花满天</p><p>叹红尘 落朱颜 天上人间</p><p>情如风 情如烟 琵琶一曲已千年</p><p>今生缘 来生缘 沧海桑田</p><p>成流年</p><p>古老的剑 斩断了宿怨</p><p>唤醒了谁的誓言</p><p>转瞬之间 隔世的爱恋</p><p>追忆往日缱绻</p><p>昆仑巅 浮生远 梦中只为你流连</p><p>笑红尘 画朱颜 浮云翩跹</p><p>情难却 情相牵 只羡鸳鸯不羡仙</p><p>今生缘 来生缘 难分难解</p><p>昆仑巅 浮生远 梦中只为你流连</p><p> 笑红尘 画朱颜 浮云翩跹</p><p> 情难却 情相牵 只羡鸳鸯不羡仙</p><p> 今生恋 来生恋 莫让缠绵 成离别</p></div><!-- #lyrics --><p class="scroll">scroll down</p></div><!-- #cover --></div><!-- #player --><div id="flip-back"><ol class="playlist" id="playlist"></ol></div><!-- #flip-back --></div><!-- #container --></div><script type="text/javascript" src="js/musicbox.js"></script>

musicbox.js中的代码:

$(function() {// 播放器var Player;Player = {// 歌曲路径path: 'video/',imgPath:'images/music/',// 歌曲数据data: null,imgs: null,// 当前播放歌曲的 索引currentIndex: -1,//  播放器元素jquery对象$audio: $('#audio'),// 歌曲列表$mList: $('#playlist'),//正在播放的歌曲$rmusic: $('#rmusic'),$cover:	 $('#imcover'),// 初始化 数据init: function () {// 数据一般来自服务器端,通过ajax 加载数据,这里是模拟//歌曲的数据Player.data = ['GlassySky.mp3', '回梦游仙.mp3', 'unravel.mp3','一直很安静.mp3'];//封面的数据Player.imgs = ['GlassySky.jpg', '回梦游仙.png', 'unravel.jpg','一直很安静.png'];Player.$rmusic.html(Player.data[Player.currentIndex]);//初始化var mhtml = '';var len = Player.data.length;//初始化歌曲列表for (var i = 0; i < len; i++) {mhtml += '<li value="' + i + '"><a >' + Player.data[i] + '</a></li>';}Player.$mList.html(mhtml);//初始化专辑封面Player.$cover.attr("src", Player.imgPath+Player.imgs[0]);},// 就绪ready: function () {// 控制Player.audio = Player.$audio.get(0);Player.$rmusic.html(Player.data[Player.currentIndex]);// 播放$('#btn-play').click(function () {Player.audio.play();if (Player.currentIndex == -1) {$('#btn-next').click();}});// 暂停$('#btn-pause').click(function () {Player.audio.pause();});// 下一曲$("#forward").click(function () {if (Player.currentIndex == -1) {Player.currentIndex = 0;} else if (Player.currentIndex == (Player.data.length - 1)) {Player.currentIndex = 0;} else {Player.currentIndex++;}var currentMusic=Player.data[Player.currentIndex];currentMusic = currentMusic.substring(0,currentMusic.indexOf('.'));console.log("Player.currentIndex : " + Player.currentIndex);Player.audio.src = Player.path + Player.data[Player.currentIndex];Player.$rmusic.html(currentMusic);Player.$cover.attr("src", Player.imgPath+Player.imgs[Player.currentIndex]);Player.audio.play();});// 上一曲$('#backward').click(function () {if (Player.currentIndex == -1) {Player.currentIndex = 0;} else if (Player.currentIndex == 0) {Player.currentIndex = (Player.data.length - 1);} else {Player.currentIndex--;}var currentMusic=Player.data[Player.currentIndex];currentMusic = currentMusic.substring(0,currentMusic.indexOf('.'));Player.audio.src = Player.path + Player.data[Player.currentIndex];Player.$cover.attr("src", Player.imgPath+Player.imgs[Player.currentIndex]);Player.$rmusic.html(currentMusic);Player.audio.play();});// 单曲循环$('#btn-loop').click(function () {console.log("Player.currentIndex :", Player.currentIndex);Player.audio.onended = function () {Player.audio.load();Player.audio.play();};});// 顺序播放$('#sequence').click(function () {console.log("Player.currentIndex :", Player.currentIndex);Player.audio.onended = function () {$('#btn-next').click();};});// 随机播放$('#randoms').click(function () {Player.audio.onended = function () {var i = parseInt((Player.data.length - 1) * Math.random());alert(i);playByMe(i);};});// 播放指定歌曲function playByMe(i) {i=parseInt(i);Player.audio.src = Player.path + Player.data[i];Player.audio.play();Player.currentIndex = i;Player.$rmusic.html(Player.data[Player.currentIndex]);Player.$cover.attr("src", Player.imgPath+Player.imgs[Player.currentIndex]);}// 歌曲被点击$('#playlist li').click(function () {$(this).find('a').find('i').remove();$(this).find('a').css("color","#26C5CB");$(this).find('a').prepend("<i class=\"fa fa-play\" style=\"margin-right:4px;\"></i>");$(this).siblings().find('a').css("color","#ffffff");$(this).siblings().find('a').find('i').remove();var i = parseInt($(this).attr('value'));playByMe(i);/*style="color:#26C5CB;"*/});},//循环播放loop:function(){Player.audio.onended = function(){if (Player.currentIndex == -1) {Player.currentIndex = 0;} else if (Player.currentIndex == (Player.data.length - 1)) {Player.currentIndex = 0;} else {Player.currentIndex++;}var currentMusic=Player.data[Player.currentIndex];currentMusic = currentMusic.substring(0,currentMusic.indexOf('.'));console.log("Player.currentIndex : " + Player.currentIndex);Player.audio.src = Player.path + Player.data[Player.currentIndex];Player.$cover.attr("src", Player.imgPath+Player.imgs[Player.currentIndex]);Player.$rmusic.html(currentMusic);Player.audio.play();}}};Player.init();Player.ready();Player.loop();});audio.controls = false;audio.addEventListener('timeupdate', function() {updateProgress();
}, false);function togglePlayPause() {if (audio.paused || audio.ended) {playpause.title = "Pause";playpause.innerHTML = '<i class="fa fa-pause fa-3x"></i>';audio.play();} else {playpause.title = "Play";playpause.innerHTML = '<i class="fa fa-play fa-3x"></i>';audio.pause();}
}function setVolume() {audio.volume = volume.value;
}
//更新进度条
function updateProgress() {var percent = Math.floor((100 / audio.duration) * audio.currentTime);progress.value = percent;var canvas = document.getElementById('progress');var context = canvas.getContext('2d');var centerX = canvas.width / 2;var centerY = canvas.height / 2;var radius = 150;var circ = Math.PI * 2;var quart = Math.PI / 2;var cpercent = percent / 100; /* current percent */context.beginPath();context.arc(centerX, centerY, radius, 0, ((circ) * cpercent), false);context.lineWidth = 10;context.strokeStyle = '#26C5CB';context.stroke();if (audio.ended) resetPlayer();
}
//重置播放器
function resetPlayer() {audio.currentTime = 0; context.clearRect(0,0,canvas.width,canvas.height);playpause.title = "Play";playpause.innerHTML = '<i class="fa fa-play fa-3x"></i>';
}

由于时间关系,所以歌词列表的动态显示功能还没做。这需要解析歌词的格式。准备在下次完成歌词列表功能。


http://chatgpt.dhexx.cn/article/t4saq42L.shtml

相关文章

NetEase MusicBox —— Linux系统里的网易云音乐(转载)

功能特性 320kbps的高品质音乐 歌曲&#xff0c;艺术家&#xff0c;专辑检索 网易 22 个歌曲排行榜 网易新碟推荐 网易精选歌单 网易 DJ 节目 私人歌单&#xff0c;每日推荐 随心打碟 本地收藏&#xff0c;随时加 ? 播放进度及播放模式显示 Vimer 式快捷键让操作丝般顺滑 可使…

MusicBox - 仿千千静听

大学毕业时业余之作 最新下载地址&#xff1a; 匿名提取文件连接 http://pickup.mofile.com/5412819180446197 或登录Mofile&#xff0c;使用提取码 5412819180446197 提取文件 MusicBox 停止开发&#xff01;&#xff01; 淘宝开卖源代码 有意者 http://item.taobao.co…

音乐播放器

用HTML做了个音乐播放器&#xff0c;可以循环播放&#xff0c;选择歌曲&#xff0c;以及自动播放下一首&#xff0c;运用了js和json知识&#xff0c;下面是效果图和源码&#xff0c;有兴趣的可以试试哦 效果图&#xff1a; 源码&#xff1a;html <span style"color:#9…

MusicPlay播放器

文章目录 一丶前端布局二丶Activity三丶Service实验演示 一丶前端布局 Layout的框架 一个自定义的音乐播放器&#xff0c;页面布局大致如下 二丶Activity 首先定义控件 // 获取界面中显示歌曲标题、作者文本框TextView title, author;// 喜欢&#xff0c;播放&#xff0c;暂…

MusicPlay 音乐播放器(纯前端)

纯Css,js前端音乐播放器,界面UI比较好。我特别喜欢,适合二次开发,调用了网易云第三方接口以及将歌曲链接导出可以访问的歌曲链接,实现了异步歌曲搜索播放,以及异步显示歌词等.结合html5 新特性实现歌曲暂停,下一首,快进等等.为大二前端练手项目.采用渐变质背景 是前端练手的好…

HTML5+JS实现简易的音乐播放器

HTML5JS实现简易的音乐播放器 播放器实现的功能 播放/暂停音乐切换歌曲&#xff0c;上/下一首歌音量最大或静音音乐播放时间实时变化进度条拖拽歌曲图片切换 播放器效果展示 代码展示 html <div class"musicBox" id"musicBox"><audio src"…

音乐播放器MusicBox

音乐播放器MusicBox 功能界面分析 界面要求较为简洁&#xff0c;仅需两个TextView&#xff0c;用于输出音乐名称及歌手姓名&#xff0c;下方三个ImageButton&#xff0c;用于播放&#xff0c;暂停或切换上一首&#xff0c;下一首歌曲。 实现 总体规划 在MainActivity中&a…

索尼音乐应用android,Sony Music Center

Sony Music Center是全新的索尼音乐中心也是原来的songpal应用&#xff0c;作为sony手机上面的专业播放器的软件&#xff0c;它能够为用户播放各种音乐上面的内容&#xff0c;它可以直接的为用户解析各种音乐的内容&#xff0c;让用户能够随时的在手机上面收听到自己所喜欢的无…

MusicLibrary:一个丰富的音乐播放封装库

code小生,一个专注 Android 领域的技术分享平台 作者&#xff1a;lizixian18链接&#xff1a;https://github.com/lizixian18/MusicLibrary声明&#xff1a;本文是 lizixian18 投稿,转载等请联系作者获得授权。 MusicLibrary 一个丰富的音乐播放封装库&#xff0c;针对快速集成…

MusicBox

MusicBox 编写音乐盒代码&#xff0c;并添加音乐播放的 上一首 和 下一首 控制。 1.添加所需的图片以及音乐文件&#xff1b; 2.编写xml文件&#xff0c;上一首、下一首、暂停、播放按钮以及歌曲的名字和作者 <?xml version"1.0" encoding"utf-8"?&…

Musicplayer

Musicplayer Python 音乐播放器 功能&#xff1a; 首先可以实现本地音乐的播放&#xff0c;能够打开电脑端的文件&#xff0c;文件中进行多选&#xff0c;实现暂停、上一曲、下一曲的功能。在此基础上&#xff0c;完成随机播放列表和网络端下载的功能。 设计方法&#xff1a; 本…

MusicBox(音乐播放器)

这两天做了一个小型的音乐播放器&#xff0c;基本功能都已实现&#xff0c;同时也让我对CSliderCtrl&#xff0c;MCI_OPEN_PARMS以及控件之间的消息映射&#xff0c;数据转换等有了更深入的理解&#xff0c;下面是自己编程的详细过程&#xff1a; 1 首先将控件的位置都摆好&a…

musicbox使用方法_使用Pi MusicBox收听流音乐

musicbox使用方法 在用Raspberry Pi 控制圣诞树灯的项目完成之后&#xff0c;下一个项目是什么&#xff1f; 我最终开始尝试使用Pi Musicbox进行修补&#xff0c;这是Mopidy的Raspbian的一种版本 &#xff0c;它允许用户在“无头”的Raspberry Pi上播放各种流媒体服务&#xff…

推荐一个高大上的网易云音乐命令行播放工具:musicbox

网易云音乐上有很多适合程序猿的歌单&#xff0c;但是今天文章介绍的不是这些适合程序员工作时听的歌&#xff0c;而是一个用Python开发的开源播放器&#xff0c;专门适用于网易云音乐的播放。这个播放器的名称为MusicBox, 特色是用命令行版本执行音乐的播放。 github地址&…

移动开发技术(三)MusicBox

实验要求 使用广播机制&#xff0c;编写音乐盒代码&#xff0c;添加音乐播放的播放、暂停、停止、上一首和下一首控制 实验步骤 一、布局设置 添加一个LinearLayout&#xff0c;选择垂直分布。在里面添加两个LinearLayout&#xff1a; ①music_show&#xff1a;用于展示图片…

Gap Statistic算法详解

在Kmean算法确定K值的问题里&#xff0c;可以使用手肘法&#xff0c;也可以用Gap statistic 算法。手肘法的缺点是不够自动化&#xff0c;而Gap不再需要“手肘法”式的肉眼判断&#xff0c;而只需要找出使Gap Statistic最大的K值即可。因此&#xff0c;Gap和适用于批量化作业。…

IDEA 统计插件Statistic:查看你的代码量

最近接触了一款IDEA统计代码量的插件Statistic&#xff0c;简介一下Statistic的安装。 一、插件下载安装 File->Settings->Plugins&#xff0c;输入Statistic&#xff0c;点击install,安装完后选择重启idea。 二、运行使用 重启完后&#xff0c;点击refesh即可看到代码量…

idea中安装统计代码statistic插件

百度一圈都是直接在idea中安装statistic插件&#xff0c;就不再重复 1.从官网下载&#xff1a;http://plugins.jetbrains.com/plugin/4509-statistic/versions 插件包 到本地 2.选择从本地安装 3. 4.重启idea 5.工具栏

探索 t Statistic的稳健性

探索 t Statistic的稳健性 探索t-statistic 的稳健性 假设有2组数据&#xff0c;x1,…,xm; y1,…,yn。 t-test的假设为两组数据的平均值无差异 即&#xff1a; 令X和Sx为为x数组的平均值和标准差&#xff0c;Y和Sy为y数组的平均值和标准差&#xff1b;则H0的判别式为 在H0…

AS 使用Statistic插件统计代码行数

1.下载插件及安装 点击File → Setting→ Plugins&#xff0c;搜索Statistic插件&#xff0c;点击install按钮安装插件。 2.插件使用 安装成功后重启AS&#xff0c;在View→Tool Windows→Statistic&#xff0c;选择后AS底部会显示Statistic按钮&#xff0c; 点击Refresh按钮…