视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何让音乐播放控制条在js中实现
2020-11-27 20:13:27 责编:小采
文档

播放区域

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

进度区域

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

  • 进度效果实现

  • 滑动效果实现

  • 首先进度实现,思路是:

  • 进度条有两个p构成:

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

  • 当点击进度条,获取鼠标点击该点的相对于最近的父类元素的x轴方向的偏移量

  • 偏移量就是内层p的实际宽度,设置背景色

  • 滑块的位置是设置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的值来实现的

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

    这里需要注意的是:

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

  • 实际上这也非常好计算:

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

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

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

  • 滑块效果有时不够自然顺畅

  • 音频文件时间的处理不够好

  • 开始时进度部分不是太好

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

    下载本文
    显示全文
    专题