实现带歌词同步高亮的主题音乐播放器需三步:一是解析LRC格式为时间戳数组,跳过元信息并确保升序;二是用transform translateY滚动歌词容器,使当前句居中并高亮;三是监听timeupdate事件,结合二分查找与requestAnimationFrame精准定位和渲染。
实现一个带歌词同步高亮的主题音乐播放器,关键在于三件事:让音频能播、让歌词有时间锚点、让当前句自动居中并高亮。不需要框架,纯 HTML5 + CSS3 + JavaScript 就能完成,重点是结构清晰、时间匹配准、视觉反馈及时。
LRC 是最常用也最易处理的歌词格式,每行形如 [01:23.45]这句歌词开始出现。你需要先把它转成 JS 可用的对象数组:
parseLRC() 函数,用正则提取 [mm:ss.xx] 并转为秒数(例如 01:23.45 → 83.45){ time: 83.45, text: "这句歌词开始出现" }
[ar:歌手名]、[ti:歌名]),只保留带时间戳的正文行findIndex() 查找会出错歌词不是逐句替换,而是整页滚动——像卡拉OK那样,当前句始终在视口中央,上下句自然露出或隐藏:
<ul class="lyrics"><li>第1句</li><li>第2句</li></ul> 结构,每句一个 <li>
overflow: hidden,<ul> 用 transform: translateY() 控制垂直偏移<li> 高度统一(比如 line-height: 2em),便于计算偏移量class="active",用颜色、字号、阴影等做视觉强调,不要只靠颜色变化核心逻辑在 timeupdate 事件里,但要注意性能和精度:
audio.addEventListener('timeupdate', handler),避免用 ontimeupdate(不易解绑)audio.currentTime 去匹配歌词数组,找到 time ≤ currentTime 的最大索引forEach)提升大数据量下的响应速度offset = -index * lineHeight + containerHeight / 2 - lineHeight / 2,确保当前句文字基线居中requestAnimationFrame 包裹偏移更新,避免卡顿真正好用的播放器,藏在那些小决定里:
input[type="range"] 的 change 和 input 事件都要监听