项目中遇到了,让实现一个音乐播放器的功能。修改其样式要求自定义,切需要有,进度条,时间,开关,应用于H5需要兼容ios与android。简单看一下如图播放器

完成代码

audioCom.vue

<template>
<div class="myaudio">
<audio
@timeupdate="updateProgress"
controls
ref="audioRef"
style="display: none"
@canplay="getDuration"
>
<source :src="fileurl" type="audio/mpeg" />
您的浏览器不支持音频播放
</audio>
<div class="audioPanel">
<div class="playBtn" @click="playAudio">
<img
v-show="audioStatus == 0"
src="@/assets/images/main/icon_play.png"
alt=""
/>
<img
v-show="audioStatus == 1"
src="@/assets/images/main/icon_stop.png"
alt=""
/>
</div>
<div class="slidList">
<van-progress color="#51C0F0" class="sliderr" :percentage="value" />
<span class="timers">{{ videoStart }}/{{ transTime(duration) }}</span>
</div>
</div>
</div>
</template> <script>
export default {
props: {
// 播放地址
fileurl: {
type: String,
default: "",
}, },
data: function () {
return {
audioStatus: 0,
videoStart: "00:00",
value: 0,
duration: 0,
isToPla:false
};
},
mounted() {
if (this.fileurl&&!this.isToPla) {
this.$nextTick(() => {
document.addEventListener(
"touchstart",
() => {
if(this.isToPla){
return
}
this.$refs.audioRef.play();
this.$refs.audioRef.pause();
},
false
);
});
}
},
methods: {
getDuration() {
this.duration = this.$refs.audioRef.duration;
},
//播放暂停控制
playAudio(e) {this.isToPla=true
let recordAudio = this.$refs.audioRef; //获取audio元素
if (recordAudio.paused) {
recordAudio.play();
this.audioStatus = 1;
} else {
recordAudio.pause();
this.audioStatus = 0;
}
},
//更新进度条与当前播放时间
updateProgress(e) {
var value = e.target.currentTime / this.duration;
this.value = value * 100;
if (e.target.currentTime > this.duration) {
this.audioStatus = 0;
this.value = 0;
this.videoStart = this.transTime(0);
return;
}
this.value = value * 100;
this.videoStart = this.transTime(this.$refs.audioRef.currentTime);
},
/**
* 音频播放时间换算
* @param {number} value - 音频当前播放时间,单位秒
*/
transTime(value) {
var time = "";
var h = parseInt(value / 3600);
value %= 3600;
var m = parseInt(value / 60);
m = m < 10 ? "0" + m : m;
var s = parseInt(value % 60);
s = s < 10 ? "0" + s : s;
time = m + ":" + s;
return time;
},
// 进度条
onChange(val) {
let recordAudio = this.$refs.audioRef; //获取audio元素
if (!recordAudio.paused || recordAudio.currentTime != 0) {
recordAudio.currentTime = (recordAudio.duration * val) / 100;
this.videoStart = this.transTime((val / 100) * this.duration);
}
},
},
};
</script> <style lang="scss" scoped>
.audioPanel {
display: flex;
align-items: center;
height: 40px;
.slidList {
position: relative;
flex: 1;
.timers {
color: #bdbdbd;
font-family: PingFang SC;
font-size: 12px;
text-align: left;
position: absolute;
top: 10px;
right: 0px;
}
}
.sliderr {
width: 100%;
}
.playBtn {
height: 30px;
img {
height: 100%;
}
}
} ::v-deep {
.van-progress__pivot {
display: none;
}
}
</style>

为了更好地处理IOS duration兼容问题

我们在mounted中添加了自动触发touchstart方法,去进入页面触发一次,这里goole新版本不允许立即播放,会抛出异常,但无关紧要。

  mounted() {
if (this.fileurl&&!this.isToPla) {
this.$nextTick(() => {
document.addEventListener(
"touchstart",
() => {
if(this.isToPla){
return
}
this.$refs.audioRef.play();
this.$refs.audioRef.pause();
},
false
);
});
}
},

isToPla:目的是触发一次后停止继续触发该touch函数

vue实现自定义音乐播放器的更多相关文章

  1. vue小练习--音乐播放器

    1 首先建一个文件夹 放几首歌曲 2 看代码 1)基本版本 <!DOCTYPE html> <html lang="zh-CN"> <head> ...

  2. 用Vue来实现音乐播放器(三十八):歌词滚动列表的问题

    1.频繁切换歌曲时,歌词会跳来跳去 原因: // 歌词跳跃是因为内部有一个currentLyric对像内部有一些功能来完成歌词的跳跃 //每个currentLyric能实现歌曲的播放跳到相应的位置 是 ...

  3. Vue实战:音乐播放器(一) 页面效果

    先看一下效果图 首页 歌单详情页 歌手列表 歌手详情页 排行页面 榜单的详情页(排序样式) 搜索页面 搜索结果 播放器内核 歌词自动滚动 播放列表 用户中心

  4. 用Vue来实现音乐播放器(九):歌单数据接口分析

    z这里如果我们和之前获取轮播图的数据一样来获取表单的数据  发现根本获取不到 原因是qq音乐在请求头里面加了authority和refer等 但是如果我们通过jsonp实现跨域来请求数据的话  是根本 ...

  5. 用Vue来实现音乐播放器(八):自动轮播图啊

    slider.vue组件的模板部分 <template> <div class="slider" ref="slider"> <d ...

  6. 用Vue来实现音乐播放器(四十):歌单详情页布局以及Vuex实现路由数据通讯

    1.歌单详情页是推荐页面的二级路由页面 将推荐页面歌单的数据传到歌曲详情页面  利用vuex 1.首先在state下定义一个歌单对象 disc{} 2.在mutaions-types中  定义一个别名 ...

  7. 用Vue来实现音乐播放器(二十三):音乐列表

    当我们将音乐列表往上滑的时候   我们上面的歌手图片部分也会变小 当我们将音乐列表向下拉的时候   我们的图片会放大 当我们将音乐列表向上滑的时候   我们的图片有一个高斯模糊的效果 并且随着我们的列 ...

  8. 用Vue来实现音乐播放器(二十一):歌手详情数据抓取

    第一步:在api文件夹下的singer.js中抛出getSingerDetail方法 第二步:在singer-detail.vue组件中引入api文件夹下的singer.js和config.js 第三 ...

  9. 用Vue来实现音乐播放器(二十):Vuex初始化及歌手数据的配置

    state:所有组件的所有状态和数据  放入同一个内存空间去管理 我们把它称为state Vue Components:state里面的数据可以方便的映射到组件上 然后渲染组件 Actions:当组件 ...

  10. 用Vue来实现音乐播放器(十八):右侧快速入口点击高亮

    问题一:当我们点击右侧快速入口的时候  被点击的地方高亮 首先我们要知道右侧快速入口是为什么高亮??因为当watch()监控到scrollY的变化了的时候  将scrollY的值和listHeight ...

随机推荐

  1. 机器学习专业词汇:“Lookahead horizon” 可以翻译为“前瞻视距”或“预见范围”

    "Lookahead horizon" 可以翻译为"前瞻视距"或"预见范围". 在不同领域中,它可能具有稍微不同的含义: 在机器学习和人工智 ...

  2. UE4纯C++实现游戏快捷栏之物品读取

    我们在上一步骤中创建了快捷栏的UI界面,在这一部分我们将从Json文件中读取物品的相关信息(种类以及属性),来填充到游戏数据中进行存储以便快捷栏使用,具体分以下几部分完成. 1.Types.h: 添加 ...

  3. 超聚变服务器2288H V6使用 iBMC 安装 Ubuntu Server 24.04 LTS及后续系统配置

    一. 超聚变服务器iBMC远程管理 超聚变服务器的iBMC芯片集成了一个专用的管理GE网口,提供全面的故障诊断.自动化运维.硬件安全加固等管理特性.iBMC支持Redfish.SNMP.IPMI 2. ...

  4. flask+APScheduler定时任务的使用

    目录 APScheduler简介 安装 add_job参数详解 结合flask使用 用uwsgi启动项目 用gunicorn+gevent启动flask项目 APScheduler简介 APSched ...

  5. linux 查看进程的bin文件所在路径

    1.获取进程pid ps aux |grep nginx|grep master|grep -v grep|awk '{print $2}' 2.根据进程pid 获取 bin路径 方法a pwdx p ...

  6. cornerstone中raft_server_resp_handlers源码解析

    1.概述 在rpc请求里,有了请求req就必然有回复resp.本文就来解析发送req的节点收到resp该怎么处理. 2.handle_peer_resp源码解析 void raft_server::h ...

  7. linux bash shell 入门教程()

    Shell Script(bash)简介 众所皆知地,UNIX上以小工具著名,利用许多简单的小工具,来完成原本需要大量软体开发的工作,这一点特色,使得UNIX成为许多人心目中理想的系统平台. 在众多的 ...

  8. Java并发基础构建模块简介

    在实际并发编程中,可以利用synchronized来同步线程对于共享对象的访问,用户需要显示的定义synchronized代码块或者方法.为了加快开发,可以使用Java平台一些并发基础模块来开发. 注 ...

  9. Mysql 通用分页

    第一步,建立数据库: create table student( id int primary key auto_increment, code varchar(50), name varchar(5 ...

  10. 三、FreeRTOS学习笔记-系统配置

    FreeRTOSConfig.h配置文件作用:对FreeRTOS进行功能配置和裁剪,以及API函数的使能. 系统配置文件中主要是一些宏定义 相关宏定义可分为三类: 1."INCLUDE&qu ...