今天我们看的是一个使用纯HTML+CSS+JS实现音乐播放器的例子,效果还是很赞的: codePen地址

HTML部分

首先我们要思考一下,一个播放器主要包含哪些元素。首先要有播放的进度信息,还有播放/暂停或者上一首下一首等必要的按钮,同时还要显示一些当前播放的音乐名称等信息。播放多首歌曲时,要显示播放列表。。。因此,从语义上可以构造出基本的HTML结构:

// 背景区块,用于显示当前播放音乐的图片
<div class='background' id='background'></div> // 播放器区块
<div id='player'>
<audio id='mytrack' src=''></audio>
//顶部区域,只显示一幅画
<div id='artwork'></div>
// 播放列表
<div id='tracks'>
<div trackartist='Tobu & Syndec' trackname='Dusk' trackartwork='01.jpg'></div>
<div trackartist='Disfigure' trackname='Blank' trackartwork='02.jpg'></div>
<div trackartist='Alan Walker' trackname='Fade' trackartwork='03.jpg'></div>
</div> //播放器的UI部分
<div id='ui'>
//播放器已播放时间和总的时间
<div id="time">
<span id='elapsedtime'>00:00</span>
<span id='totaltime'>00:00</span>
</div>
//进度条
<div id='progressbar'>
<div>
<span id='pointer'></span>
</div>
</div>
// 播放器控件
<div id='controls'>
<button id='prev' class='control'></button>
<button id='play' class='control'></button>
<button id='stop' class='control'></button>
<button id='next' class='control'></button>
</div> </div>
</div>

CSS部分

接下来看css部分。首先将player区块进行了居中,并添加了背景和阴影:

#player
width: 300px
position: absolute
left: 50%
top: 50%
box-shadow: 0px 5px 10px #000
background-color: $color4
transform: translate(-50%, -50%)
-o-transform: translate(-50%, -50%)
-moz-transform: translate(-50%, -50%)
-webkit-transform: translate(-50%, -50%)

对于顶部的图像区块,设置充满宽度,并设置图像水平和垂直方向都居中,当图像切换时,增加了1s的过渡效果。

#artwork
width: 100%
height: 0
padding-bottom: 100%
display: block
position: relative
overflow: hidden
background-image: url("../artworks/01.jpg")
background-repeat: no-repeat
background-size: cover
background-position: center center
transition: background 1s ease 0s
-o-transition: background 1s ease 0s
-moz-transition: background 1s ease 0s
-webkit-transition: background 1s ease 0s

这里将height设置为0,然后padding-bottom设置为100%(相对与父元素的宽度),由于它的宽和父元素的宽相同,结果就是将它的宽和高设成相同,即300px * 300px。

播放列表区块首先是一个列表,因此我们直观地想到了用ul/li来实现,但是这里用的是将父元素设置display:table,然后每项的图片和名字设置为display: table-cell的形式:

    #tracks
width: 100%
display: block
overflow: hidden
background-color: #fff div
width: 100%
display: table
background-color: #fff
transition: all 0.5s ease 0s
-o-transition: all 0.5s ease 0s
-moz-transition: all 0.5s ease 0s
-webkit-transition: all 0.5s ease 0s
cursor: pointer span
margin-right: 10px
display: table-cell
padding: 0px 10px
height: 50px
line-height: 50px
font-size: 1.2em
color: #aaa artwork
text-align: center
display: table-cell
width: 50px
background-repeat: no-repeat
background-size: cover
background-position: center center

UI区块是重点,主要包括时间、进度条和控件三个部分。时间按理来说在布局上比较简单,但这里它又用到了我们想不到的display:list-item来实现(相当于ul,其实我觉得这里没有写这些),然后又用了css3中的first-of-type伪类用来匹配该类型的第一个元素等。

进度条主要是通过将div的宽度逐渐增大并进行过渡。还有一个pointer,通过将它的背景设置为发亮,表明当前播放的位置。

    #progressbar
width: 100%
display: block
overflow: hidden
height: $progressHeight
background-color: $color4 - 10
cursor: pointer div
width: 0%
height: $progressHeight
display: block
float: left
background-color: $color3 - 40
transition: width 0.1s ease 0s
-o-transition: width 0.1s ease 0s
-moz-transition: width 0.1s ease 0s
-webkit-transition: width 0.1s ease 0s #pointer
width: 4px
height: $progressHeight
display: block
float: right
background-color: $color3
transform: translate(100%,0)

最后是控件部分。每个控件的宽度设为25%向左浮动,并再次用到了display:list-item

.control
width: 25%
height: 50px
float: left
display: list-item
list-style: none
background-repeat: no-repeat
background-color: transparent
background-size: 20px
background-position: center center
transition: background 0.1s ease 0s
-o-transition: background 0.1s ease 0s
-moz-transition: background 0.1s ease 0s
-webkit-transition: background 0.1s ease 0s &:hover
cursor: pointer

JS部分

最后我们要看的是交互部分。交互主要包括:

  1. 换歌:在列表中高亮当前播放的歌曲,切换背景图片,播放
  2. 播放:播放声音,调整进度条,显示正确的按钮背景
  3. 上一条/下一条:=换歌,但还要考虑到第一首和最后一首的特殊情况
  4. 暂停/恢复:暂停/恢复音频的播放,显示正确的按钮背景
  5. 进度条点击:更新当前播放的时间点

总之,包含的有:currentAudio, isPlaying, audioPosition这几个状态信息。

比如点击了下一首,它会做这么几个交互上的改变:

  1. 按钮背景有一个状态按下的效果
  2. 停止当前歌曲的播放
  3. 重置进度条的位置
  4. 歌曲列表当前项显示有更新
  5. 顶部的封面有更新
  6. 如果当前isPlaying为true,则播放歌曲,更新进度条
    //
if(this.classList[0] !== "shadow")
{
for(var x = 0; x < audioControls.children.length; x++)
{
audioControls.children[x].classList.remove("shadow");
} this.classList.add("shadow");
} //
audio.currentTime = 0;
clearInterval(timer); //
updateProgressBarPosition() //
updateActiveTrack(currentTrack); //
changeBackgroundImage(artwork, artworkSrc); //
audio.play();
audioState = "play";
changeBackgroundImage(play, iconsFolder + "pause.png"); // Update the time
timer = setInterval(
function()
{
updateTime();
},
100
);

每天看一片代码系列(三):codepen上一个音乐播放器的实现的更多相关文章

  1. 【Linux_Fedora_应用系列】_1_如何安装音乐播放器和mp3解码

    因为安装环境的不同,Fedora在安装后会安装不同的软件包.通常在安装的时候有多种选择: 1.桌面环境: 适合个人日常使用,安装包含办公软件(Fedora 默认安装Open Office).娱乐影音软 ...

  2. pygame系列_原创百度随心听音乐播放器_完整版

    程序名:PyMusic 解释:pygame+music 之前发布了自己写的小程序:百度随心听音乐播放器的一些效果图 你可以去到这里再次看看效果: pygame系列_百度随心听_完美的UI设计 这个程序 ...

  3. 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 Bug修复

    开篇语 昨晚发了一篇: <简年15: 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 > 然后上午起来吃完午饭之后,我就准备继续开工的,但是突然的,想要看B站.然后在一股 ...

  4. 基于jQuery虾米音乐播放器样式代码

    分享一款基于jQuery虾米音乐播放器样式代码.这是一款基于jquery+html5实现的虾米音乐播放器源码下载.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div c ...

  5. android调用音乐播放器,三种方

    小弟想请问一下.怎样在自己写的程序中调用系统的音乐播放器呢. 我在google上搜索了.主要是有两种方法,可是都不是我想要的. 第一种是.使用mp3音乐文件的uri.和intent,进行调用.可是这样 ...

  6. 基于jQuery仿QQ音乐播放器网页版代码

    基于jQuery仿QQ音乐播放器网页版代码是一款黑色样式风格的网页QQ音乐播放器样式代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="m ...

  7. 【转】C# 视频监控系列(13):H264播放器——控制播放和截图

    本文原文地址:http://www.cnblogs.com/over140/archive/2009/03/30/1421531.html 阿里云栖社区也有相关的视频开发案例:https://yq.a ...

  8. 【转】C# 视频监控系列(12):H264播放器——播放录像文件

    原文地址:http://www.cnblogs.com/over140/archive/2009/03/23/1419643.html?spm=5176.100239.blogcont51182.16 ...

  9. 仿酷狗音乐播放器开发日志三——修复CEditUI的bug2

    无意中发现了CEditUI控件的另一个bug,当我给播放器的搜索栏获取焦点时,这时再改变窗体大小,原本搜索栏应该对应着也改变大小,却发现CEditUI内嵌的edit控件没有跟着改变(如下图),跟着调试 ...

随机推荐

  1. SpringMVC 如何定义类型转换器

    举例说明, 将一个字符串转换成的 User 类型. 例如将字符串 1-zcd-1234-zcd@163.com-1999/12/12  转换成User 类型. 一.实体类 public class U ...

  2. Python小技巧:使用*解包和itertools.product()求笛卡尔积

    [问题] 目前有一字符串s = "['a', 'b'],['c', 'd']",想把它分开成为两个列表: list1 = ['a', 'b'] list2 = ['c', 'd'] ...

  3. Linux修改权限命令chmod用法详解

    Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. 文件或目录的访问权限分为只读,只写和可执行三种.以文件为例,只读权限表示只允许读其内容,而禁 ...

  4. 从零一起学Spring Boot之LayIM项目长成记(一) 初见 Spring Boot

    项目背景 之前写过LayIM的.NET版后端实现,后来又写过一版Java的.当时用的是servlet,websocket和jdbc.虽然时间过去很久了,但是仍有些同学在关注.偶然间我听说了Spring ...

  5. dropout总结

    1.伯努利分布:伯努利分布亦称“零一分布”.“两点分布”.称随机变量X有伯努利分布, 参数为p(0<p<1),如果它分别以概率p和1-p取1和0为值.EX= p,DX=p(1-p). 2. ...

  6. 华为路由设备SSH配置

    一.环境 路由 IP:192.168.56.2 本地云 IP:192.168.56.1 二.路由器配置 [Huawei]aaa 添加用户[Huawei-aaa]local-user test pass ...

  7. vue中调用地图

    一. vue-amap,一个基于 Vue 2.x 和高德地图的地图组件 这个就不细说了,按照其文档,就能够安装下来. 二. 按照官方提供的方法引入 1.修改webpac.base.conf.js文件 ...

  8. centos7修改主机名和ip映射

    1.修改主机名:命令:/etc/hostname文件输入:HOSTNAME=node3想永久修改,应该修改配置文件 /etc/sysconfig/network. 输入:NETWORKING=yes ...

  9. 工程命名为***&***出现的问题: LaunchScreen.xib: Line 20: EntityRef: expecting ';'

    今天新建一个项目命名为28 & 29. extern&static,  然后cmd + R运行,居然碰到了编译错误. 当时就奇怪了,怎么会这样呢?报错内容如下: 开始还以为新安装的Xc ...

  10. 关于sharepoint如何做SSO,如何做OOS监视编辑

    应客户需求,需要做sharepoint SSO,以前都是默认的AD验证,如果客户已经有一套SSO系统,验证过SSO之后就能自动登录,而不是浏览器上设置保存用户名密码的AD登陆. 怎么做呢? 首先sha ...