js仿微信语音播放实现思路


Posted in Javascript onDecember 12, 2016

最近看到有一个叫做“轻客小伙伴”的微信服务号,运营得挺不错的。
它是做英语线上培训的,由老师录制语音,配上图文,制作成课程。

js仿微信语音播放实现思路

花了不少时间写了大多数功能,但还没有优化成插件,直接发代码估计也看不懂,难应用。所以就主要说下实现的思路。
我的html结构是这样的

<div class="app-voice-you" voiceSrc="xx.mp3">
<img class="app-voice-headimg" src="xx.png" />
<div style="width: 60%;" class="app-voice-state-bg">
<div class="app-voice-state app-voice-pause"></div>
</div>
<div class="app-voice-time app-voice-unread">
1'6"
</div>
</div>
<!--语音播放控件-->
<audio id="audio_my" src="">
Your browser does not support the audio tag.
</audio>

核心功能就是语音播放,主要包括了以下几个功能点:

红点表明未听语音,语音听过后,红点会消失;

将“未读”状态的样式独立出来,“已读”的时候,把样式删除就行。结合本地存储处理就搞定了。

//this是点击的语音的document
var app_voice_time = this.getElementsByClassName("app-voice-time")[0];
  if(app_voice_time.className.indexOf("app-voice-unread") != -1){
    //存在红点时,把红点样式删除
    app_voice_time.className = app_voice_time.className.replace("app-voice-unread","");
  }

第一次听语音,会自动播放下一段语音;

这里主要是使用HTML5的audio控件的“语音播放完”事件
语音播放完,找到下一个语音,播放下一个语音

//语音播放完事件(PAGE.audio是audio控件的document)
 PAGE.audio.addEventListener('ended', function () {
   //循环获取下一个节点
  PAGE.preVoice = PAGE.currentVoice;
  var currentVoice = PAGE.currentVoice;
    while(true){
      currentVoice = currentVoice.nextElementSibling;//下一个兄弟节点
      //已经到达最底部
      if(!currentVoice){
        PAGE.preVoice.getElementsByClassName("app-voice-state")[0].className = "app-voice-state app-voice-pause";
        return false;
      }
      var voiceSrc = currentVoice.getAttribute("voiceSrc");
      if(voiceSrc && voiceSrc != ""){
        break;
      }
    }
    if(!PAGE.autoNextVoice){
      PAGE.preVoice.getElementsByClassName("app-voice-state")[0].className = "app-voice-state app-voice-pause";
      return false;
    }
    PAGE.currentVoice = currentVoice;
    //获取得到下一个语音节点,播放
      PAGE.audio.src = voiceSrc;
      PAGE.audio.play();
      PAGE.Event_PlayVoice();
}, false);

每段语音可以暂停、继续播放、重新播放;

这个比较简单,但是也是比较多逻辑。需要变换样式告诉用户,怎样是继续播放/重新播放。

播放中的语音有动画,不是播放中的语音则会停止动画。

这里主要是CSS3动画的应用

.app-voice-pause,.app-voice-play{
  height: 18px;
  background-repeat: no-repeat;
  background-image: url(../img/voice.png);
  background-size: 18px auto;
  opacity: 0.5;
}
 .app-voice-you .app-voice-pause{
  /*从未播放*/
  background-position: 0px -39px;
}
.app-voice-you .app-voice-play{
  /*播放中(不需要过渡动画)*/
  background-position: 0px -39px;
  -webkit-animation: voiceplay 1s infinite step-start;
  -moz-animation: voiceplay 1s infinite step-start;
  -o-animation: voiceplay 1s infinite step-start;
  animation: voiceplay 1s infinite step-start;
}
@-webkit-keyframes voiceplay {
  0%,
  100% {
    background-position: 0px -39px;
  }
  33.333333% {
    background-position: 0px -0px;
  }
  66.666666% {
    background-position: 0px -19.7px;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery插件之easing使用
Aug 19 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
Aug 23 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
Apr 14 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
Jan 10 Javascript
js二维数组排序的简单示例代码
Jan 24 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
Feb 17 Javascript
jquery序列化方法实例分析
Jun 10 Javascript
jQuery实用技巧必备(下)
Nov 03 Javascript
JS中对数组元素进行增删改移的方法总结
Dec 15 Javascript
详解基于vue-cli3快速发布一个fullpage组件
Mar 08 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
Dec 23 Javascript
Selenium执行JavaScript脚本的方法示例
Dec 31 Javascript
解析JavaScript数组方法reduce
Dec 12 #Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
Dec 12 #Javascript
JS双击变input框批量修改内容
Dec 12 #Javascript
jQuery中animate的几种用法与注意事项
Dec 12 #Javascript
Websocket协议详解及简单实例代码
Dec 12 #Javascript
jQuery中值得注意的trigger方法浅析
Dec 12 #Javascript
jQuery实现字符串全部替换的方法
Dec 12 #Javascript
You might like
php读取der格式证书乱码解决方法
2015/06/22 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
PHP+jQuery实现即点即改功能示例
2019/02/21 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
跟随鼠标旋转的文字
2006/11/30 Javascript
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
json原理分析及实例介绍
2012/11/29 Javascript
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
2016/11/03 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
jquery获取input输入框中的值
2019/11/13 jQuery
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
Python深入学习之上下文管理器
2014/08/31 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
Python学习笔记之集合的概念和简单使用示例
2019/08/22 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
上海方立数码笔试题
2013/10/18 面试题
北京天润融通.net面试题笔试题
2012/02/20 面试题
php优化查询foreach代码实例讲解
2021/03/24 PHP
运动会四百米广播稿
2014/01/19 职场文书
黄埔军校观后感
2015/06/10 职场文书
关于感恩的作文
2019/08/26 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP