仿网易云网页版音乐播放器,实现歌词随歌曲进行滚动高亮

news/2025/2/22 20:57:17/

引言

 前几天在使用网易云网页版听歌时,看着那个页面的歌词随歌曲进行高亮,突然也想自己手动地去实现一下,于是呢,就仿照了网易云音乐的网页自己也写了个页面。效果图如下:

当然了,此处不做css的样式介绍,主要是想分享一下在做这个页面时遇到的关于处理歌词随歌曲进行滚动高亮的方式。

思路

 在实现歌词随歌曲进度进行自动高亮时,你需要清楚地知道你想要实现的效果时什么?再者,你需要知道如何设计容器,使得歌词可以有滚动的效果,并进行定位跟踪。

预计达到效果:

  • 在歌曲播放时,歌词可以根据歌曲播放的时间进行跟踪,并准确的显示出当前所对应的歌词。
  • 在进行歌曲快进时,歌词应该要定位到歌曲快进的地方,并高亮处理歌词。

设计

  • 首先,你需要设计两个容器,分别是用来做歌词的显示容器和歌词的存放容器的
  • 此处使用的<audio></audio>标签,我们可以通过标签获取歌曲的总时长,歌曲当前播放的位置,以及使用audio自带的timeUpdate事件进行监听,然后进行歌词的定位。
  • 歌词的样式在网上一般可以直接找到,需要有带时间格式的那种,然后我们自己进行解析歌词,以数组的方式进行存储json型数据
  • 通过timeUpdate事件循环判断当前歌曲播放的位置,并设置css高亮对应的歌词,同时,滚动一定距离,使得高亮的那行歌词始终显示在中间。
  • 当进行快进或快退时,也是根据当前歌曲的播放位置,使用timeUpdate事件进行监听,并高亮相应行的歌词,和滚动到对应的位置。

实现

  1. <audio>标签提供了一个监听音乐播放的事件,叫做timeUpdate,使用audio.addEventListener("timeUpdate",function(){})进行音乐播放的监听,然后我们的一切歌词监听都是以这个来方法来进行开发的。这是一个实时监听的方法,可以监听到每一毫秒。因为循环时会有一定时间的损失,所以此处我们用时间区间段去判别,并进行高亮。
  2. 在监听器中,我们每次都要循环变量解析完成的歌词,然后通过循环变量歌词数组,匹配对应的时间,匹配方式:歌曲播放时间大于当前歌词行对应的时间并且小于下一行歌词对应的时间,都进行高亮处理。
  3. 在进行歌词滚动的时候,我们一般是在前几行的时候只进行高亮处理,此处我们可以设置一个默认的不滚动的距离。当高亮的歌词的标签距离顶部的距离大于默认值时,此时就需要进行滚动了,所以此时要计算出要滚动的距离,滚动距离=滚动条长度/数组长度*当前数组的index -默认不滚动的距离,这个值及为即将滚动的距离。
  4. 这样在歌曲播放时,就可以高亮歌词了,快进或快退时也可以定位到相应的歌词。

代码

  1.  容器设置,设置两个<div>标签,其中关系为父子容器关系,父容器div的宽高为固定值,overflow设置为hidden,子容器的div设置overflow-y:auto;
    <audio src="渡红尘.mp3"></audio>
    <div class="music-content-lrc" >
     <div class="music-content-lrc-playing" id="lc">暂无歌词
     </div>
    </div>
  2. 使用<audio>标签的timeUpdate事件进行监听。
    //获取audio对象
    var audio = document.getElementById("audio");
    //设置监听事件
    audio.addEventListener("timeupdate",audioPlugns.timeUpdate);
  3. timeUpdate事件,audio的监听事件
    			timeUpdate:function(){//获得当前播放时间var ct = audio.currentTime;var du = audio.duration;if(audio.ended == true){var $this = $("#pp");$this.removeClass("music-play-playing").addClass("music-play-pause");//更改状态$this.attr("flag",0);//audio.currentTime = 0;audioPlugns.myRotate(0);	//循环模式audioPlugns.myMode();}audioPlugns.renderLrc(ct,du);}
  4. 歌词高亮渲染及定位
    			/*歌词渲染*/renderLrc:function(ct,du){var pList = $("#lc").find("p");$("#lc").find('p').removeClass('activated');//滚动条的高度var sc = document.getElementById("lc").scrollHeight;pList.each(function(index,element){var t = parseFloat($(this).attr("time")) - audioPlugns.delay;var pt = parseFloat($(this).prev().attr("time"));var nt = parseFloat($(this).next().attr("time"));if(ct >= t && ct <= nt){$(this).addClass("activated");//高亮var x = index*sc/pList.length - audioPlugns.fraction;//设置滚动距离audioPlugns.sh = x > 0 ? x : 0;}// 最后一行高亮,因为此处去掉了lrc中的所有空内容if(ct >= t && isNaN(nt)){$(this).addClass("activated");}})$("#lc").animate({"scrollTop":audioPlugns.sh},audioPlugns.freq); var cw= (ct/du *audioPlugns.duration + audioPlugns.now)+"px";$("#mc").css({"width":cw});$("#musicNow").html("<em>"+audioPlugns.buautifulTime(ct)+"</em> / "+audioPlugns.buautifulTime(du));		}

  5. 解析歌词
    /*解析歌词*/parseLrc:function(){var arr = audioPlugns.lrc.split("\n");var lrcArray = [];var html = "";for(var i=0;i<arr.length;i++){if(arr[i] != ""){var tempArray = arr[i].split("]");if(tempArray.length >1 ){var offset = tempArray[0].substring(1,tempArray[0].length-1);var text = tempArray[1];lrcArray.push({"offset":offset,"text":text});//去掉内容为空的数据if(text != ""){html+="<p time="+audioPlugns.parseTime(offset).toFixed(1)+">"+text+"</p>";}}}}$("#lc").html(html);return lrcArray;}

  6. 解析时间
    			/*解析时间*/parseTime:function(time){var tl = time.split(":");switch(tl.length){case 1 :return parseFloat(tl[0]);case 2:return parseFloat(tl[0]) * 60 + parseFloat(tl[1]);case 3:return parseFloat(tl[0]) * 3600 + parseFloat(tl[1]) * 60 + parseFloat(tl[2]);}}












http://www.ppmy.cn/news/552638.html

相关文章

iOS-纯代码编写本地音乐播放器AVAudioPlayer

背景&#xff1a;天天听着网易云音乐&#xff0c;想着哪天要是自己能做一个类似网易云音乐的播放器就好了(大三还没毕业)。在CocoaChina代码库里面逛了有些日子了&#xff0c;就干脆下载几个音乐播放器的demo来练练手。实践结果告诉我&#xff1a;一个完整的播放器确实要做很多…

Android音乐播放器制作(二 )点击歌曲实现播放

上次我们实现了把手机里的音频扫描到&#xff0c;然后放在list集合里面&#xff0c;用ListView展示在手机界面上&#xff0c;如果没有看过的可以去看看本人的博客&#xff1a;Android音乐播放器制作&#xff08;一&#xff09;扫描本地音乐显示在手机上 这次是在上一次的基础上…

给mp3播放器增加音乐波形显示功能

给mp3播放器增加音乐波形显示功能 2008-04-02 16:18:18| 分类&#xff1a; 应用编程 | 标签&#xff1a; |字号大中小 订阅 用过winamp的人都知道&#xff0c;winamp有一个音乐波形显示功能&#xff0c;当播放音乐的时候&#xff0c;有一些音乐波形跟着上下跳动&#xff0c;翩…

Android之一起制作简易唱片播放器

转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/50789666 本文出自&#xff1a;【顾林海的博客】 ####扯蛋篇 这几由于智齿又长了出来&#xff0c;痛了好几天还没好&#xff0c;吃饭又不能吃&#xff0c;加上公司里面操蛋的体制&#xff0c;感觉人活着…

使用jPlayer实现带广告功能和试听试看功能的MP4/MP3播放

先介绍一下jPlayer&#xff0c;这是个非常方便的免费开源播放器。 我觉得最大的优点是对各平台的兼容性。 支持的平台和浏览器&#xff1a; Windows: Chrome, Firefox, Internet Explorer, Safari, Opera Windows (legacy): IE6, IE7, IE8, IE9, IE10, IE11 OSX: Safari, Fir…

Java中播放mp3歌曲的代码

播放mp3歌曲的代码&#xff0c;需要到一个 jar 包&#xff0c;才能播放 先创建一个lib包&#xff0c;将播放歌曲所需的 jar 放入&#xff0c;之后选择 lib 包&#xff0c;右键选择靠下面的 Add as Library&#xff0c;这样 jar包就能用了&#xff0c;就会出现图片中的两个文…

空间透明跳舞FD播放器--彩色闪光(可自定义歌曲)

导读&#xff1a; 现在才知道不发贴一点人气没有 内容太多会比较慢请慢慢看一会就可以看到哦 慢慢看/帅&#xff01;帅&#xff01;帅&#xff01;帅&#xff01;帅&#xff01; ρs_這個卋堺.連呼吸都在説謊o│ 人吥到傷痕纍纍℡ 就吥會懂嘚後悔o~~ !- ο沒哊誰對吥起誰 只哊誰…

编写一个歌词随音乐播放滚动的播放器

提问&#xff1a;你平常都是如何听歌和下载歌曲的&#xff1f;官网&#xff1f;软件&#xff1f; 简介&#xff1a;作为计算机的爱好者&#xff0c;对计算的使用已经是非常熟悉了解的了&#xff0c;当然对编程语言也是有些许了解。听周围人说&#xff0c;无法听取某些歌曲或下…