利用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 流畅动画实现原理
Sep 08 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
Jun 08 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
Aug 15 Javascript
js计算任意值之间随机数的方法
Jan 16 Javascript
jQuery和AngularJS的区别浅析
Jan 29 Javascript
JQuery简单实现锚点链接的平滑滚动
May 03 Javascript
JavaScript实现自动消除按钮功能的方法
Aug 05 Javascript
JavaScript实现点击按钮就复制当前网址
Dec 14 Javascript
鼠标悬停小图标显示大图标
Jan 22 Javascript
Vue.js 2.0 和 React、Augular等其他前端框架大比拼
Oct 08 Javascript
js实现课堂随机点名系统
Nov 21 Javascript
vue中实现图片压缩 file文件的方法
May 28 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
推荐文章系统(一)
2006/10/09 PHP
GBK的页面输出JSON格式的php函数
2010/02/16 PHP
PHP大小写问题:函数名和类名不区分,变量名区分
2013/06/17 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
php实现图形显示Ip地址的代码及注释
2014/01/20 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
javascript基于DOM实现权限选择实例分析
2015/05/14 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
详细谈谈javascript的对象
2016/07/31 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
Vue管理系统前端之组件拆分封装详解
2020/08/23 Javascript
Python时区设置方法与pytz查询时区教程
2013/11/27 Python
PyMongo安装使用笔记
2015/04/27 Python
深入解析Python中的lambda表达式的用法
2015/08/28 Python
Python中logging实例讲解
2019/01/17 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
荷兰本土平价百货:HEMA
2017/10/23 全球购物
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
常用UNIX 命令(Linux的常用命令)
2015/12/26 面试题
学生会竞选自荐信
2013/10/12 职场文书
学校介绍信范文
2014/01/14 职场文书
《画》教学反思
2014/04/14 职场文书
小学生评语大全
2014/04/18 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python