首页
学习
活动
专区
圈层
工具
发布

js实现滚动歌词

滚动歌词是一种常见的网页特效,用于显示歌曲的歌词并随着音乐的播放而动态滚动。以下是实现滚动歌词的基础概念、优势、类型、应用场景以及具体的实现方法。

基础概念

滚动歌词通常涉及以下几个核心概念:

  1. 歌词数据:包含时间戳和对应的歌词文本。
  2. 时间同步:根据音乐的播放进度,实时更新显示的歌词。
  3. 滚动效果:通过CSS和JavaScript实现歌词的平滑滚动。

优势

  • 用户体验:增强用户的沉浸感,使听歌过程更加有趣。
  • 视觉效果:吸引用户的注意力,提升页面的整体美感。
  • 功能丰富:可以结合其他音乐播放功能,如进度条控制、播放/暂停按钮等。

类型

  • 单行滚动:只有一行歌词在滚动。
  • 多行滚动:多行歌词同时显示,并根据时间切换。
  • 垂直滚动:歌词从上到下依次显示。
  • 水平滚动:歌词从左到右依次显示。

应用场景

  • 音乐播放网站:如网易云音乐、QQ音乐等。
  • 个人博客或主页:增加个性化元素。
  • 活动现场大屏:配合现场音乐播放,营造氛围。

实现方法

以下是一个简单的JavaScript实现滚动歌词的示例:

HTML结构

代码语言:txt
复制
<div id="lyrics-container">
  <div id="lyrics"></div>
</div>
<audio id="audio" src="your-music-file.mp3" controls></audio>

CSS样式

代码语言:txt
复制
#lyrics-container {
  height: 300px;
  overflow: hidden;
  position: relative;
}

#lyrics {
  position: absolute;
  width: 100%;
  text-align: center;
}

JavaScript代码

代码语言:txt
复制
const audio = document.getElementById('audio');
const lyricsContainer = document.getElementById('lyrics-container');
const lyricsElement = document.getElementById('lyrics');

const lyricsData = [
  { time: 0, text: "Verse 1" },
  { time: 10, text: "Line 1 of Verse 1" },
  { time: 20, text: "Line 2 of Verse 1" },
  // Add more lyrics as needed
];

function updateLyrics() {
  const currentTime = audio.currentTime;
  let currentLyricIndex = 0;

  for (let i = 0; i < lyricsData.length; i++) {
    if (currentTime >= lyricsData[i].time) {
      currentLyricIndex = i;
    } else {
      break;
    }
  }

  lyricsElement.innerHTML = lyricsData[currentLyricIndex].text;
  lyricsElement.style.top = `${currentLyricIndex * 30}px`; // Adjust the height as needed
}

audio.addEventListener('timeupdate', updateLyrics);

解释

  1. HTML结构:创建一个容器来显示歌词,并嵌入一个音频元素。
  2. CSS样式:设置容器的样式,使其具有固定的高度并隐藏溢出的内容。
  3. JavaScript代码
    • 获取音频元素和歌词容器。
    • 定义歌词数据数组,每个元素包含时间戳和对应的歌词文本。
    • timeupdate事件中更新歌词显示,根据当前播放时间找到对应的歌词并更新其位置。

常见问题及解决方法

  1. 歌词不同步
    • 确保歌词数据的时间戳准确。
    • 使用requestAnimationFrame优化更新频率。
  • 滚动效果不流畅
    • 使用CSS过渡效果(如transition)平滑滚动。
    • 减少DOM操作,尽量在一次更新中完成所有必要的DOM更改。

通过以上方法,你可以实现一个基本的滚动歌词功能,并根据需要进行扩展和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

基于Qt的网络音乐播放器(五)实现歌词滚动显示

大体思路就是这样,然后具体实现的时候,还是有许多细节需要注意的,遇到再说,还有就是上面提到的函数等等,在前面的文章中已经建立,下面的代码是直接写实现,如果不知道在哪里写,可查看前面几篇文章。 ?...,label_21匹配当前时间显示的歌词,并且把该歌词前面的歌词和后面的歌词分别发送给其他对应的标签。...这样就实现了动态效果。...4.总结 虽然代码很少,但是完成这个还是用了很长时间实现,反复修改,反复崩溃,没实现前,觉得这个功能,要是能实现多好,实现了后又觉得自己写的太简单了,而且效果有一点僵硬,并没有人家QQ 酷狗啊什么,歌词是慢慢往上滑...学习就是这样,来回不断重复,对待问题的看法,逻辑的推理,思维的跳跃,从不会到实现,再到不满足再实现。可执行文件不是你的财富,修改过程中的经验才是,我是花狗,一名苟且偷生的大专生,我们下篇见。

2.7K32
  • 歌词显示控件的实现(上)——歌词解析

    考虑到歌词显示控件涉及到歌词解析,自定义控件的实现等等诸多方面,可能文章的篇幅上会比较冗长,同时也为了方便自己和码友们能够根据自己的需求和爱好各取所需,将《歌词显示控件的实现上》这篇文章分成上、下两篇,...分别是《歌词显示控件的实现上——歌词解析》和《歌词显示控件的实现下——歌词展示自定义View》。...ok,开始切入正题 01 — 了解歌词文件结构 写过音乐播放器的朋友可能都了解过歌词文件的规范格式,既然是歌词显示的控件,就必然需要清楚地了解歌词文件的组成规范,才能准确无误的解析歌词文件,得到我们想要的信息...了解清楚歌词文件结构,我们就能对症下药: 02 — 开始解析 既然了解了歌词文件的组成部分,那么解析歌词文件也就不难,就是简单的文件内容读取: 1、首先获取*.lrc歌词文件的二进制流InputStream...下面就是实现歌词文件的解析工作: 1、实体类 首先,需要准备两个类主要用于歌词解析结果的缓存: LineInfo:歌词行信息:包含行开始时间和歌词行内容 LyricInfo:歌词信息:包含标题、歌手、专辑等等

    2.2K20

    JS魔法堂:通过marquee标签实现信息滚动效果

    根据信息滚动效果我们可以有很多的实现方式,但HTML自带的 marquee标签 是其中一个较简单的实现方式。下面记录一下,供日后查阅。...值alternate 表示在两端之间来回滚动; 值scroll 表示由一端重复滚动到另一端,为默认值; 值slide 表示由一端不重复地滚动到另一端。  direction , 滚动的方向。...loop ,滚动的次数。默认值-1表示一直滚动。 scrollAmount , 设置一次滚动的步长。默认值为6, 当设置为负数时将采用默认值进行滚动。...scrollDelay ,设置两次滚动间的延迟时间(单位:ms)。默认值为85,当设置为负数时将采用默认值进行滚动。..."> 滚动的消息 四、总结                                     当我们只需实现当条特别公告等简单信息滚动效果时,marquee标签是一个很不错的选择

    4.3K70

    js实现单张或多张图片持续无缝滚动

    背景: 想要实现图片持续滚动,既然使用js,就千万不要加css动画、过渡等相关样式,如果想要滚动的平滑一下,可以一像素一像素的感动,则很平滑,如果加了过渡动画,当图片重置为0时,会有往回倒的动画效果,跟预期不符...原理: 图片滚动原理同图片轮播原理,同样也适用于文字滚动等一系列滚动,通过复制最后一张图片或最后一堆文字插入第一行,或复制第一张图片或一堆文字插入在结尾,来实现无缝拼接,前提:1、必须是没有设置过渡动画的...,2、重置为0的时候与当前已经滚动到的高度对于图片的位置而言肉眼看上去没变化。...实现: html主要包含三块: 1、最外层盒子,用来展示滚动图的区域,overflow:hidden; 2、滚动的盒子,主要改变该盒子的定位值,来实现滚动,里面包含所有要滚动的图片或文字 3、包含图片或文字的盒子...代码: class Roll { constructor(opts) { this.elem = opts.elem; // 图片包含滚动长度的元素的 this.elemBox

    8.3K10

    JS简易整页滚动

    fullPage超简易版本 1.知识点 JS 滚动监听事件 JS 移动端touch监听事件 函数节流 DOM操作 2.示例GIF ?...CSS html, body设置 overflow 为 hidden, 让视图中只包括一个分页;设置滑动分页的长宽都是 100%; 外部容器设置 transition 过渡效果, 并设置为相对定位, 滚动是修改外部容器的...Top 值, 实现滚动效果. html, body { padding: 0; margin: 0; overflow: hidden; } .page-container { position...向下滚动时, 当 currentPosition 比 -整体分页高度 大的时候(绝对值相比小的时候), 向下滚动;向上滚动时, 当 currentPosition 大于 0 的时候, 向上滚动. /...滚动事件firefox与其他浏览器的事件不同, 所以需要进行判断. deltaY大于0的时候, 想下滚动; 反之, 向上滚动. var handlerWheel = throttle(scrollMove

    17.2K31

    JS判断滚动条是否停止滚动

    背景:昨天一个同事有种需求,有一个展示数据区域的div,带滚动条,当滚动条滚动时,需要向后台发请求,计算数据,再拿到前台展示。        ...分析:由于数据量级别较大,所以当滚动条滚动时,如果时时向后台发请求,对服务器和浏览器都造成巨大的压力。想到的解决方案是,当滚动条停止时,再去发请求计算数据。...那么问题来了,如何判断滚动条是否停止了呢?        解决:搜索了一下,js本身是无法判断滚动条是在滚动状态还是停止状态,只有通过其它方式了。...后来想到的思路是当滚动条滚动的时候,发起一个定期执行的方法,并记录一次当前滚动条到顶部的距离,这个方法中判断此时滚动条到顶部的距离是否和上次记录的相等,如果相等,那么说明停止滚动了,不相等,还在滚动。...-- // 让浏览器出现滚动条 for(var i = 0; i < 100; i++) { document.write(""); } var topValue = 0,//

    19.5K00
    领券