更新记录
1.6.0(2025-06-25) 下载此版本
[1.6.0] - 2024-12-25
平台兼容性
云端兼容性
阿里云 | 腾讯云 | 支付宝云 |
---|---|---|
√ | √ | √ |
uni-app(4.72)
Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
---|---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ | √ | √ | √ |
微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 快应用-华为 | 快应用-联盟 |
---|---|---|---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
uni-app x(4.72)
Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
---|---|---|---|---|---|
- | - | - | - | - | - |
其他
多语言 | 暗黑模式 | 宽屏模式 |
---|---|---|
× | √ | √ |
sanyue-music-player
一个功能完整、稳定可靠的 uni-app 音乐播放器插件,严格按照 uni_modules 插件规范开发,支持多平台兼容和 Vue2/Vue3 双版本。
🎵 插件特性
核心功能
- 完整的音频播放控制 - 播放、暂停、停止、进度条拖拽、音量控制
- 播放列表管理 - 支持播放列表、上一首/下一首、三种播放模式
- 歌词显示支持 - 支持 LRC 格式歌词,带翻译功能
- 双模式切换 - 普通模式与迷你模式无缝切换
- 主题系统 - 内置浅色/深色主题,支持自动切换
技术特性
- 多平台兼容 - 支持 App(iOS/Android)、H5、各种小程序
- Vue 双版本支持 - 同时支持 Vue2 和 Vue3
- TypeScript 支持 - 完整的类型定义,提供智能提示
- 响应式设计 - 使用 Flex 布局和 rpx 单位,完美适配各种设备
- SCSS 样式 - 模块化样式管理,易于定制
规范符合性
- uni_modules 标准 - 严格按照 uni-app 插件规范开发
- 平台兼容性 - 通过官方兼容性测试
- 代码质量 - 遵循最佳实践,确保稳定性
📦 安装使用
方式一:HBuilderX 插件市场
- 在 HBuilderX 中打开项目
- 点击工具栏的 "插件市场"
- 搜索 "sanyue-music-player"
- 点击 "导入插件" 并选择 "导入到项目"
方式二:手动安装
- 下载插件包并解压
- 将
uni_modules/sanyue-music-player
文件夹复制到项目根目录的uni_modules
文件夹中 - 在 HBuilderX 中右键点击
uni_modules/sanyue-music-player
,选择 "安装插件依赖"
🚀 快速开始
基础使用
<template>
<view class="container">
<sanyue-music-player
:src="audioSrc"
:title="songTitle"
:artist="songArtist"
:cover="songCover"
@play="onPlay"
@pause="onPause"
/>
</view>
</template>
<script>
export default {
data() {
return {
audioSrc: 'https://example.com/music.mp3',
songTitle: '示例歌曲',
songArtist: '示例艺术家',
songCover: 'https://example.com/cover.jpg'
}
},
methods: {
onPlay() {
console.log('开始播放');
},
onPause() {
console.log('暂停播放');
}
}
}
</script>
播放列表使用
<template>
<view class="container">
<sanyue-music-player
:playlist="playlist"
:current-index="currentIndex"
:play-mode="playMode"
@song-change="onSongChange"
@prev="onPrev"
@next="onNext"
/>
</view>
</template>
<script>
export default {
data() {
return {
currentIndex: 0,
playMode: 'list', // list, single, random
playlist: [
{
src: 'https://example.com/song1.mp3',
title: '歌曲1',
artist: '艺术家1',
cover: 'https://example.com/cover1.jpg'
},
{
src: 'https://example.com/song2.mp3',
title: '歌曲2',
artist: '艺术家2',
cover: 'https://example.com/cover2.jpg'
}
]
}
},
methods: {
onSongChange(event) {
console.log('歌曲切换:', event.song.title);
this.currentIndex = event.index;
},
onPrev(event) {
console.log('上一首:', event.song.title);
this.currentIndex = event.index;
},
onNext(event) {
console.log('下一首:', event.song.title);
this.currentIndex = event.index;
}
}
}
</script>
迷你播放器使用
<template>
<view class="music-app">
<!-- 主内容区域 -->
<scroll-view class="content" scroll-y>
<!-- 歌曲列表等内容 -->
<view class="song-list">
<!-- 歌曲列表内容 -->
</view>
</scroll-view>
<!-- 迷你播放器 -->
<sanyue-music-player
:mini-mode="true"
:src="currentSong.src"
:title="currentSong.title"
:artist="currentSong.artist"
:cover="currentSong.cover"
:show-mini-progress="true"
class="mini-player"
@mode-change="onModeChange"
/>
</view>
</template>
<script>
export default {
data() {
return {
currentSong: {
src: 'https://example.com/music.mp3',
title: '当前播放歌曲',
artist: '艺术家',
cover: 'https://example.com/cover.jpg'
}
}
},
methods: {
onModeChange(mode) {
console.log('模式切换:', mode);
}
}
}
</script>
<style lang="scss" scoped>
.music-app {
height: 100vh;
display: flex;
flex-direction: column;
}
.content {
flex: 1;
height: 0; // 重要:确保 flex 子元素正确计算高度
}
.mini-player {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 999;
}
</style>
📋 API 参考
Props 属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
src | String | '' | 音频文件地址 |
title | String | '' | 歌曲标题 |
artist | String | '' | 艺术家 |
album | String | '' | 专辑名称 |
cover | String | '' | 封面图片地址 |
autoplay | Boolean | false | 自动播放 |
loop | Boolean | false | 循环播放 |
volume | Number | 1 | 音量 (0-1) |
playlist | Array | [] | 播放列表 |
currentIndex | Number | 0 | 当前播放索引 |
playMode | String | 'list' | 播放模式 (list/single/random) |
theme | String | 'light' | 主题 (light/dark/auto) |
showCover | Boolean | true | 显示封面 |
showInfo | Boolean | true | 显示歌曲信息 |
showProgress | Boolean | true | 显示进度条 |
showPrevNext | Boolean | true | 显示上一首/下一首按钮 |
showExtraControls | Boolean | true | 显示额外控制按钮 |
showFavorite | Boolean | false | 显示收藏按钮 |
showLyrics | Boolean | false | 显示歌词 |
lyrics | Array | [] | 歌词数组 |
showTranslation | Boolean | false | 显示翻译 |
miniMode | Boolean | false | 迷你模式 |
showMiniProgress | Boolean | true | 显示迷你进度条 |
enableRotation | Boolean | true | 启用封面旋转 |
canSeek | Boolean | true | 允许拖拽进度条 |
Events 事件
事件名 | 参数 | 说明 |
---|---|---|
play | - | 播放事件 |
pause | - | 暂停事件 |
stop | - | 停止事件 |
ended | - | 播放结束事件 |
canplay | { duration } | 可以播放事件 |
timeupdate | { currentTime, duration } | 时间更新事件 |
prev | { index, song } | 上一首事件 |
next | { index, song } | 下一首事件 |
song-change | { index, song } | 歌曲切换事件 |
play-mode-change | mode | 播放模式切换事件 |
mode-change | mode | 模式切换事件 |
volume-change | { volume } | 音量变化事件 |
favorite-change | isFavorited | 收藏状态变化事件 |
seek | { time } | 跳转事件 |
cover-error | - | 封面加载错误事件 |
error | { message, error } | 错误事件 |
Methods 方法
通过 ref 调用组件方法:
<template>
<sanyue-music-player ref="player" />
</template>
<script>
export default {
methods: {
playMusic() {
this.$refs.player.play();
},
pauseMusic() {
this.$refs.player.pause();
},
seekTo(time) {
this.$refs.player.seek(time);
}
}
}
</script>
方法名 | 参数 | 说明 |
---|---|---|
play() | - | 播放 |
pause() | - | 暂停 |
stop() | - | 停止 |
seek(time) | time: Number | 跳转到指定时间 |
setVolume(volume) | volume: Number | 设置音量 |
prev() | - | 上一首 |
next() | - | 下一首 |
switchToSong(index) | index: Number | 切换到指定歌曲 |
🎨 样式定制
主题定制
<template>
<sanyue-music-player
theme="dark"
class="custom-player"
/>
</template>
<style lang="scss" scoped>
.custom-player {
// 自定义样式
--primary-color: #ff6b6b;
--background-color: #2c3e50;
--text-color: #ecf0f1;
::v-deep .sanyue-player {
background: var(--background-color);
color: var(--text-color);
.control-btn.play-btn {
background: var(--primary-color);
}
}
}
</style>
响应式设计
插件使用 rpx 单位和 Flex 布局,自动适配不同设备:
// 小屏幕适配
@media (max-width: 750rpx) {
.cover-section .cover-container {
width: 300rpx;
height: 300rpx;
}
}
// 大屏幕适配
@media (min-width: 1200rpx) {
.cover-section .cover-container {
width: 500rpx;
height: 500rpx;
}
}
🔧 高级功能
歌词功能
<template>
<sanyue-music-player
:show-lyrics="true"
:lyrics="lyrics"
:show-translation="true"
/>
</template>
<script>
export default {
data() {
return {
lyrics: [
{ time: 0, text: '第一句歌词', translation: 'First line lyrics' },
{ time: 5.5, text: '第二句歌词', translation: 'Second line lyrics' },
{ time: 12.3, text: '第三句歌词', translation: 'Third line lyrics' }
]
}
}
}
</script>
错误处理
<template>
<sanyue-music-player
:src="audioSrc"
@error="onError"
@cover-error="onCoverError"
/>
</template>
<script>
export default {
methods: {
onError(event) {
console.error('播放器错误:', event.message);
uni.showToast({
title: '播放失败',
icon: 'none'
});
},
onCoverError() {
console.warn('封面加载失败');
}
}
}
</script>
TypeScript 支持
import { SongInfo, PlayMode } from 'sanyue-music-player';
interface ComponentData {
playlist: SongInfo[];
currentIndex: number;
playMode: PlayMode;
}
export default {
data(): ComponentData {
return {
playlist: [
{
src: 'https://example.com/music.mp3',
title: '歌曲标题',
artist: '艺术家',
cover: 'https://example.com/cover.jpg'
}
],
currentIndex: 0,
playMode: 'list'
};
}
};
🌍 平台兼容性
平台 | 支持状态 | 说明 |
---|---|---|
App (iOS) | ✅ 完全支持 | 所有功能正常 |
App (Android) | ✅ 完全支持 | 所有功能正常 |
H5 | ✅ 完全支持 | 所有功能正常 |
微信小程序 | ✅ 完全支持 | 所有功能正常 |
支付宝小程序 | ✅ 完全支持 | 所有功能正常 |
百度小程序 | ✅ 基本支持 | 核心功能正常 |
字节跳动小程序 | ✅ 基本支持 | 核心功能正常 |
QQ 小程序 | ✅ 基本支持 | 核心功能正常 |
钉钉小程序 | ✅ 基本支持 | 核心功能正常 |
快手小程序 | ✅ 基本支持 | 核心功能正常 |
飞书小程序 | ✅ 基本支持 | 核心功能正常 |
京东小程序 | ✅ 基本支持 | 核心功能正常 |
🐛 常见问题
Q: 音频无法播放?
A: 请检查以下几点:
- 音频文件地址是否正确且可访问
- 音频格式是否被平台支持(推荐使用 mp3 格式)
- 网络连接是否正常
- 是否有跨域问题(H5 平台)
Q: 在小程序中无法播放?
A: 小程序平台需要注意:
- 音频文件域名需要在小程序后台配置为合法域名
- 部分小程序平台对音频格式有限制
- 确保音频文件支持 HTTPS 访问
Q: 样式显示异常?
A: 请检查:
- 是否正确引入了组件
- 是否有样式冲突
- 确保使用了正确的 rpx 单位
Q: Vue3 项目中如何使用?
A: Vue3 项目直接使用主组件:
<script setup>
import { ref } from 'vue';
const playerRef = ref(null);
const playMusic = () => {
playerRef.value?.play();
};
</script>
<template>
<sanyue-music-player ref="playerRef" />
</template>
Q: Vue2 项目中如何使用?
A: Vue2 项目使用 Vue2 兼容版本:
<template>
<sanyue-music-player-vue2 ref="player" />
</template>
<script>
export default {
methods: {
playMusic() {
this.$refs.player.play();
}
}
}
</script>
📄 更新日志
v1.6.0 (2024-12-25)
- 🎉 严格按照 uni_modules 插件规范重构
- 🔧 修复上一首/下一首功能异常问题
- 🎨 全面采用 Flex 布局和 SCSS 语法
- 📱 统一使用 rpx 单位,完美适配各种设备
- 🛠️ 优化代码结构,提升稳定性
- 📚 完善 TypeScript 类型定义
- 🐛 修复已知问题,提升用户体验
v1.5.0 (2024-12-24)
- 🔧 修复播放控制功能异常
- 🎨 优化界面布局和样式
- 📱 改进迷你播放器设计
- 🛠️ 代码优化和性能提升
📜 开源协议
本插件采用 MIT 开源协议,您可以自由使用、修改和分发。
sanyue-music-player - 让音乐播放更简单、更优雅!