项目中遇到了,让实现一个音乐播放器的功能。修改其样式要求自定义,切需要有,进度条,时间,开关,应用于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. 92. 反转链表 II Golang实现

    题目描述: 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right .请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 ...

  2. 2个月搞定计算机二级C语言——真题(9)解析

    1. 前言 本篇我们讲解2个月搞定计算机二级C语言--真题9 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include <stdio.h> double f1(double ...

  3. PXI板卡的封装和接口形式

    PXI模块 PXI标准同时定义了3U和6U模块适用的机械尺寸与连接器形式.3U模块在模块底部安装有一个助拔手柄.在顶部和底部通过螺钉固定,底部的固定螺钉部分隐藏在助拔手柄中.占用超过一个槽位的模块可以 ...

  4. P3920 WC2014 紫荆花之恋

    P3920 WC2014 紫荆花之恋 毒瘤题目,动态点分树. 前置科技点 替罪羊树 高速平衡树(除去 fhq_treap 和 splay 之外的所有平衡树) 约定 \(dis(u,v)\) 为原树上 ...

  5. 鸿蒙hvigor构建任务依赖与生命周期简介

    Hivgor脚本文件 在构建的生命周期中Hvigor使用两个脚本文件来完成插件.任务以及生命周期hook的注册: hvigorconfig.ts:此文件在整个项目中只有根目录下存在一份,不是构建必须的 ...

  6. 国产数据库oceanBbase,达梦,金仓与mysql数据库的性能对比 四、python读mysql写入达梦数据库

    一.说明 安装达梦的驱动 pip install dmPython==2.5.5 参数接收那里,其他数据库都是用%,达梦要用? 二.源码 #coding=utf-8 import pymysql im ...

  7. (Redis基础教程之十三) 如何从命令行更改Redis的配置

    介绍 Redis是一个开源的内存中键值数据存储.Redis有几个命令,可让您即时更改Redis服务器的配置设置.本教程将介绍其中一些命令,并说明如何使这些配置更改永久生效. 如何使用本指南 本指南以备 ...

  8. 桌面应用开发之Electron

    Electron 官网: https://www.electronjs.org/ Electron是一个使用JavaScript.HTML和CSS构建跨平台的桌面应用程序.它基于Node.js和Chr ...

  9. mac通过网线连接主机(fnOS)

    一.mac端 mac是typec的,用了个转接头+网线直连主机,初始化的时候跟下面一致,默认都是自动的 点击详细信息,配置IPv4选择使用DHCP 二.主机端 主机端是最麻烦的,刚开始的时候怎么也找不 ...

  10. 试了下Cursor,感觉程序员工种危险了

    大家好,我是汤师爷~ 今年8月份,AI 编程工具 Cursor 在开发者社区彻底火了.在 Twitter 平台上,Cloudflare 副总裁分享了一段视频,展示了一个令人震惊的案例.他年仅 8 岁的 ...