Vue3:全局播放背景音乐

说明:一个全局播放的背景音乐,首页无音乐无音乐图标,在首页互动跳转页面并开始播放音乐,切换页面不需暂停音乐也不会重置音乐,可以通过音乐图标控制暂停或播放。

MusicPlay.vue(音乐组件)

<template>
<div :class="[{musicPlay:isPlaying},'music']" v-show="isMusic" @click="musicPlay">
<svg class="icon" viewBox="0 0 1024 1024"><path d="M875.52 433.152q-7.168-1.024-12.8-10.24t-8.704-33.792q-5.12-39.936-26.112-58.88t-65.024-27.136q-46.08-9.216-81.408-37.376t-58.88-52.736q-22.528-21.504-34.816-15.36t-12.288 22.528l0 44.032 0 96.256q0 57.344-0.512 123.904t-0.512 125.952l0 104.448 0 58.368q1.024 24.576-7.68 54.784t-32.768 56.832-64 45.568-99.328 22.016q-60.416 3.072-109.056-21.504t-75.264-61.952-26.112-81.92 38.4-83.456 81.92-54.272 84.992-16.896 73.216 5.632 47.616 13.312l0-289.792q0-120.832 1.024-272.384 0-29.696 15.36-48.64t40.96-22.016q21.504-3.072 35.328 8.704t28.16 32.768 35.328 47.616 56.832 52.224q30.72 23.552 53.76 33.792t43.008 18.944 39.424 20.992 43.008 39.936q23.552 26.624 28.672 55.296t0.512 52.224-14.848 38.4-17.408 13.824z"></path></svg>
<audio ref="audioPlayer" id="audioPlayer" :src="musicUrl" controls="controls" autoplay loop="true" hidden="true" @play="handlePlay" @pause="handlePause"></audio>
</div>
</template>
<script setup>
import {defineComponent,getCurrentInstance,defineProps,defineEmits,defineExpose,ref,reactive,watch} from 'vue';

defineProps({})

//使用vue的getCurrentInstance 方法获取当前组件实例
const { proxy } = getCurrentInstance()

let musicUrl = require('@/assets/images/music.mp3') //音乐地址
let audioPlayer = ref(null) //音乐
let isPlaying = ref(false) //是否播放动画效果

//播放按钮
const musicPlay = ()=>{
  if(isPlaying.value) {
    audioPlayer.value.pause() 
    isPlaying.value = false
  } else {
    audioPlayer.value.play() 
    isPlaying.value = true
  }
}

//播放监听
const handlePlay = () => {
  isPlaying.value = true
}

//暂停监听
const handlePause = () => {
  isPlaying.value = false
}

//通过路由地址判断音乐是否播放 图标是否显示
let isMusic = ref(false)
watch(()=>proxy.$router.currentRoute.value.path,(newV,oldV)=>{
  if(newV != '/'){
    isMusic.value = true
    isPlaying.value = true
    audioPlayer.value.play() //页面刷新会报错 因浏览器阻止无互动音乐播放
  }else{
    isMusic.value = false
    isPlaying.value = false
    audioPlayer.value.pause()
  }
})

</script>
<style>
.music{width:4rem;height:4rem;border-radius:4rem;position:fixed;left:1rem;top:1rem;z-index:999;display:flex;align-items:center;background:#419035;justify-content:center;}
.musicPlay{animation:rotate 5s linear infinite;}
.music .icon{width:2rem;height:2rem;fill:#c3db60;}
.music audio{display:none;}
@keyframes rotate{
0%{transform:rotate(0deg)}
100%{transform:rotate(360deg)}
}
</style>

App.vue(使用音乐组件)

<template>

<!--app.vue其他代码-->


<!--组件使用-->
<music-play></music-play>

<!--app.vue其他代码-->

</template>
<script setup>

//引入组件
import MusicPlay from '@/components/MusicPlay.vue'

</script>

index.vue(页面起始页首页)

<template>
<div>

<!--其他html-->
<!--注: 除app.vue引入音乐组件 其他页面均不需再引用-->

<div @click="goPass">点击开始</div>


</div>
</template>
<script setup>
import {defineComponent,getCurrentInstance,ref,reactive,computed,onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount,onUnmounted,onErrorCaptured,onRenderTracked,onRenderTriggered,onActivated,onDeactivated,onServerPrefetch,toRaw,watch} from 'vue';



//使用vue的getCurrentInstance 方法获取当前组件实例
const { proxy } = getCurrentInstance()


//去开启音乐并跳转其他页
const goPass = () => {
   
  /*注掉MusicPlay.vue中路由地址判断中的 audioPlayer.value.play() 
   解开此处以解决页面刷新无互动音乐播放报错问题*/
  //捕获页面中的id为audioPlayer的音乐标签(MusicPlay.vue)
  //let audioPlayer = document.getElementById('audioPlayer')
  //设置音乐开始播放
  //audioPlayer.play()
  
  //跳转其他页面
  proxy.$router.push("/xxxxxx")
}
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值