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 相关文章推荐
javascript 对表格的行和列都能加亮显示
Dec 26 Javascript
Jquery 高亮显示文本中重要的关键字
Dec 24 Javascript
一个很有趣3D球状标签云兼容IE8
Aug 22 Javascript
jQuery中animate()方法用法实例
Dec 24 Javascript
Vue.js开发环境搭建
Nov 10 Javascript
前端js弹出框组件使用方法
Aug 24 Javascript
Jquery实现跨域异步上传文件总结
Feb 03 Javascript
基于BootStrap的前端分页带省略号和上下页效果
May 18 Javascript
利用C/C++编写node.js原生模块的方法教程
Jul 07 Javascript
vue实现拖拽效果
Dec 23 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
Aug 14 Javascript
JS异步宏队列微队列原理详解
Sep 09 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 无限级 SelectTree 类
2009/05/19 PHP
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
PHP递归删除目录几个代码实例
2014/04/21 PHP
PHP实现搜索相似图片
2015/09/22 PHP
laravel 判断查询数据库返回值的例子
2019/10/11 PHP
node.js 一个简单的页面输出实现代码
2012/03/07 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
使用FastCGI部署Python的Django应用的教程
2015/07/22 Python
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
Python配置mysql的教程(推荐)
2017/10/13 Python
你真的了解Python的random模块吗?
2017/12/12 Python
简单谈谈python基本数据类型
2018/09/26 Python
Python解析json时提示“string indices must be integers”问题解决方法
2019/07/31 Python
下载官网python并安装的步骤详解
2019/10/12 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
销售员自我评价怎么写
2013/09/19 职场文书
综合素质的自我鉴定
2013/10/07 职场文书
如何写一封打动人心的求职信
2014/02/17 职场文书
教师读书活动总结
2014/05/07 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python