Vue实现mp3音乐播放及动态进度条

今天碰到一个Vue点击mp3播放及进度条动态走动的小功能,记录一下:

首先是通过HTML5 audio标签引入音频:

<template>
  <div class="x-footer">
    <div class="x-meida">
      <div class="x-meida-img">
        <img :src="footer.imgUrl" />
      </div>
      <div class="x-media-name">
        <h3>{{footer.title}}</h3>
        <h5>{{footer.subTitle}}</h5>
      </div>
    </div>
    <div class="x-media-btn" @click="changeStart">
      <audio :src="footer.songs" id="musicMp3" autoplay="" controls=""></audio>
      <img :src="isStore ? footer.startIcon : footer.stopIcon" />
    </div>
    <div class="x-media-menu">
      <img src="../assets/img/svg/menu.svg" />
    </div>
    <div class="x-mp3-progress">
      <div class="x-now-progress" :style="{ progress}"></div>
    </div>
  </div>
</template>

在data中静态定义我们需要的数据及定义调用点击方法,并获取当前mp3的时间长短,通过定时器转换成百分比实现进度条的播放走动:

export default {
  props: ['link'],
  data () {
    return {
      isStore: true,
      progress: '0%',
      footer: {
        title: '一条狗的使命',
        subTitle: '俗事杂谈论坛直播',
        startIcon: './static/img/start.svg',
        stopIcon: './static/img/stop.svg',
        imgUrl: './static/img/header1.jpg',
        songs: './static/music/aixiangsui.mp3'
      }
    }
  },
  mounted: function () {
    document.getElementById('musicMp3').pause()
    this.changeProgress()
  },
  methods: {
    changeStart: function () {
      this.isStore = !this.isStore
      const musicMp3 = document.getElementById('musicMp3')
      if (!this.isStore) {
        musicMp3.play()
      } else {
        musicMp3.pause()
      }
    },
    changeProgress: function () {
      const musicMp3 = document.getElementById('musicMp3')
      const timer = setInterval(() => {
        const numbers = musicMp3.currentTime / musicMp3.duration
        let perNumber = (numbers * 100).toFixed(2)
        if (perNumber >= 100) {
          this.isStore = true
          this.progress = 0
          clearInterval(timer)
        }
        perNumber += '%'
        this.progress = perNumber
      }, 30)
    }
  }
}

给添加的结构定义样式(css调用有一些是定义的全局变量,需要注意):

.x-footer{
  position: fixed;
  background-color: $primary;
   100%;
  display: flex;
  justify-content: space-between;
  bottom: 0;
  left: 0;
  padding: 20px;
  .x-meida{
    display: inline-flex;
    .x-meida-img{
       88px;
      height: 88px;
      overflow: hidden;
      @include border-radius(5px);
      > img{
        100%;
      }
    }
    .x-media-name{
      padding: 10px 20px;
      color: #ffffff;
      text-align: left;
      > h3{

      }
    }
  }
  .x-media-btn{
     56px;
    height: 56px;
    @include border-radius(50%);
    border: 3px solid #ffffff;
    padding: 10px;
    align-self: center;
    audio{
      display: none;
    }
    > img{
       100%;
    }
    }
    .x-media-menu{
      display: inline-flex;
       43px;
      height: 43px;
      align-self: center;
      > img{
         100%;
      }
    }
  }
  .x-mp3-progress{
     100%;
    position: absolute;
    height: 6px;
    overflow: hidden;
    bottom: 0;
    left: 0;
    .x-now-progress{
      position: relative;
      @extend %transition;
      height: 6px;
      background-color: $orange;
    }
  }

这样媒体mp3播放就完成。下面是媒体播放的vue静态项目,如果您没太明白,可以用作参考: https://github.com/mralins/xinfeeFM

原文地址:https://www.cnblogs.com/a-cat/p/11353316.html