html5audio标签播放进度怎么获取_currentTime属性用法说明【教程】

发布时间 - 2025-12-30 00:00:00    点击率:
audio.currentTime 返回秒数而非百分比,需用 (currentTime / duration) * 100 换算;须在 loadedmetadata 后获取 duration,监听 timeupdate 事件实时更新进度,设置 currentTime 可能触发 waiting,移动端兼容性差需特别处理。

audio.currentTime 返回的是秒数,不是百分比

获取播放进度最直接的方式是读取 currentTime 属性,但它返回的是当前已播放的**秒数(number 类型)**,不是 0–100 的百分比。你需要手动换算:

const audio = document.querySelector('audio');
const percent = (audio.currentTime / audio.duration) * 100;
注意:只有在 loadedmetadata 事件触发后,duration 才可靠;否则可能为 NaNInfinity

监听 timeupdate 事件才能实时获取进度

currentTime 是只读属性,不能靠轮询定时器去查——既低效又不准。正确做法是监听 timeupdate 事件:

audio.addEventListener('timeupdate', () => {
  console.log('当前时间:', audio.currentTime);
});
该事件在播放过程中自动高频触发(通常每 200–250ms 一次),但**不会在静音、暂停或加载中触发**。如果需要更精细控制(比如拖动进度条时同步显示),要额外监听 seekingseeked

设置 currentTime 可能触发加载和等待

currentTime 赋值会触发跳转,但行为取决于资源加载状态:

  • 若目标位置已缓冲,跳转几乎立即生效
  • 若未缓冲,浏览器会触发 waiting 事件,然后等数据加载完成才继续播放
  • 某些移动端浏览器(如 iOS Safari)在未用户手势触发的上下文中禁止自动 seek,会静默失败
建议配合 canplaycanplaythrough 使用,并捕获 error 事件:
audio.currentTime = 30;
audio.onseeked = () => console.log('跳转完成');
audio.onerror = () => console.error('跳转失败,可能未就绪或跨域限制');

移动端兼容性差的几个典型表现

在 iOS 和部分安卓 WebView 中,currentTime 的读写受限明显:

  • iOS Safari 下,未播放过的 audio 元素,duration 常为 NaN,需先调用 load() 或触发一次 play()(哪怕立刻 pause()
  • 微信内置浏览器对 timeupdate 频率做降频处理,有时几秒才触发一次
  • 部分安卓机在后台标签页中,timeupdate 会停止触发,即使音频仍在播放
实际项目中,不要依赖 currentTime 做高精度同步(比如歌词滚动),应优先用服务端时间戳 + 播放起始偏移来校准。


# html  # html5  # 微信  # 浏览器  # 安卓  # safari  # ai  # ios  # 跨域  # Error  # number  # 事件  # webview  # 跳转  # 的是  # 加载  # 几个  # 会在  # 又不  # 拖动  # 而非  # 能为  # 则可 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在香港服务器上快速搭建免备案网站?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何用y主机助手快速搭建网站?  如何基于云服务器快速搭建个人网站?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  如何快速打造个性化非模板自助建站?  公司门户网站制作流程,华为官网怎么做?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Laravel如何使用.env文件管理环境变量?(最佳实践)  怎么用AI帮你为初创公司进行市场定位分析?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  *服务器网站为何频现安全漏洞?  网站页面设计需要考虑到这些问题  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何快速搭建高效简练网站?  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何在IIS中配置站点IP、端口及主机头?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Python制作简易注册登录系统  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  javascript中的try catch异常捕获机制用法分析  详解jQuery中基本的动画方法  Android滚轮选择时间控件使用详解  在centOS 7安装mysql 5.7的详细教程  网易LOFTER官网链接 老福特网页版登录地址  在线制作视频网站免费,都有哪些好的动漫网站?  详解MySQL数据库的安装与密码配置  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  七夕网站制作视频,七夕大促活动怎么报名?  如何自定义建站之星模板颜色并下载新样式?  JavaScript如何实现错误处理_try...catch如何捕获异常?  如何在腾讯云服务器快速搭建个人网站?  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  🚀拖拽式CMS建站能否实现高效与个性化并存?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  如何在阿里云高效完成企业建站全流程?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程