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 相关文章推荐
基于jsTree的无限级树JSON数据的转换代码
Jul 27 Javascript
通过DOM脚本去设置样式信息
Sep 19 Javascript
JS文本框默认值处理详解
Jul 10 Javascript
使用js获取图片原始尺寸
Dec 03 Javascript
jQuery动画效果相关方法实例分析
Dec 31 Javascript
javascript弹出窗口中增加确定取消按钮
Jun 24 Javascript
bootstrap datepicker限定可选时间范围实现方法
Sep 28 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
Dec 02 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
Mar 06 Javascript
Node.js利用debug模块打印出调试日志的方法
Apr 25 Javascript
深入理解vue Render函数
Jul 19 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
Dec 07 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实现支持中文的文件下载功能示例
2017/08/30 PHP
点击下载链接 弹出页面实现代码
2009/10/01 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
js清空表单数据的两种方式(遍历+reset)
2014/07/18 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
jQuery验证插件validate使用详解
2016/05/11 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
详解vue-cli3使用
2018/08/14 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
vue+AI智能机器人回复功能实现
2020/07/16 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS TNC
2018/03/30 DOTA
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
Python中每次处理一个字符的5种方法
2015/05/21 Python
python中Switch/Case实现的示例代码
2017/11/09 Python
Python中生成器和迭代器的区别详解
2018/02/10 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
Python如何telnet到网络设备
2021/02/18 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
杰夫·班克斯男士服装网上商店:Jeff Banks
2019/10/24 全球购物
院领导写的就业推荐信
2014/03/09 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
2015年党员自评材料
2014/12/17 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
农村婚庆主持词
2015/06/29 职场文书
2016保送生自荐信范文
2016/01/29 职场文书
python实现web邮箱扫描的示例(附源码)
2021/03/30 Python