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

今天我们看的是一个使用纯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区块进行了居中,并添加了背景和阴影:

#playerwidth: 300pxposition: absoluteleft: 50%top: 50%box-shadow: 0px 5px 10px #000background-color: $color4transform: translate(-50%, -50%)-o-transform: translate(-50%, -50%)-moz-transform: translate(-50%, -50%)-webkit-transform: translate(-50%, -50%)

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

#artworkwidth: 100%height: 0padding-bottom: 100%display: blockposition: relativeoverflow: hiddenbackground-image: url("../artworks/01.jpg")background-repeat: no-repeatbackground-size: coverbackground-position: center centertransition: 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的形式:

    #trackswidth: 100%display: blockoverflow: hiddenbackground-color: #fffdivwidth: 100%display: tablebackground-color: #ffftransition: 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 0scursor: pointerspanmargin-right: 10pxdisplay: table-cellpadding: 0px 10pxheight: 50pxline-height: 50pxfont-size: 1.2emcolor: #aaaartworktext-align: centerdisplay: table-cellwidth: 50pxbackground-repeat: no-repeatbackground-size: coverbackground-position: center center

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

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

    #progressbarwidth: 100%display: blockoverflow: hiddenheight: $progressHeightbackground-color: $color4 - 10cursor: pointerdivwidth: 0%height: $progressHeightdisplay: blockfloat: leftbackground-color: $color3 - 40transition: 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#pointerwidth: 4pxheight: $progressHeightdisplay: blockfloat: rightbackground-color: $color3transform: translate(100%,0)

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

.controlwidth: 25%height: 50pxfloat: leftdisplay: list-itemlist-style: nonebackground-repeat: no-repeatbackground-color: transparentbackground-size: 20pxbackground-position: center centertransition: 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&:hovercursor: pointer

JS部分

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

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

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

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

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

 

转载于:https://www.cnblogs.com/cubika/p/4440159.html

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

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

相关文章

OpenCV——读取摄像头并处理图像

1、读取摄像头并处理图像的代码如下&#xff1a; #include<opencv2/opencv.hpp> using namespace cv;//-----------------------------------【main()函数】-------------------------------------------- // 描述&#xff1a;控制台应用程序的入口函…

MVP

MVP是一种广泛使用的UI架构模式&#xff0c;适用于基于事件驱动的应用框架。 能够与 Model直接进行交互的仅限于 Presenter, View 只能通过 Presenter 间拉地调用 Model。 MVP分PV&#xff08;Passive View) 和 &#xff08;Supervising Controller)两种模式 SC(Supervising Co…

OpenCV——图像显示与写入

1、图像显示与写入的代码如下&#xff1a; #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp>using namespace cv; using namespace std; //opencv中图像显示与写入 int main() {Mat myMat imread("小狗1.jpg", -1);if (myMat.em…

工业3D打印:一场仍处在初级阶段的技术革命

来源&#xff1a;资本实验室摘要&#xff1a;曾记否&#xff0c;几年前当我们在实体店看到3D打印机打印出的一个个小玩意时&#xff0c;那种油然而生的新鲜与神奇感&#xff1f;然而&#xff0c;短短几年&#xff0c;面对这种新事物&#xff0c;我们已经见怪不怪。此外&#xf…

OpenCV——读取视频文件并写入文件

1、代码如下&#xff1a; #include<opencv2/opencv.hpp> using namespace cv;//-----------------------------------【main()函数】-------------------------------------------- // 描述&#xff1a;控制台应用程序的入口函数&#xff0c;我们…

人工智能的现状与未来(附PPT)

来源&#xff1a;网经科技摘要&#xff1a;人工智能引领新的工业革命&#xff0c;需要正确理解其技术核心、学科定位、架构演进&#xff0c;当前深度学习和知识图谱成其左膀右臂&#xff0c;象征人类智谋的智能博弈在围棋后的下一个高地在哪里&#xff1f;走向人机融合的未来&a…

【最新】三位深度学习创始人共同获得了2019年公布的图灵奖

来源&#xff1a;biendata数据实战派2019年3月27日 ——ACM宣布&#xff0c;深度学习的三位创造者Yoshua Bengio, Yann LeCun, 以及Geoffrey Hinton获得了2019年的图灵奖。今天&#xff0c;深度学习已经成为了人工智能技术领域最重要的技术之一。在最近数年中&#xff0c;计算机…

Throwable 结构图

从这个图中就可以看出运行时异常是数组越界、空指针、类转换错误之类的异常&#xff0c;解决方法是修改代码而其他异常&#xff0c;也就是已检查异常&#xff0c;则是需要抛出或者捕捉转载于:https://www.cnblogs.com/dolphin007/p/4446105.html

无人驾驶产业发展现状及影响

来源&#xff1a;《中国国情国力》杂志摘要&#xff1a;无人驾驶产业将是我国对美欧日等传统汽车大国实现变道超车的重要领域。我国无人驾驶产业需求巨大、规模快速增长&#xff0c;但是人才缺口和尚不完善的法律仍是制约产业发展的障碍。无人驾驶产业改变了就业结构&#xff0…

Java中9种IO的读取方式

数据的读写&#xff0c;按照数据类型可以分为两种&#xff1a;字符流和字节流&#xff08;二者区别&#xff1f;&#xff09;。所以数据读取方式按照数据类型也可以分为两类&#xff1a;字节流的读取和字符流的读取。 一、字节流读取操作&#xff1a;| ||-----1、FileInputStre…

推翻《Nature》:生命不息,神经发生不止...

摘要&#xff1a;热播剧《都挺好》里的巨婴苏大强最后也患了阿尔兹海默症来源&#xff1a;中国生物技术网上图显示了68岁时死亡的男性海马齿状回的组织。他在死亡时有一个健康的大脑。在图片中&#xff0c;新鲜的脑细胞呈红色&#xff0c;成熟的脑细胞呈蓝色。图片来源&#xf…

OpenCV—基本矩阵操作与示例

OpenCV的基本矩阵操作与示例OpenCV中的矩阵操作非常重要&#xff0c;本文总结了矩阵的创建、初始化以及基本矩阵操作&#xff0c;给出了示例代码&#xff0c;主要内容包括&#xff1a;创建与初始化矩阵加减法矩阵乘法矩阵转置矩阵求逆矩阵非零元素个数矩阵均值与标准差矩阵全局…

centos 安装php

1.yum安装 yum install php php-fpm php-common php-gd php-mcrypt php-pear php-pecl-memcache php-mhash php-mysql php-xml 启动php服务命令: /etc/init.d/php-fpm start 2.下载编译安装php 5.3.6&#xff1a; http://php.net/downloads.php yum install libxml2 libxml2-de…

人工智能的三大教父,谱写了一段关于勇气的寓言

来源&#xff1a;原理上世纪80年代末&#xff0c;还在加拿大攻读硕的尤舒亚本吉奥&#xff08;Yoshua Bengio&#xff09;被一个当时并不怎么流行的想法迷住了。那时&#xff0c;有少数从事人工智能研究的计算机科学家试图研发这样一种软件&#xff0c;这种软件可以大致模仿神经…

OpenCV——绘制基本图形

1、代码如下&#xff1a; #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp>using namespace cv;int main() {Size size(800,800);Size size2(300, 200);Mat img Mat::zeros(size, CV_8UC3);P…

汉堡包~~~

首次进行结对实验&#xff0c;我们采取的方式是进行分模块工作&#xff0c;这次实验我想起了网球王子里面的两个人打单打和双打的不同。 在这次结对实验&#xff0c;我们各自打单打&#xff0c;完成了一次出色的比赛&#xff0c;但是其中也有各种问题。相信以后能认识到“合作”…

动图|几张动图告诉你,工业机器人无所不能!

来源&#xff1a;机电微学堂1.最常见的汽车生产线车间 ☟2.准确抓住手机边缘 ☟3.装配机械手 ☟4.写毛笔字 ☟5.机器人参与上下料 ☟6.把次品投出 ☟7.喷涂机器人 ☟8.六轴机械手 ☟9.抓取机械手 ☟10.切香肠 ☟11.焊接 ☟12.点焊 ☟13.码垛机械手 ☟14.检测 ☟15.打台球 ☟16.…

银联在线支付---利用测试案例代码模拟支付应用(修改)

一、工程搭建 新建一个Web工程&#xff0c;命名为PayOnLine&#xff0c;把你下载好的案例代码拷贝到你的工程下&#xff0c;我的代码目录如下&#xff1a;acp_sdk.properties配置文件需要放在类根路劲下&#xff0c;里面的参数配置信息&#xff0c;下面是案例提供的配置提示&am…

图像处理-线性滤波-1 基础(相关算子、卷积算子、边缘效应)

这里讨论利用输入图像中像素的小邻域来产生输出图像的方法&#xff0c;在信号处理中这种方法称为滤波&#xff08;filtering&#xff09;。其中&#xff0c;最常用的是线性滤波&#xff1a;输出像素是输入邻域像素的加权和。1.相关算子&#xff08;Correlation Operator)定义&a…

力拎30磅!波士顿动力物流机器人Handle亮相,还会摆货架

来源&#xff1a;机器之心摘要&#xff1a;这是一个会堆箱子的机器人。自 2013 年被谷歌收购后&#xff0c;波士顿动力一直就是机器人公司中的「网红」&#xff0c;每次新视频的发布都能引起业内极大的关注。后来&#xff0c;因种种原因&#xff0c;波士顿动力于 2017 年被谷歌…