1.在使用的地方调用
<Audiosvue ref="audio" class="audio-box" :audioFile="item.cont"></Audiosvue>
2.引入组件
import Audiosvue from "@/components/audio";
3.组件
<template>
<div>
<div style="display: flex;align-items: center;">
<input type="range" v-model="progress" min="0" max="100" step="0.1" @input="updateAudioTime" class="inputStyle">
<span style="width: 100px;display: block;">{{ currentTime }} / {{ totalTime }}</span>
<button @click="playPauseAudio">{{ isPlaying ? '暂停' : '播放' }}</button>
</div>
</div>
</template>
<script>
export default {
props: {
audioFile: {
type: String,
},
},
data() {
return {
audio: null,
isPlaying: false,
currentTime: '00:00',
totalTime: '00:00',
progress: 0,
isDragging: false
};
},
computed: {
},
mounted() {
// this.fetch();
},
created() {
// 创建 Audio 对象
this.audio = new Audio(this.audioFile);
// 监听时间更新事件
this.audio.addEventListener('timeupdate', this.updateTimeAndProgressBar);
},
methods: {
playPauseAudio() {
if (this.isPlaying) {
this.audio.pause();
} else {
this.audio.play();
}
this.isPlaying = !this.isPlaying;
},
updateAudioTime() {
const currentTime = (this.progress / 100) * this.audio.duration;
this.audio.currentTime = currentTime;
if (!this.isDragging) {
this.updateTimeAndProgressBar();
}
},
updateTimeAndProgressBar() {
const currentTime = this.audio.currentTime;
const totalTime = this.audio.duration;
this.currentTime = this.formatTime(currentTime);
this.totalTime = this.formatTime(totalTime);
this.progress = (currentTime / totalTime) * 100;
},
formatTime(time) {
const minutes = Math.floor(time / 60);
const seconds = Math.floor(time % 60);
return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
}
},
};
</script>
<style lang="scss" scoped>
.inputStyle{
width: 200px;
}
</style>
4.效果