利用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 相关文章推荐
showModelessDialog()使用详解
Sep 21 Javascript
JavaScript 字符串乘法
Aug 20 Javascript
读jQuery之五(取DOM元素)
Jun 20 Javascript
JS判断数组中是否有重复值得三种实用方法
Aug 16 Javascript
JavaScript省市联动实现代码
Feb 15 Javascript
全面理解JavaScript中的闭包
May 12 Javascript
jQuery中ScrollTo用法示例
Sep 04 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
Mar 02 Javascript
vue2.0 下拉框默认标题设置方法
Aug 22 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
Aug 11 Javascript
在vue中created、mounted等方法使用小结
Jul 21 Javascript
如何使用 vue-cli 创建模板项目
Nov 19 Vue.js
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
PHP编码规范之注释和文件结构说明
2010/07/09 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
js实现倒计时(距离结束还有)示例代码
2013/07/24 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
基于jQuery.i18n实现web前端的国际化
2018/05/04 jQuery
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
前端vue+elementUI如何实现记住密码功能
2020/09/20 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
Python解决鸡兔同笼问题的方法
2014/12/20 Python
Python实现批量下载文件
2015/05/17 Python
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
用Python进行简单图像识别(验证码)
2018/01/19 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
对Python信号处理模块signal详解
2019/01/09 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
2012/11/25 面试题
士力架广告词
2014/03/20 职场文书
文艺委员竞选稿
2015/11/19 职场文书