【从零到一】用HTML5+CSS+JavaScript实现一个属于自己的mp3免费音乐播放器 (4) JS交互功能(音乐进度条)

简介: 手把手教你用HTML5撸个免费播放器

播放进度条功能 🐞

获取进度条信息 🪲

我们在做这个功能的时候,一定要先梳理清楚HTML+CSS结构,你才知道如何去写JS效果

但不管怎么样,作为用户来说,第一时间肯定是点击或者在这个进度条上拖拽,实现快进/快退的效果~

这里我们先做点击事件, 当我们点击进度条,也就相当于点击了最外层的progressContainer元素

然后用一个叫getBoundingClientRect()方法来获取这个元素的信息~

小知识

getBoundingClientRect()方法DOM方法

用来获取元素在浏览器视口中的位置尺寸信息 它的返回值是一个DOMRect对象

注意: 视口一般指浏览器的可见区域, 但是不包括地址栏、工具栏这些地方~

我们可以先打印一下看看效果~

代码

//点击进度条某个位置之后计算进度条对应时间点
progressContainer.addEventListener('click', (e) => {
   
    //获取元素在视口坐标系中的位置和尺寸信息 返回对象
    var rect = progressContainer.getBoundingClientRect();
    console.log(rect);
});

如图

如果你仔细看,你就能看到不管我点击这个progressContainer元素哪里,打印出来的结果都是一样的数据~

如图

仔细展开DOMRect对象, 看一下里面的东西~ 具体如下

属性名 描述
left 元素左边框外侧视口左侧的距离
right 元素右边框外侧视口左侧的距离
top 元素上边框外侧视口顶部的距离
bottom 元素下边框外侧视口顶部的距离
width 元素的视觉宽度
height 元素的视觉高度
x 等同于 left
y 等同于 top

注意:

这里面的属性,主要我们要留意以下widthheight,它们并不是独立存储的,而是通过边界坐标计算~

width: 你其实可以理解为元素的 (右边框外侧视口左侧的距离 - 左边框外侧视口左侧的距离)

同理

height: 你其实可以理解为元素的 (下边框外侧视口顶部的距离 - 上边框外侧视口顶部的距离)

那么这意味着widthheight属性其实是元素实际占据的宽高,同时还包括内容、内边距、边框

计算用户点击进度 音频条跳转到当前播放位置 🍂

那么当我们点击这个外层容器的时候,获取了它本身的数据,我们才能够往下一步进行计算!

首先要计算出用户点击这个进度条上的位置

这里需要借助事件对象中的clientX属性, 它能获取到鼠标在整个浏览器视口中的水平坐标位置~

那么我们可以用这个鼠标水平坐标位置 - 元素左边框外侧到视口左侧的距离

理解:这里我们主要计算的就是,当用户点击进度条某个位置之后, 所要知道进度条对应时间点

如图

所以,我要知道的是当用户点击进度条时,先算出点击位置相对于进度条左侧的水平距离

再用这个距离去除以进度条总宽度得到点击位置占比,最后用该占比去乘以音频总时长得到当前音频播放位置

最后把计算出来的值赋值到音频播放位置,也就是currentTime属性, 让音频跳转到对应时间点即可!

那逻辑我们梳理清楚了,代码自然也就出来了!

代码如下

//点击进度条某个位置之后计算进度条对应时间点
progressContainer.addEventListener('click', (e) => {
   
    //获取元素在视口坐标系中的位置和尺寸信息 返回对象
    var rect = progressContainer.getBoundingClientRect();
    //计算当前点击的位置
    var clickX = e.clientX - rect.left;
    // 用这个clickX距离除以进度条总宽度得到点击位置占比,
    // 最后用这个占比乘以音乐的总时长,把计算出来的结果赋值到当前音频播放位置
    audio.currentTime = (clickX / rect.width) * audio.duration;//算出当前快进的音乐位置
    console.log(audio.currentTime);
    //同时播放音乐
    audio.play();
});

如图

如果你还不明白,这里我们来举个栗子:

音频总时长就像一整个10寸的蛋糕 , 比如音频总长10秒,蛋糕就10寸,

进度条的总宽度就对应这整个蛋糕的大小

当你点进度条的某个位置,就像在蛋糕上指了想吃的那一口,先算出你指的位置离蛋糕左边沿有几寸, 对应代码里 clickX结果

重点来了,因为我们的进度条是固定的,但是我们的音频的时长不固定,那么要如何计算才能自适应进度条呢?

所以再用这个几寸除以蛋糕总寸数(进度条总宽度),就能算出你要吃的位置占整个蛋糕的比例

比如点在6寸位置,6÷10=0.6,相当于是60%, 最后用这个比例乘以音频总时长 例如: 0.6 × 10秒 =6秒

那么音频就直接跳到6秒的位置播放,就像直接吃到蛋糕 60%的位置~

现在明白了吗?!

实时更新进度条状态 🌚

我们在上面把进度条的位置计算出来之后,还要让滑块动起来呀~

这里我们需要使用到一个叫timeupdate事件 它是属于HTML5 Audio/Video 事件,大家可以去查一下文档

如图

它的作用就是可以实时帮我们追踪目前的播放位置已更改之后,所发生的状态!~

也就是说一旦音频播放的位置发生了变化,那么这个事件就会被触发!

大家可以先想一下,什么情况下,播放位置会发生变化?

是不是当我们使用play()方法开始播放的时候,它的音频位置就是一直变化的~

我们可以先测试一下看看~

audio.addEventListener('timeupdate', () => {
   
    console.log(audio.currentTime);
});

如图

所以当我们开始播放音乐的时候,这个事件其实就已经默认一直在触发着!

那我们就可以利用这一点来让进度条的滑块动起来了!

计算方式如下:

(当前播放位置秒 / 当前音频的总秒) * 100;

逻辑分析:

音频播放时会不停触发这段代码,先确认音频有总时长~不然就不执行!

音频已播放时间 除以 音频总时长,再乘以100, 这样来算出百分之多少,

最后把进度条的宽度设为这个百分比!

当然我们这个事件函数在执行的时候,是不断执行的,所以这个百分比也会不断变化,

这样可以让我们的progressBar元素动起来,从而达到一种视觉效果~

具体代码

//使用timeupdate时间,实时更新进度条位置状态
//currentTime 设置或返回音频中的当前播放位置(以秒计) 
//duration 返回当前音频的长度(以秒计) 
audio.addEventListener('timeupdate', () => {
   
    if (!audio.duration) return;
    var progress = (audio.currentTime / audio.duration) * 100;  
    //最后把这个百分比值赋值给中间层
    //然后最内层的滑块样式圆形因为绝对定位与父元素,
    //会被中间层的动态宽度带过来!
    progressBar.style.width = progress+'%';  
});

当然这里可能有人会问,为什么不用像素,要用百分比?

用百分比是因为进度条宽度是相对的, 这样可以适配不同尺寸容器,按播放占比设百分比能精准对应音频播放进度,用像素那就要先算进度条总像素再乘占比,有点麻烦,并且适配性差!

那么做到这一步,我们的播放器也有一个大概的雏形了~

如图

相关文章
|
1月前
|
移动开发 前端开发 JavaScript
|
1月前
|
数据采集 Python
用异步爬虫加速你的Python数据采集
用异步爬虫加速你的Python数据采集
195 139
|
1月前
|
BI Python
告别繁琐拼接:用Python f-string点亮你的代码
告别繁琐拼接:用Python f-string点亮你的代码
211 139
|
1月前
|
人工智能 安全 调度
AI工程vs传统工程 —「道法术」中的变与不变
本文从“道、法、术”三个层面对比AI工程与传统软件工程的异同,指出AI工程并非推倒重来,而是在传统工程坚实基础上,为应对大模型带来的不确定性(如概率性输出、幻觉、高延迟等)所进行的架构升级:在“道”上,从追求绝对正确转向管理概率预期;在“法”上,延续分层解耦、高可用等原则,但建模重心转向上下文工程与不确定性边界控制;在“术”上,融合传统工程基本功与AI新工具(如Context Engineering、轨迹可视化、多维评估体系),最终以确定性架构驾驭不确定性智能,实现可靠价值交付。
370 41
AI工程vs传统工程 —「道法术」中的变与不变
|
13天前
|
人工智能 安全 机器人
OpenClaw傻瓜部署教程——阿里云无影云电脑OpenClaw(Clawdbot)安装图文流程
本教程详解如何在阿里云无影云电脑上一键部署OpenClaw(Clawdbot)机器人:3步分钟级启动,内置多款AI技能;支持钉钉、QQ、飞书等IM平台快速接入,仅需配置密钥即可唤醒;含百炼API对接、7×24运行设置及镜像变更指南。
516 4
|
5天前
|
人工智能 弹性计算 运维
小白也能上手!阿里云推出 OpenClaw 极速简易部署方案
阿里云OpenClaw是开源本地优先AI智能体平台,支持邮件处理、周报生成、资料查询、代码编写等任务,数据全留本地,保障隐私。技术小白也能通过阿里云轻量服务器“一键部署”,几分钟即可拥有专属AI数字员工。
105 15
|
3天前
|
人工智能 弹性计算 自然语言处理
2026年阿里云部署OpenClaw(Clawdbot)一键接入WhatsApp喂饭级教程
2026年,OpenClaw(前身为Clawdbot、Moltbot)凭借开源轻量化架构、跨平台无缝适配能力及强大的AI自动化执行功能,成为个人、跨境团队及中小企业搭建专属AI助手的首选工具。其核心优势在于无需复杂开发,即可快速对接WhatsApp等全球主流通信平台,实现“WhatsApp发送自然语言指令→阿里云服务器运行OpenClaw执行任务→结果实时反馈至WhatsApp”的闭环,适配跨境沟通、客户服务、远程协作、日常办公等多场景,彻底打破“AI工具与日常沟通脱节”的痛点。
87 5
|
6天前
|
人工智能 监控 API
Claude Code终于有仪表盘了:3条命令装个HUD,上下文用了多少一眼就知道
老金我最近用Claude Code,遇到一个特别烦的事。 写着写着,突然蹦出来一句"context window is getting full"。 然后AI就开始犯傻了——回答变短、逻辑变乱、之前说好的方案全忘了。 每次遇到这种情况,老金我都想骂人。 问题出在哪? Claude Code的终端界面,压根看不到上下文用了多少。 你只能输入 /context手动查,但谁写代码的时候
|
7天前
|
存储 安全 网络安全
2026年OpenClaw(Clawdbot)小白部署教程及服务器安全配置指南
OpenClaw(原Clawdbot)作为阿里云生态下的轻量级AI自动化代理工具,2026年版本在便捷部署的同时,也对服务器安全提出了更高要求——尤其是对接第三方平台、处理敏感业务数据时,服务器的权限管控、数据加密、网络防护直接决定使用安全。本文将先完整拆解阿里云OpenClaw一键部署的全流程,再从网络防护、权限管控、数据安全、日志审计四大维度,给出可落地的服务器安全配置方案,包含实操代码命令与安全加固技巧,兼顾部署便捷性与使用安全性。
395 4
|
1月前
|
人工智能 测试技术 开发者
AI Coding后端开发实战:解锁AI辅助编程新范式
本文系统阐述了AI时代开发者如何高效协作AI Coding工具,强调破除认知误区、构建个人上下文管理体系,并精准判断AI输出质量。通过实战流程与案例,助力开发者实现从编码到架构思维的跃迁,成为人机协同的“超级开发者”。
1678 106