audioPlay.vue 10.3 KB
<template>
    <div class="audioOff">
      <div class="ofplayBox">
        <audio id="audio" :src="src" @canplay ="onplay" @play="playOn"></audio>
        <div class="isPlayImg">
          <!--开始播放-->
          <img v-if="!playflg" @click="play()" :src="playUrl" />
          <!--暂停-结束播放-->
          <img v-if="playflg" @click="stop()" :src="stopUrl" />
        </div>
        <!--slider进度条-->
        <div class="progress" @mousedown="stopTime()">
          <input type="range" min="0" :max="offset" v-model="rangeValue"   />
        </div>
        <div class="duration"><span>{{starttime}}</span>/<span class="right-timer">{{duration}}</span></div>
        <div class="cover"></div>
      </div>
    </div>
</template>

<script>
  import {getwechatParam} from "../../service/api";
  import stopUrl from '../../assets/mould/look1/rs.png'
  import playUrl from '../../assets/mould/look1/rp.png'
  //--创建页面监听,页面加载完毕--触发音频播放

  export default {
    name: 'audioMsg',
    props:[
      'src',
      'autoPlay'
    ],
    data() {
      return {
        stopUrl:stopUrl,
        playUrl:playUrl,
        //这首歌时间有点长 大家测试的时候可以换一个短点的MP3文件
        playflg: false,
        rangeValue: 0,
        starttime: '00:00', //正在播放时长
        duration: '00:00', //总时长
        offset: 0,
        timer:null,
        first:true
      }
    },
    mounted(){
      console.log('触发')
      this.play();
      if(this.autoPlay){
        let that = this;
        document.addEventListener('DOMContentLoaded', function () {
          if(that.first){
            function audioAutoPlay() {
              var musicEle0 = document.getElementById('audio');
              musicEle0.play();
            }
            audioAutoPlay();
          }
        });
        //--创建触摸监听,当浏览器打开页面时,触摸屏幕触发事件,进行音频播放
        document.addEventListener('touchstart', function () {
          if(that.first){
            function audioAutoPlay() {
              var musicEle0 = document.getElementById('audio');
              musicEle0.play();
            }
            audioAutoPlay();
          }
        });
        this.autoPlayAudio();
        this.play();
        getwechatParam({
          api_list:'onMenuShareAppMessage',
          url:window.location.href.split('#')[0]
        }).then(res=>{
          let that = this;
          wx.config({
            debug: false,
            appId: res.appId,
            timestamp: parseInt(res.timestamp),
            nonceStr: res.nonceStr,
            signature: res.signature,
            jsApiList: res.jsApiList
          });
          this.autoPlayAudio();
          this.play();
        });
        this.$nextTick(()=>{
          this.first = false
        })
      }
    },
    methods: {
      stopTime(){
        clearInterval(this.timer);
      },
      autoPlayAudio(){
        let that = this;
        let voice =  document.querySelector('#audio');
        document.addEventListener("WeixinJSBridgeReady",function(){
          that.play();
        },false);
        wx.ready(function () {
          that.$nextTick(()=> {
            wx.ready(function () {
              that.$nextTick(()=>{
                if (typeof WeixinJSBridge === "object" && typeof WeixinJSBridge.invoke === "function") {
                  voice.play();
                } else {
                  //監聽客户端抛出事件"WeixinJSBridgeReady"
                  if (document.addEventListener) {
                    document.addEventListener("WeixinJSBridgeReady", function(){
                      voice.play();
                    }, false);
                  } else if (document.attachEvent) {
                    document.attachEvent("WeixinJSBridgeReady", function(){
                      voice.play();
                    });
                    document.attachEvent("onWeixinJSBridgeReady", function(){
                      voice.play();
                    });
                  }
                }
                wx.ready(()=>{
                  voice.play();
                })
              })
            })
          })
        })
      },
      getDuration(){
        let min = null;
        if(parseInt(this.offset / 60)<10){
          min = '0' + parseInt(this.offset / 60)
        }else{
          min = parseInt(this.offset / 60)
        }
        let sec = parseInt(this.offset % 60);
        if (sec < 10) {
          sec = "0" + sec;
        }
        this.duration = min + ':' + sec;   /*  00:00  */
      },
      onplay(){
        let audio = document.querySelector('#audio');
        this.offset = Math.ceil(parseInt(audio.duration));
        this.$nextTick(()=>{
          this.getDuration();
        })
      },
      playOn(){
        let audio = document.querySelector('#audio');
        this.playflg = true;
        this.timer = setInterval(() => {
          let min = null;
          if(parseInt(audio.currentTime / 60)<10){
            min = '0' + parseInt(audio.currentTime / 60)
          }else{
            min = parseInt(audio.currentTime / 60)
          }
          let sec = parseInt(audio.currentTime % 60);
          if (sec < 10) {
            sec = "0" + sec;
          }
          this.starttime = min + ':' + sec;   /*  00:00  */
          this.rangeValue = parseInt(audio.currentTime);
          if(this.rangeValue === this.offset) {
            this.rangeValue=0;/*播放结束后进度条归零*/
            this.starttime='00:00'; /*播放结束后时间归零*/
            this.stop();
            clearInterval(this.timer)
          }
        }, 1000)
      },
      //开始播放
      play() {

        let audio = document.querySelector('#audio');
        audio.play();
      },
      //暂停-结束
      stop() {
        let audio = document.querySelector('#audio');
        audio.pause();
        this.playflg = false
      },
    },
    watch:{
      'rangeValue'(value,value2){
        let audio = document.querySelector('#audio');
        if(Math.abs(value - value2) > 2){
          this.timer = setInterval(() => {
            let min = null;
            if(parseInt(audio.currentTime / 60)<10){
              min = '0' + parseInt(audio.currentTime / 60)
            }else{
              min = parseInt(audio.currentTime / 60)
            }
            let sec = parseInt(audio.currentTime % 60);
            if (sec < 10) {
              sec = "0" + sec;
            }
            this.starttime = min + ':' + sec;   /*  00:00  */
            this.rangeValue = parseInt(audio.currentTime);
            if(this.rangeValue == this.offset) {
              this.rangeValue=0;/*播放结束后进度条归零*/
              this.starttime='00:00'; /*播放结束后时间归零*/
              this.stop()
              clearInterval(this.timer)
            }
          }, 1000);
          audio.currentTime = value;
        }
      }
    }

  }
</script>

<style lang="less" scoped>
  @import "../../util/public";
  input[type=range] {
    -webkit-transform: translateZ(0);
    transform: translateZ(0);
    -webkit-appearance: none;
    display: flex;
    width: 90%;
    padding: 0 5 * @toVw;
    border-radius: 10px; /*这个属性设置使填充进度条时的图形为圆角*/
  }
  input[type=range]::-webkit-slider-thumb {
    -webkit-appearance: none;
  }
  input[type=range]::-webkit-slider-runnable-track {
     height: 2 * @toVw;
    background: #999999;
    border-radius: 1 * @toVw ;
   }
  input[type=range]:focus {
    outline: none;
  }
  input[type=range]::-webkit-slider-thumb {
    -webkit-appearance: none;
    border-radius: 50%; /*外观设置为圆形*/
    height: 15 * @toVw;
    width:  15 * @toVw;
    margin-top: -6 * @toVw; /*使滑块超出轨道部分的偏移量相等*/
    background: #ffffff;
    border: solid 1* @toVw rgba(205, 224, 230, 0.5); /*设置边框*/
    box-shadow: 0 0 2 * @toVw #3b4547; /*添加底部阴影*/

  }
  .audioOff {
    padding: 5 * @toVw;
    display: flex;
    justify-content: center;
    align-items: center;
    border: 1px solid #888;
    background: white;
    border-radius: 500px;
  }

  .ofplayBox {
    width: 100%;
    height: 30 * @toVw;
    margin: 0;
    display: flex;
  }

  .isPlayImg {
    width: 40 * @toVw;
    height: 100%;
  }

  .isPlayImg img {
    width: 30 * @toVw;
  }

  .progress {
    flex: 1;
    position: relative;
    font-size: 12px;
  }

  .duration {
    display: flex;
    font-size: 12px;
    margin-left: 5 * @toVw;
    justify-content: space-between;
    span:first-child{
      margin-left: 0;
    }
  }
  .right-timer{
    margin-right: 0.27rem;
  }

  @media screen and (orientation: landscape) {
    .audioOff {
      padding: 2 * @toVw;
      display: flex;
      justify-content: center;
      align-items: center;
      border: 2px solid #888;
      background: white;
      border-radius: 500px;
    }
    input[type=range] {
      -webkit-appearance: none;
      display: flex;
      width: 90%;
      padding: 0 5 * @toVw;
      border-radius: 10px; /*这个属性设置使填充进度条时的图形为圆角*/
    }
    input[type=range]::-webkit-slider-thumb {
      -webkit-appearance: none;
    }
    input[type=range]::-webkit-slider-runnable-track {
      height: 2 * @toVw;
      background: #999999;
      border-radius: 1 * @toVw ;
    }
    input[type=range]:focus {
      outline: none;
    }
    input[type=range]::-webkit-slider-thumb {
      -webkit-appearance: none;
      border-radius: 50%; /*外观设置为圆形*/
      height: 10 * @toVw;
      width:  10 * @toVw;
      margin-top: -4 * @toVw; /*使滑块超出轨道部分的偏移量相等*/
      background: #ffffff;
      border: solid 1* @toVw rgba(205, 224, 230, 0.5); /*设置边框*/
      box-shadow: 0 .125em .125em #3b4547; /*添加底部阴影*/

    }
    .ofplayBox {
      width: 100%;
      height: 20 * @toVw;
      margin: 0;
      display: flex;
    }

    .isPlayImg {
      width: 24 * @toVw;
      margin-right: 5 * @toVw;
      height: 100%;
    }

    .isPlayImg img {
      width: 20 * @toVw;
    }

    .progress {
      flex: 1;
      position: relative;
      font-size: 12px;
    }
    .duration {
      display: flex;
      font-size: 12px;
      margin-left: 5 * @toVw;
      justify-content: space-between;
      span:first-child{
        margin-left: 0;
      }
    }
    .right-timer{
      margin-right: 0.27rem;
    }

  }
</style>