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 Validation插件防止重复提交表单的解决方法
Mar 05 Javascript
JavaScript jQuery 中定义数组与操作及jquery数组操作
Dec 18 Javascript
JavaScript事件处理的方式(三种)
Apr 26 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
Nov 23 Javascript
利用原生JS与jQuery实现数字线性变化的动画
Feb 24 Javascript
详解Vue2中组件间通信的解决全方案
Jul 28 Javascript
JavaScript for循环 if判断语句(学习笔记)
Oct 11 Javascript
Vue项目引发的「过滤器」使用教程
Mar 12 Javascript
vue视图不更新情况详解
May 16 Javascript
vue使用codemirror的两种用法
Aug 27 Javascript
简单了解vue中的v-if和v-show的区别
Oct 08 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
Apr 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 REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
PHP实现的带超时功能get_headers函数
2015/02/10 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
用Laravel轻松处理千万级数据的方法实现
2020/12/25 PHP
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
微信小程序签到功能
2018/10/31 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
Python入门篇之字符串
2014/10/17 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
使用python在本地电脑上快速处理数据
2017/06/22 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
Python预测2020高考分数和录取情况
2020/07/08 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
关于责任的演讲稿
2014/05/20 职场文书
学校督导评估方案
2014/06/10 职场文书
上课说话检讨书500字
2014/11/01 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
Django显示可视化图表的实践
2021/05/10 Python
python爬取某网站原图作为壁纸
2021/06/02 Python