Vue3自定义封装音频播放组件(带拖拽进度条)

6 篇文章 0 订阅
3 篇文章 0 订阅

Vue3自定义封装音频播放组件(带拖拽进度条)

描述

该款自定义组件可作为音频、视频播放的进度条,用于控制音频、视频的播放进度、暂停开始、拖拽进度条拓展性极高。

实现效果

在这里插入图片描述

具体效果可以根据自定义内容进行位置调整

项目需求
  1. 有播放暂停按钮
  2. 进度条可以跟随播放丝滑更新
  3. 有当前播放时间和总时间可以根据播放更新当前时间
  4. 可以点击进度条的某一处跳转到指定处进行播放
技术栈

vue3+elementUI || elementPlus || vant

功能实现
  <template>
  <div class="audio_wrap_content" :style="[{ backgroundColor: bgColor }]">
    <audio ref="audio" @play="playFunc" @pause="pauseFunc" @timeupdate="timeupdateFunc"
      @loadedmetadata="onLoadedmetadata" @ended="handleEnd">
      <source :src="audioSrc" />
    </audio>
    <div class="cudio_control_content">
      <img @click="startPlayOrPause" class="state_img" :src="audio.playing ? stopImg : playImg" alt="" />

      <div class="slider">
        <span>{{ formattedCurrentTime }}</span>
        <div><el-slider v-model="sliderTime" :show-tooltip="false" @change="onChange"></el-slider></div>
        <span>{{ formattedMaxTime }}</span>
      </div>
    </div>
  </div>
</template>

<script>
function formatTime(second) {
  let m = parseInt(second / 60);
  let s = parseInt(second % 60);
  let formatTime = "";
  if (second == 0) {
    return "0'00''";
  }
  if (m == 0) {
    if (s >= 10) {
      formatTime = "0'" + s + "''";
    } else {
      formatTime = "0'0" + s + "''";
    }
  } else {
    if (s >= 10) {
      formatTime = m + "'" + s + "''";
    } else {
      formatTime = m + "'0" + s + "''";
    }
  }
  return formatTime;
}
export default {
  name: "AudioPlay",
  props: {
    bgColor: {
      type: String,
      default: "rgba(255,255,255,0.15)",
    },
    audioSrc: {
      type: String,
      default: require("@/assets/music/offer_des.mp3"),
    },
    themeColor: {
      type: String,
      default: "#ffb900",
    },
  },
  data() {
    return {
      value1: 1,
      playImg: require("@/assets/images/play.png"),
      stopImg: require("@/assets/images/stop.png"),
      sliderTime: 0,
      audio: {
        maxTime: 0,
        currentTime: 0,
        playing: false,
      },
    };
  },
  computed: {
    formattedCurrentTime() {
      return formatTime(this.audio.currentTime);
    },
    formattedMaxTime() {
      return formatTime(this.audio.maxTime);
    },
  },
  methods: {
    play() {
      console.log("触发 播放");
      this.$refs.audio.play();
    },
    pause() {
      this.$refs.audio.pause();
    },
    playFunc() {
      this.audio.playing = true;
    },
    pauseFunc() {
      this.audio.playing = false;
    },
    handleEnd() {
      this.sliderTime = 0;
      this.audio.playing = false;
      this.audio.currentTime = 0;
    },
    timeupdateFunc(res) {
      this.audio.currentTime = res.target.currentTime;
      this.sliderTime = parseInt(
        (this.audio.currentTime / this.audio.maxTime) * 100
      );
    },
    onLoadedmetadata(res) {
      console.log(111, "首次加载完成");
      this.audio.maxTime = parseInt(res.target.duration);
    },
    startPlayOrPause() {
      console.log("bof", "暂停-播放");
      this.audio.playing ? this.pause() : this.play();
    },
    onChange(value) {
      console.log(value, "values");
      this.$refs.audio.currentTime = parseInt(
        (value / 100) * this.audio.maxTime
      );
    },
  },
};
</script>

<style scoped lang="less">
.audio_wrap_content {
  height: 26px;
  border-radius: 15px;
}

.cudio_control_content {
  margin: 0 auto;
  width: 90%;
  height: 100%;
  display: flex;

  .slider {
    flex: 1;
    width: 100%;
    display: flex;
    align-items: center;

  }

  .slider div {
    flex: 1;
  }

  .slider span {
    margin: 0 15px;
    font-size: 10px;
    color: rgba(34, 34, 34, 0.3);
  }

  justify-content: space-between;
  align-items: center;

  .state_img {
    width: 18px;
    height: 18px;
    margin-right: 15px;

  }

  .custom-button {
    width: 8px;
    background-color: #ffb900;
    height: 8px;
    border-radius: 8px;
  }

  .state_time {
    font-family: "BIGJOHN";
    font-size: 10px;
    color: rgba(34, 34, 34, 0.3);
    margin-right: 3px;
    margin-left: 3px;
  }

}
</style>

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue3中,可以创建一个音频播放组件。根据提供的引用内容,可以创建一个名为"Player.vue"的全局组件,并在"App.vue"中导入该组件。在模板中,可以使用`<audio>`元素来播放音频文件。同时,可以使用Vuex来管理音频播放的状态和数据。 以下是创建Vue3音频播放组件的步骤: 1. 在"components"文件夹下创建一个名为"Player.vue"的全局组件。 2. 在"App.vue"中导入该组件,并在模板中使用`<my-player>`标签引入该组件。 3. 在"Player.vue"组件中,使用`<audio>`元素来承载音频播放器。可以将该元素放在一个名为"player"的div中。 4. 导入Vuex的`computed`和`useStore`方法,并通过`useStore`方法获取store实例。 5. 在组件中使用`computed`来绑定store中的"fullScreen"状态,以便在组件中使用。 6. 在Vuex的"state.js"文件中设置音频播放器的状态数据,如播放列表、播放状态、播放模式等。 7. 在"state.js"中使用`export default state`将state导出,以便在其他组件中使用。 通过以上步骤,你可以创建一个Vue3的音频播放组件,并使用Vuex来管理播放器的状态和数据。你可以根据自己的需求来进一步完善组件的功能和样式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Vue3项目自学训练------音乐播放器(使用vueX管理项目)(七)](https://blog.csdn.net/MX_muxiao/article/details/125459921)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值