今天我们看的是一个使用纯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. 从windows到linux的换行转换工具dos2unix

    同学们也许知道,windows中的文本文件的换行符是"\r\n",而linux中是"\n".由于换行符的不同,所以有的时候会发生一些莫名其妙的状况.至于具体什么 ...

  2. UVa 12265 - Selling Land

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. 闲来无事,用javascript写了一个简单的轨迹动画

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 关于SQL注入中编码问题的疑问

    提到SQL注入的绕过,编码是其中最普通的一种方法,最常用的URL编码.之前一直有个疑问,编码与未编码到底有哪些地方存在区别? 以下是本人自己对URL编码的一些见解,可能有错误的地方欢迎大佬们指正. 什 ...

  5. Mac OS系统下配置hosts的方法

    首先,介绍下什么是hosts Hosts是一个没有扩展名的系统文件,可以用系统自带的记事本等工具打开,作用就是将一些常用的网址域名与其对应的IP地址建立一个关联,当用户在浏览器输入一个需要登录的网址时 ...

  6. 小BAT解决大麻烦_某卡教室控制软件

    @echo off mode con cols= lines= if "%1" == "h" goto begin mshta vbscript:)(windo ...

  7. 常用的css选择器

    1.最基本的 * * 选择所有元素. #id #firstname 选择 id="firstname" 的元素. .class .intro 选择 class="intr ...

  8. java eclipse 访问 Oracle数据库的代码

    package com.hanqi.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.R ...

  9. Gradle Goodness: Set Java Compiler Encoding

    If we want to set an explicit encoding for the Java compiler in Gradle we can use the options.encodi ...

  10. you don't have permission to access ...........on this server问题解决

    因为刚刚开始使用新架构的项目,于是把老项目统统替换成了新的项目.配置好后,本地登录页面报 you don't have permission to access ...... on this serv ...