利用jquery实现实时更新歌词的方法


Posted in Javascript onJanuary 06, 2017

前言

最近自己写了个移动端音乐播放器,用了很多框架,也踩了很多坑,感觉比较复杂的就是计算歌词实时播放了,所以想着大概给整理了一下,分享出来,有问题的话朋友们可以指出,有需要的朋友们也可以学习学习。

布局

(歌词都是后台数据获取,方便理解我把所有歌词都一一列出来)

<section>
 <figure>
 <img id="animat" src="img/img3.jpg"/>
 </figure>
 <div class="lyric">
 <div class="lrc-list">
  <p data-play="audio-t-0" data-index="0">逃跑计划 </p>
  <p data-play="audio-t-1" data-index="1">一万次悲伤 </p>
  <p data-play="audio-t-2" data-index="2">oh honey </p>
  <p data-play="audio-t-3" data-index="3">我脑海里全都是你 </p>
  <p data-play="audio-t-8" data-index="4">oh无法抗拒的心情 </p>
  <p data-play="audio-t-13" data-index="5">难以呼吸</p>
  <p data-play="audio-t-15" data-index="6">tonight </p>
  <p data-play="audio-t-17" data-index="7">是否又要错过一个夜晚</p>
  <p data-play="audio-t-23" data-index="8">是否还要掩饰最后的期待 </p>
  <p data-play="audio-t-29" data-index="9">oh tonight </p>
  <p data-play="audio-t-30" data-index="10">一万次悲伤 </p>
  <p data-play="audio-t-33" data-index="11">依然会有意义</p>
  <p data-play="audio-t-35" data-index="12">我一直在最温暖的地方等你</p>
  <p data-play="audio-t-40" data-index="13">似乎只能这样停留一个方向</p>
  <p data-play="audio-t-46" data-index="14">已不能改变</p>
  <p data-play="audio-t-51" data-index="15">每一颗眼泪是遗忘的光 </p>
  <p data-play="audio-t-57" data-index="16">最昏暗的地方也变得明亮</p>
  <p data-play="audio-t-61" data-index="17">我奔涌的暖流寻找你的海洋 </p>
  <p data-play="audio-t-67" data-index="18">我注定这样</p>
  <p data-play="audio-t-73" data-index="19">oh honey </p>
  <p data-play="audio-t-75" data-index="20">你目光里充满忧郁 </p>
  <p data-play="audio-t-81" data-index="21">就像经历一遍飞行难以逃避</p>
  <p data-play="audio-t-87" data-index="22">tonight </p>
  <p data-play="audio-t-89" data-index="23">是否还要错过这个夜晚</p>
  <p data-play="audio-t-91" data-index="24">是否还要熄灭所有的期待</p>
  <p data-play="audio-t-95" data-index="25">tonight</p>
  <p data-play="audio-t-100" data-index="26">一万次悲伤</p>
  <p data-play="audio-t-102" data-index="27">依然会有意义</p>
  <p data-play="audio-t-106" data-index="28">我一直在最后的地方等你</p>
  <p data-play="audio-t-109" data-index="29">似乎只能这样</p>
  <p data-play="audio-t-114" data-index="30">停留一个方向</p>
  <p data-play="audio-t-120" data-index="31">已不能改变</p>
  <p data-play="audio-t-123" data-index="32">每一颗眼泪是遗忘的光</p>
  <p data-play="audio-t-130" data-index="33">最昏暗的地方也变得明亮</p>
  <p data-play="audio-t-135" data-index="34">我奔涌的暖流寻找你的海洋</p>
  <p data-play="audio-t-141" data-index="35">我注定这样</p>
  <p data-play="audio-t-155" data-index="36">一万次悲伤 </p>
  <p data-play="audio-t-189" data-index="37">依然会有意义</p>
  <p data-play="audio-t-192" data-index="38">我一直在最后的地方等你</p>
  <p data-play="audio-t-197" data-index="39">似乎只能这样</p>
  <p data-play="audio-t-200" data-index="40">停留一个方向 </p>
  <p data-play="audio-t-204" data-index="41">已不能改变</p>
  <p data-play="audio-t-208" data-index="42">每一颗眼泪是遗忘的光</p>
  <p data-play="audio-t-213" data-index="43">最昏暗的地方也变得明亮</p>
  <p data-play="audio-t-218" data-index="44">我奔涌的暖流寻找你的海洋</p>
  <p data-play="audio-t-225" data-index="45">我注定这样</p>
  <p data-play="audio-t-236" data-index="46">oh honey </p>
  <p data-play="audio-t-238" data-index="47">我脑海里全都是你 </p>
  <p data-play="audio-t-243" data-index="48">oh无法抗拒的心情 </p>
  <p data-play="audio-t-247" data-index="49">难以呼吸</p>
 </div>
 </div> 
</section>

注意 : 给每一句歌词都自定义两个属性,data-play属性为了计算什么时候显示该句歌词,它的属性值audio-t- “num” 是表示这句歌词在num秒的时候高亮显示; data-index为了计算什么时候歌词往上走,就按顺序定义就行。

以下是静态效果图:

利用jquery实现实时更新歌词的方法

(效果图没有歌词是因为左滑才出现歌词)

左滑出现歌词

$('figure').on("swipeLeft" , function(){
 $('figure').css('display' , 'none');
 $('.lyric').css('display' , 'block').addClass("animated slideInRight");
})
$('.lyric').on("swipeRight" , function(){
 $('.lyric').css('display' , 'none');
 $('figure').css('display' , 'block').addClass("animated slideInLeft");
})

歌词出现:

利用jquery实现实时更新歌词的方法

重点来了

function lyricPlay(){
 var timer2;
 var $cur = null;
 var $lrcbox = $(".lrc-list");
 $lrcwrap = $lrcbox.parent();
 clearInterval(timer2);
 timer2 = setInterval( function(){
 var time = Math.ceil( $('audio')[0].currentTime); //currentTime 是获取音乐实时播放时间
 $cur = $("audio-t-"+time).selector;//拿到自定义属性data-play
 $('p' , $lrcbox ).each(function(){ //循环拿到p
  var playT = $(this).data('play');//当前播放元素属性值
  if( playT == $cur ){ 
   //给符合条件歌词加上高亮并删除兄弟元素的class名
   $(this).stop().addClass('acitve').siblings().removeClass('acitve');
  }else{
   return;
  }
  var index = $(this).data("index"); //当前元素下标
  var lineHeight =$(this).height() ; //一行歌词高度
  var boxHeight = $lrcwrap.height(); //歌词显示区域高度
  var screensize = boxHeight / lineHeight; //一屏显示多少句歌词
  var half = Math.floor(screensize / 2); //半屏歌词数量
  //当前歌词超过半屏
  if(index > half){
  //计算出超过的高度 减去 一行歌词的高度
  var top = (half - index) * lineHeight + lineHeight
  $lrcbox.css({
   "top" : parseInt(top) + "px"
  });
  }
 })
 } , 1000)
}
lyricPlay();

效果如下:

利用jquery实现实时更新歌词的方法

总结

以上就是这篇文章的全部内容了,当然以上方法都只是我自己的想法,如果不足之处欢迎大家指点,希望本文的内容对大家能有一定的帮助。

Javascript 相关文章推荐
JavaScript window.document的属性、方法和事件小结
Oct 24 Javascript
关于js注册事件的常用方法
Apr 03 Javascript
jquery获取div距离窗口和父级dv的距离示例
Oct 10 Javascript
js数组去重的常用方法总结
Jan 24 Javascript
JavaScript 事件入门知识
Apr 13 Javascript
jQuery CSS3自定义美化Checkbox实现代码
May 12 Javascript
jquery获取select,option所有的value和text的实例
Mar 06 Javascript
Node.js实现文件上传的示例
Jun 28 Javascript
微信小程序实现多选功能
Nov 04 Javascript
详解vue挂载到dom上会发生什么
Jan 20 Javascript
webpack4 optimization使用总结
Nov 10 Javascript
Node.js中console.log()输出彩色字体的方法示例
Dec 01 Javascript
Ajax 加载数据 练习代码
Jan 05 #Javascript
JavaScript中Math对象的方法介绍
Jan 05 #Javascript
微信小程序 Tab页切换更新数据
Jan 05 #Javascript
微信小程序 省市区选择器实例详解(附源码下载)
Jan 05 #Javascript
微信小程序 Template详解及简单实例
Jan 05 #Javascript
echarts3 使用总结(绘制各种图表,地图)
Jan 05 #Javascript
微信小程序 数组中的push与concat的区别
Jan 05 #Javascript
You might like
松下Panasonic RF-B65电路分析
2021/03/02 无线电
山进SANGEAN ATS-909X电路分析
2021/03/02 无线电
基于mysql的论坛(1)
2006/10/09 PHP
在数据量大(超过10万)的情况下
2007/01/15 PHP
一个简单php扩展介绍与开发教程
2010/08/19 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
JS完成代码前最好对其做5件事
2013/04/07 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
2016/04/29 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
2018/12/09 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
python实现单向链表详解
2018/02/08 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
什么是组件架构
2016/05/15 面试题
小学节能减排倡议书
2014/05/15 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
民政局个人整改措施
2014/09/24 职场文书
2014年宣传工作总结
2014/11/18 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技