js实现音乐播放控制条


Posted in Javascript onSeptember 09, 2017

前言

html5中提供audio标签, 该标签实现音频的播放,之前就一直对于音频以及视频播放比较感兴趣,一直想要自己实现一个音频和视频播放的模块,这也是本文章撰写的初衷,最近花了些时间实现了Audio播放控制条,从这个小的模块实现也学习到了以前没有接触到的知识。

Audio实现思路

浏览器原生提供的audio的样式比较简单而且不是太好看,原生提供的样式如下:

js实现音乐播放控制条

自实现的音乐播放控制条, 效果如下:

js实现音乐播放控制条

该音乐播放控制条实现的功能如下:

  • 音乐播放(最基本的)
  • 多首音乐的手动切换以及自动切换实现循环播放
  • 进度条点击播放进度的改变
  • 进度条拖动播放进度的改变
  • 音量点击改变
  • 音量拖动改变

具体的实现效果:

js实现音乐播放控制条

下面就具体功能的实现具体展开,实现的音乐播放控制进度条主要是学习使用,没有考虑兼容性,下面主要讲解每个功能的实现思路:

整体

整个音乐播放的控制底层还是采用浏览器audio标签来实现,调用audio api来实现整体的功能,下面是当前控制条的html结构:

<div class="audio">
 <audio></audio>
 <div class="audio-controller">
 <span class="audio-prev"></span>
 <span class="audio-state"></span>
 <span class="audio-next"></span>
 </div>
 <div class="audio-bar">
 <span class="audio-time-current"></span>
 <div class="audio-progress">
  <div>
  <div></div>
  <div></div>
  </div>
  </div>
 <span class="audio-time-duration"></span>
 </div>
 <div class="audio-volume">
 <span class="audio-volume-icon"></span>
 <div class="audio-volume-adjust">
  <div>
  <div></div>
  <div></div>
  </div>
 </div>
 </div>
</div>

audio-controller:是控制播放以及切换歌曲的区域
audio-bar:是时间以及歌曲进度的区域
audio-volume:是音量调节的区域

播放区域

该区域实现音乐的播放、暂停、切换(上一首、下一首),这部分其实没有什么需要讲解的,实际上就是audio api中play()、pause()来实现播放与暂停的,歌曲的切换就是数组元素的改变,修改src地址而已。

进度区域

该区域是整个模块中核心的部分,该区域主要的功能点是:

  • 进度效果实现
  • 滑动效果实现

首先进度实现,思路是:

1.进度条有两个div构成:

// 最外层作为进度条暗的长度区域
<div>
 // 最内层是实际表示进度
 <div></div>
</div>

js实现音乐播放控制条

2.当点击进度条,获取鼠标点击该点的相对于最近的父类元素的x轴方向的偏移量
3.偏移量就是内层div的实际宽度,设置背景色
4.滑块的位置是设置left的值,但是left的值是:偏移量-滑块宽度/2

滑动的实现,在该模块编写中没有采用html5中的拖放api,而是采用mousedown、mousemove、mouseup来实现的,具体

实现代码:

// 滑动效果
 bar.addEventListener('mousedown', function(e) {
 e.stopPropagation();
 // 获取滑块被选择时相对文档的初始X轴值
 options.clientX = e.clientX;
 // 偏移量
 options.left = this.offsetLeft;
 options.max = bgNode.offsetWidth - this.offsetWidth / 2;
 options.isDrag = true;
 });
 document.addEventListener('mousemove', function(e) {
 e.stopPropagation();
 if (options.isDrag) {
  let currentClientX = e.clientX,
  left = options.left,
  max = options.max,
  initClientX = options.clientX,
  barHalfWidth = bar.offsetWidth / 2,
  fgWidth = 0,
  // 设置要滑动到的位置点(x轴方向偏移量)
  to = Math.max(0, Math.min(max, left + (currentClientX - initClientX)));

  bar.style.left = to + 'px';
  if (to > barHalfWidth) {
  fgWidth = to + barHalfWidth;
  }
  fgNode.style.width = Math.max(0, fgWidth) + 'px';
  options.offsetX = Math.max(0, fgWidth);
 }
 });

 bgNode.parentNode.addEventListener('mouseup', function(e) {
 e.stopPropagation();
 if (options.isDrag) {
  // 绘制此时的进度
  tools.timeUpdateOrVolumeUpdate(options.offsetX, type);
  options.isDrag = false;
 }
 });

简单来说就是:

mousemove时获取当前鼠标在文档中的X轴方向位置 - 初始位置 + 元素最初的偏移量,动态改变left的值来实现的

进度实际就是div的宽度来显示的,动态的改变width的值以及滑块的left值来实现进度效果

这里需要注意的是:

当前进度条总宽度与音频总时间之间的比例关系,从而计算不同音频时间点对应的进度的长度,这是基础

实际上这也非常好计算:

比例:width / duration
指定时间的宽度:(width / duration) * currentTime

音量调节的实现与进度相似,主要是改变volume的实现。

下面就说说该模块中存在的问题:

滑块效果有时不够自然顺畅
音频文件时间的处理不够好
开始时进度部分不是太好

代码会上传到我的Github,该模块日后还需要进行改进。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery的键盘事件修改代码
Feb 24 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
Mar 11 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
Apr 17 Javascript
jquery定时滑出可最小化的底部提示层特效代码
Oct 02 Javascript
JavaScript立即执行函数的三种不同写法
Sep 05 Javascript
JavaScript模拟重力状态下抛物运动的方法
Mar 03 Javascript
Node.js刷新session过期时间的实现方法推荐
May 18 Javascript
不得不知的ES6小技巧
Jul 28 Javascript
一步一步实现Vue的响应式(对象观测)
Sep 02 Javascript
JS动态显示倒计时效果
Dec 12 Javascript
详解node和ES6的模块导出与导入
Feb 19 Javascript
前端vue如何使用高德地图
Nov 05 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
Sep 08 #Javascript
详解vue2 $watch要注意的问题
Sep 08 #Javascript
Express + Session 实现登录验证功能
Sep 08 #Javascript
Vue中组件之间数据的传递的示例代码
Sep 08 #Javascript
详解jquery插件jquery.viewport.js学习使用方法
Sep 08 #jQuery
JavaScript实现开关等效果
Sep 08 #Javascript
浅谈React Native 中组件的生命周期
Sep 08 #Javascript
You might like
php导出CSV抽象类实例
2014/09/24 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
Laravel实现批量更新多条数据
2020/04/06 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
讨论javascript(一)工厂方式 js面象对象的定义方法
2009/12/15 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
js/html光标定位的实现代码
2013/09/23 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
2016/05/31 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
2016/09/21 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
Rollup处理并打包JS文件项目实例代码
2018/05/31 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
python相似模块用例
2016/03/04 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
python使用folium库绘制地图点击框
2018/09/21 Python
Python绘制并保存指定大小图像的方法
2019/01/10 Python
python 实现Flask中返回图片流给前端展示
2020/01/09 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
2021/01/07 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
英国电器零售商:PRC Direct
2018/06/21 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
自荐信格式写作方法有哪些呢
2013/11/20 职场文书
美容院营销方案
2014/03/05 职场文书
六年级作文之预言作文
2019/10/25 职场文书
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
2021/06/07 Python
Pygame Draw绘图函数的具体使用
2021/11/17 Python