自定义Audio

播放器样式

子组件

<template>

  <div class="audio-wrapper">

    <audio ref="audio">

      <source :src="myAudioUrl" type="audio/mp3" />

    </audio>

    <div class="audio-left">

      <img

        ref="audioPlayer"

        v-if="myPlayTemp"

        @click="myPlay()"

        src="../../../../static/images/icon-播放.png"

      />

      <img

        ref="audioPlayer"

        v-if="!myPlayTemp"

        @click="myPlay()"

        src="../../../../static/images/icon-暂停.png"

      />

    </div>

    <div class="audio-right">

      <!-- <p style="max-width: 536px;"></p> -->

      <div class="audio-time">

        <span class="audio-length-current" ref="audioCurTime">00:00</span>

        <div class="progress-bar-bg" ref="progressBarBg" @mousedown="handledown()">

          <span ref="progressDot"></span>

          <div class="progress-bar" ref="progressBar"></div>

        </div>

        <span class="audio-length-total" ref="duration">00:00</span>

      </div>

    </div>

  </div>

</template>

<script>

export default {

  name: "myAudio",

  props: ["myAudioUrl"],

  data() {

    return {

      audio: "",

      myPlayTemp: true

    };

  },

  mounted() {

    this.init();

  },

  methods: {

    init() {

      this.audio = this.$refs.audio;

      this.audio.load();

      this.audio.pause();

      this.updateProgress();

    },

    // 点击播放/暂停图片时,控制音乐的播放与暂停

    myPlay() {

      if (this.audio.paused) {

        // 开始播放当前点击的音频

        this.audio.play();

        this.myPlayTemp = false;

      } else {

        this.audio.pause();

        this.myPlayTemp = true;

      }

      this.updateProgress();

    },

    // 更新进度条与当前播放时间

    updateProgress() {

      let value = this.audio.currentTime / this.audio.duration;

      this.$refs.progressBar.style.width = value * 100 + "%";

      this.$refs.progressDot.style.left = value * 100 + "%";

      // 初始时间

      this.$refs.audioCurTime.innerHTML = this.transTime(this.audio.currentTime);

      // 总共时长

      let audioElement = new Audio(this.myAudioUrl);

      let self = this

      audioElement.addEventListener("loadedmetadata", function () {

        let duration2 = (audioElement.duration / 100).toFixed(2).replace('.',':');

        self.$refs.duration.innerHTML = self.formatTime(duration2);

      });

    },

    // 播放结束时

    audioEnded() {

      this.$refs.progressBar.style.width = 0 + "%";

      this.$refs.progressDot.style.left = 0 + "%";

      this.myPlayTemp = true;

    },

    // 播放时间换算

    transTime(value) {

      let time = "";

      let h = parseInt(value / 3600);

      value %= 3600;

      let m = parseInt(value / 60);

      let s = parseInt(value % 60);

      if (h > 0) {

        time = this.formatTime(h + ":" + m + ":" + s);

      } else {

        time = this.formatTime(m + ":" + s);

      }

      return time;

    },

    //  * 格式化时间显示,补零对齐

    //  * eg:2:4  -->  02:04

    formatTime(value) {

      let time = "";

      let s = value.split(":");

      let i = 0;

      for (; i < s.length - 1; i++) {

        time += s[i].length == 1 ? "0" + s[i] : s[i];

        time += ":";

      }

      time += s[i].length == 1 ? "0" + s[i] : s[i];

      return time;

    },

    // 点击进度条跳到指定点播放

    handledown() {

      // 只有音乐开始播放后才可以调节,已经播放过但暂停了的也可以

      console.log(this.audio.currentTime);

      if (!this.audio.paused || this.audio.currentTime != 0) {

        let pgsWidth = this.$refs.progressBarBg.offsetWidth;

        let rate = event.offsetX / pgsWidth;

        this.audio.currentTime = this.audio.duration * rate;

        this.updateProgress();

      }

    }

  },

  watch: {

    audio: function(params) {

      let self = this;

      self.audio.addEventListener(

        "timeupdate",

        function() {

          // console.log('开始');

          self.updateProgress();

        },

        false

      );

      self.audio.addEventListener(

        "ended",

        function() {

          // console.log('结束');

          self.audioEnded();

        },

        false

      );

    }

  }

};

</script>

<style lang="scss" scoped>

.audio-wrapper {

  background-color: #f8f8f8;

  margin: 10px auto;

  width: 70%;

  height: 50px;

  border-radius: 50px;

}

.audio-left {

  float: left;

  text-align: center;

  width: 15%;

  height: 100%;

}

.audio-left img {

  width: 40px;

  position: relative;

  top: 50%;

  transform: translateY(-50%);

  margin: 0;

  cursor: pointer;

}

.audio-right {

  float: left;

  width: 80%;

  height: 100%;

}

.progress-bar-bg {

  background-color: #d9d9d9;

  position: relative;

  height: 2px;

  cursor: pointer;

}

.progress-bar {

  background-color: #649fec;

  width: 0;

  height: 2px;

}

.progress-bar-bg span {

  content: " ";

  width: 10px;

  height: 10px;

  border-radius: 50%;

  -moz-border-radius: 50%;

  -webkit-border-radius: 50%;

  background-color: #3e87e8;

  position: absolute;

  left: 0;

  top: 50%;

  margin-top: -5px;

  margin-left: -5px;

  cursor: pointer;

}

.audio-time {

  margin-top: 5%;

}

.audio-length-total {

  float: right;

  font-size: 12px;

}

.audio-length-current {

  float: left;

  font-size: 12px;

}

</style>

父组件关键代码(用来监听element弹框,取消播放并复位)

<myAudio ref="myAudioOne" :myAudioUrl="errorDetailInfo.audios"></myAudio>

watch: {

      'dialogVisible':function (val) {

        const self = this

        self.$refs.myAudioOne.init();

        self.$refs.myAudioOne.audioEnded();

        }

    },

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容