当前位置:首页 > JavaScript

js实现歌词同步

2026-04-04 05:21:35JavaScript

歌词同步的基本原理

歌词同步的核心是将歌词文本与音频时间轴匹配,根据当前播放时间动态高亮显示对应歌词。通常需要解析LRC格式的歌词文件(包含时间标签),并监听音频播放进度。

解析LRC歌词格式

LRC歌词格式示例:

[00:00.00]歌曲名
[00:01.50]第一句歌词
[00:04.30]第二句歌词

解析函数示例:

js实现歌词同步

function parseLRC(lrcText) {
  const lines = lrcText.split('\n');
  const result = [];

  lines.forEach(line => {
    const timeTags = line.match(/\[(\d{2}):(\d{2})\.(\d{2})\]/g);
    const text = line.replace(/\[.*?\]/g, '').trim();

    if (timeTags && text) {
      timeTags.forEach(tag => {
        const minutes = parseInt(tag.match(/\[(\d{2}):/)[1]);
        const seconds = parseInt(tag.match(/:(\d{2})\./)[1]);
        const milliseconds = parseInt(tag.match(/\.(\d{2})\]/)[1]);
        const time = minutes * 60 + seconds + milliseconds / 100;
        result.push({ time, text });
      });
    }
  });

  return result.sort((a, b) => a.time - b.time);
}

实现歌词同步渲染

创建歌词渲染函数,根据当前播放时间更新显示:

function setupLyricSync(audioElement, lrcData, container) {
  let currentLine = 0;

  audioElement.addEventListener('timeupdate', () => {
    const currentTime = audioElement.currentTime;

    while (currentLine < lrcData.length - 1 && 
           currentTime >= lrcData[currentLine + 1].time) {
      currentLine++;
    }

    while (currentLine > 0 && currentTime < lrcData[currentLine].time) {
      currentLine--;
    }

    renderLyrics(lrcData, currentLine, container);
  });
}

function renderLyrics(lrcData, currentLine, container) {
  container.innerHTML = '';

  lrcData.forEach((line, index) => {
    const p = document.createElement('p');
    p.textContent = line.text;
    p.className = index === currentLine ? 'active' : '';
    container.appendChild(p);
  });
}

CSS样式增强

添加基础样式提升视觉效果:

js实现歌词同步

.lyrics-container {
  text-align: center;
  line-height: 2;
  font-size: 16px;
}

.lyrics-container p.active {
  color: #1db954;
  font-size: 18px;
  font-weight: bold;
}

完整使用示例

// 获取DOM元素
const audio = document.getElementById('audio-player');
const lyricsContainer = document.getElementById('lyrics-container');

// 模拟LRC歌词数据
const lrcText = `
[00:01.50]这是第一句歌词
[00:04.30]这是第二句歌词
[00:07.20]这是第三句歌词
`;

// 解析并设置同步
const lrcData = parseLRC(lrcText);
setupLyricSync(audio, lrcData, lyricsContainer);

高级优化建议

添加平滑滚动效果,使当前歌词始终保持在可视区域中间位置:

function renderLyrics(lrcData, currentLine, container) {
  container.innerHTML = '';
  let activeElement = null;

  lrcData.forEach((line, index) => {
    const p = document.createElement('p');
    p.textContent = line.text;
    if (index === currentLine) {
      p.className = 'active';
      activeElement = p;
    }
    container.appendChild(p);
  });

  if (activeElement) {
    activeElement.scrollIntoView({
      behavior: 'smooth',
      block: 'center'
    });
  }
}

处理无歌词情况

添加占位提示提升用户体验:

function renderLyrics(lrcData, currentLine, container) {
  if (!lrcData.length) {
    container.innerHTML = '<p class="no-lyrics">暂无歌词</p>';
    return;
  }
  // ...原有渲染逻辑
}

标签: 歌词同步js
分享给朋友:

相关文章

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现表单验证提交表单提交表单提交

js实现表单验证提交表单提交表单提交

表单验证与提交的实现 在JavaScript中实现表单验证并提交表单,可以通过监听表单的提交事件,进行验证后决定是否提交。以下是实现方法: 基础表单验证 通过监听表单的submit事件,阻止默认提交…

js实现音乐播放

js实现音乐播放

使用HTML5 Audio API实现音乐播放 在JavaScript中,可以通过HTML5的Audio API轻松实现音乐播放功能。以下是基本实现方法: // 创建Audio对象 const au…