项目中遇到了,让实现一个音乐播放器的功能。修改其样式要求自定义,切需要有,进度条,时间,开关,应用于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. Java 面试用什么项目?全是商场秒杀 RPC,我吐了

    看了几百份简历,真的超过 90% 的小伙伴的项目是商城.RPC.秒杀.论坛.外卖.点评等等烂大街的项目,人人都知道这些项目烂大街了,但大部分同学还是得硬着头皮做,没办法,网络上能找到的.教程比较完善的 ...

  2. js获取nginx服务器时间

    前端页面js获取nginx服务器时间在实际开发中,我们通常要使用的是服务器端的时间,而不是本机电脑的时间,在js文件中直接通过new Date()获取的时间是本机电脑的系统时间,获取服务器时间的方法如 ...

  3. ElementUI Select单选切换多选无法清除历史数据的解决方案

    背景: 有一个tab切换,每一个tab下都有一个 下拉框,只是一个是多选一个是单选,问题是当切换tab标签的时候,下拉框的样式不会被清空. 解决方案: 只需要在 el-select 上加一个 key ...

  4. (Redis基础教程之九) 如何在Redis中使用Sorted Sets

    介绍 Redis是一个开源的内存中键值数据存储.在Redis的,排序集合类似于一个数据类型集在这两者都是串的非重复的组.不同之处在于,已排序集中的每个成员都与一个分数相关联,从而可以从最小分数到最大分 ...

  5. Spring 开发 Swing GUI 简介

    依赖注入和富客户机 Chad Woolley (thewoolleyman@gmail.com), 软件开发人员, Ionami 简介:  本教程介绍了 Spring 框架以及依赖注入的概念(也称为反 ...

  6. Kafka可视化工具之Kafka Tool

    官网: https://www.kafkatool.com/download.html Kafka Tool是一个用于管理和使用Apache Kafka集群的GUI应用程序. Kafka Tool提供 ...

  7. Linux之新增硬盘,分区,挂载

    1.新增硬盘后, 查看当前磁盘信息 fdisk -l 可以看到除了当前的第一块硬盘(sda)外还有一块sdb的第二块硬盘(sdb),然后用命令: fdisk /dev/sdb  给第二块硬盘进行分区 ...

  8. Xdebug+Phpstorm远程调试

    开发环境: 本地 Windows10 日常开发使用的环境 装有PHPStorm 远程主机 Linux 服务器 装php-fpm/nginx等所有开发依赖环境 本地可以访问远程主机 但远程主机无法访问本 ...

  9. Linux查看进程所在目录

    通过ps 或 top 查看进程信息时,只能查到进程的相对路径,查不到进程的详细信息,如绝对路径等,我们可以通过下面的方法进行查询 1. 通过ll /proc/PID 命令查看进程所在的目录位置 lin ...

  10. C# 企业微信消息推送对接,实现天气预报推送

    C# 企业微信消息推送对接,实现天气预报推送 迷恋自留地 准备工作 需要获取的东西1. 企业Id,2.应用secret 和 应用ID 获取企业id 注册完成后,在我的企业=>企业信息=>最 ...