Vue自定义封装音频播放组件(带拖拽进度条)

news2024/11/29 0:51:11

Vue自定义封装音频播放组件(带拖拽进度条)

描述

该款自定义组件可作为音频、视频播放的进度条,用于控制音频、视频的播放进度、暂停开始、拖拽进度条拓展性极高。

实现效果

在这里插入图片描述

具体效果可以根据自定义内容进行位置调整

项目需求
  1. 有播放暂停按钮
  2. 进度条可以跟随播放丝滑更新
  3. 有当前播放时间和总时间可以根据播放更新当前时间
  4. 可以点击进度条的某一处跳转到指定处进行播放
技术栈

vue2/vue3+elementUI || elementPlus || vant

功能实现
  <template>
    <div class="audio_wrap_content" :style="[{ backgroundColor: bgColor }]">
      <audio
        ref="audio"
        @play="playFunc"
        @pause="pauseFunc"
        @timeupdate="timeupdateFunc"
        @loadedmetadata="onLoadedmetadata"
        @ended="handleEnd"
      >
        <source :src="audioSrc" />
      </audio>
      <div class="cudio_control_content">
        <img
          @click="startPlayOrPause"
          class="state_img"
          :src="audio.playing ? stopImg : playImg"
          alt=""
        />
        <div class="state_time" style="marginRight:5px">{{audio.currentTime | formatSecond}}</div>
            <div class="slider">
                <el-slider v-model="sliderTime" :show-tooltip="false" @change="onChange"></el-slider>
            </div>
        	<!-- 这块代码是移动端的vant组件库可用于移动端H5 (如要用此代码则需要将css中的.slider:flex:1去掉 并将slider类名div注释即可) -->
            <!-- <van-slider
                v-model="sliderTime"
                bar-height="1px"
                active-color="#ffb900"
                button-size="4px"
                @change="onChange"
                >
                <template #button>
                    <div class="custom-button"></div>
                </template>
            </van-slider> -->

        <div class="state_time" style="marginLeft:5px">{{audio.maxTime | formatSecond}}</div>
      </div>
    </div>
  </template>
  
  <script>
  function formatTime(second) {
    let m = parseInt(second / 60);
    let s = parseInt(second % 60);
    let formatTime = "";
    if(second==0){
      return "0'00''"
    }
    if (m == 0) {
      if(s>=10){
        formatTime = "0'"+ s + "''";
  
      }else{
        formatTime = "0'0"+ s + "''";
      }
    } else {
      if(s>=10){
        formatTime = m + "'" + s + "''";
      }else{
        formatTime = m + "'0" + s + "''";
      }
    }
    return formatTime
  }
  export default {
    name: "AudioPlay",
    props: {
      bgColor: {
        type: String,
        default: "rgba(255,255,255,0.15)",
      },
      audioSrc: {
        type: String,
        default: require("@/assets/music/offer_des.mp3"),
      },
      themeColor: {
        type: String,
        default: "#ffb900",
      },
    },
    data() {
      return {
        value1:1,
        playImg: require("@/assets/images/play.png"),
        stopImg: require("@/assets/images/stop.png"),
        sliderTime: 0,
        audio: {
          maxTime: 0 /* 音频最大播放时长 */,
          currentTime: 0 /* 当前播放时长 */,
          playing: false /* 音频当前处于播放/暂停状态 */,
        },
      };
    },
    methods: {
      /* 播放音频 */
      play() {
        console.log("触发 播放");
        this.$refs.audio.play();
      },
      /* 暂停音频 */
      pause() {
        this.$refs.audio.pause();
      },
      /** 当音乐播放 */
      playFunc() {
        this.audio.playing = true;
      },
      /** 当音乐暂停 */
      pauseFunc() {
        this.audio.playing = false;
      },
      /** 当音乐结束 */
      handleEnd(){
        this.sliderTime = 0
        this.audio.playing = false
        this.audio.currentTime = 0
      },
      /* 每秒触发一次 用来更新当前播放时间 */
      timeupdateFunc(res) {
        this.audio.currentTime = res.target.currentTime
        /* 当音频播放时 进度条也要随之改变 */
        this.sliderTime = parseInt(this.audio.currentTime / this.audio.maxTime * 100)
      },
      /* 音频加载完成后的回调函数 */
      onLoadedmetadata(res) {
        console.log(111,'首次加载完成');
        this.audio.maxTime = parseInt(res.target.duration);
      },
      /* 控制音频播放、暂停 */
      startPlayOrPause() {
        console.log("bof",'暂停-播放');
        this.audio.playing ? this.pause() : this.play();
      },
      /* 拖动进度条,改变当前时间 value是进度条改变时的回调函数的参数 值为0~100之间,需要换算成实际时间 */
      onChange(value){
        console.log(value,'values');
        this.$refs.audio.currentTime = parseInt(value / 100 * this.audio.maxTime)
        // console.log(this.$refs.audio.currentTime , 'this.$refs.audio.currentTime ');
      }
    },
    filters: {
      formatSecond(second=0){
        return formatTime(second)
      }
    },
  };
  </script>
  
  <style scoped lang="less">
  .audio_wrap_content {
    // width: 180px;
    height: 26px;
    border-radius: 15px;
    // transform: translateX(-25px);
  }
  
  .cudio_control_content {
    margin: 0 auto;
    width: 90%;
    height: 100%;
    display: flex;
    .slider{
        flex:1
    }
    justify-content: space-between;
    align-items: center;
    
    .state_img {
      width: 18px;
      height: 18px;
    }
  
    .custom-button {
      width: 8px;
      background-color: #ffb900;
      height: 8px;
      border-radius: 8px;
    }
  
    .state_time {
      font-family: "BIGJOHN";
      font-size: 10px;
      color: rgba(34, 34, 34, 0.3);
      margin-right: 3px;
      margin-left: 3px;
    }
  }
  </style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1659040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

element ui的确认提示框文字样式修改

修改确认提示框的默认按钮样式&#xff0c;使用message属性修改&#xff1a; 例&#xff1a; js代码&#xff1a; this.$msgbox({title: 确定要删除吗?,message: this.$createElement(p, null, [this.$createElement(span, { style: color: red }, 该素材一旦删除&#xff0…

Ubuntu20.04右键打不开终端

今天用virtualbox安装了ubuntu20.04 问题&#xff1a;右键打开终端&#xff0c;怎么也打开不了&#xff01; 点了也没反应&#xff0c;或者鼠标转小圈圈&#xff0c;然后也没有反应… 解决方法&#xff1a; 1、Ctrl Alt F6 先切换到终端访问界面 mac电脑 Ctrl Alt F6 …

制鞋5G智能工厂数字孪生可视化平台,推进行业数字化转型

制鞋5G智能工厂数字孪生可视化平台&#xff0c;推进行业数字化转型。随着科技的飞速发展&#xff0c;5G技术与智能制造的结合正成为推动制鞋行业数字化转型的重要力量。制鞋5G智能工厂数字孪生可视化平台&#xff0c;不仅提高了生产效率&#xff0c;还优化了资源配置&#xff0…

大数据分析案例-基于随机森林算法构建银行贷款审批预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

123. SQL优化技巧汇总

文章目录 1 避免使用select *2 用union all代替union3 小表驱动大表4 批量操作5 多用limit6 in中值太多7 增量查询8 高效的分页9 用连接查询代替子查询10 join的表不宜过多11 join时要注意12 控制索引的数量13 选择合理的字段类型14 提升group by的效率15 索引优化 sql优化是一…

绝地求生:杜卡迪联动下架,兰博基尼联动预计在下半年上线!

杜卡迪联名活动即将在5月8日上午八点下架&#xff0c;届时商城内购买-升阶活动将不可用。 杜卡迪下架 本次杜卡迪联名是蓝洞首次以非通行证方式进行的载具联名活动&#xff0c;玩家认为有利有弊。 多数玩家表示非通行证-仅抽奖获取的方式成本太高&#xff0c;部分脸黑玩家本次…

科林算法_3 图

一、图论基础 多对多的关系 定义&#xff1a;G(V,E) Vertex顶点 Edge边 顶点的集合V{v1,v2} 边的结合E{(v1,v2)} 无向图(1,2) 有向图<1,2> 依附&#xff1a;边(v1,v2)依附于顶点v1,v2 路径&#xff1a;&#xff08;v1,v2)(v2,v3) 无权路径最短&#xff1a;边最少…

CMake创建跨平台OPenGL工程(学习笔记)

一、跨平台环境基本配置 1、环境搭建 1&#xff09;linux OpenGL环境搭建参考&#xff1a;ubuntu18.04 OpenGL开发&#xff08;显示YUV&#xff09;_ubuntu opengl-CSDN博客 https://blog.51cto.com/cerana/6433535 2&#xff09;windows下环境搭建 OpenGLVisual Studio20…

前端css中线性渐变(linear-gradient)的使用

前端css中线性渐变 一、前言二、关键词句三、主要内容说明&#xff08;一&#xff09;、线性渐变方向1.角度调整方向2.负值角度&#xff0c;源码13.源码1运行效果4.关键字调整方向5.to right向右线性渐变&#xff0c;源码26.源码2运行效果 &#xff08;二&#xff09;、线性渐变…

hyper-v启动centos7虚拟机不能联网

虚拟网卡要和之前虚拟机里面设置的GATEWAY一致。 安装CentOS遇到Error setting up base repository换url 或者换镜像包iso(这个有用&#xff09; 没掌握摸Yu的精髓 好累啊

Linux 中 POSIX 互斥信号量(互斥锁)的使用

目录 一、互斥锁的介绍二、使用方法三、测试代码 一、互斥锁的介绍 在Linux系统中&#xff0c;特别是在ARM架构的嵌入式系统中&#xff0c;互斥量&#xff08;Mutex&#xff09;用于保护共享资源不被多个线程或任务同时访问&#xff0c;从而防止数据竞争和不一致性。 POSIX 互斥…

Springboot集成Mybatispuls操作mysql数据库-04

MyBatis-Plus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强而不做改变。它支持所有MyBatis原生的特性&#xff0c;因此引入MyBatis-Plus不会对现有的MyBatis构架产生任何影响。MyBatis-Plus旨在简化开发、提高效率&#xff0c;…

JavaEE企业级开发中常用的Stream流

介绍 在Java编程中&#xff0c;Stream流是Java 8引入的一个重要概念&#xff0c;它提供了一种新的处理集合的方式&#xff0c;可以更加简洁、高效地进行数据操作。Stream流支持各种常见的操作&#xff0c;比如过滤、映射、排序、聚合等&#xff0c;同时也支持并行处理&#xf…

Go的安装与配置

安装 https://go.dev/dl/ 以Windows上安装为例&#xff1a; 下一步下一步&#xff0c;记住安装位置 安装完成后 win rcmd 键入go version检查是否安装成功 配置 Go 工作区 Go 在组织项目文件方面与其他编程语言不同。 Go 是在工作区的概念下工作的。但是从版本 1.11 开始&…

Dreamweaver 2021 for Mac 激活版:网页设计工具

在追求卓越的网页设计道路上&#xff0c;Dreamweaver 2021 for Mac无疑是您的梦幻之选。这款专为Mac用户打造的网页设计工具&#xff0c;集强大的功能与出色的用户体验于一身。 Dreamweaver 2021支持多种网页标准和技术&#xff0c;让您能够轻松创建符合现代网页设计的作品。其…

RespeakPro对口型数字人使用教程

RespeakPro可以将您的视频与音频生成100%精准对口型的视频。与Respeak差别是效率高效果更好。是自媒体制作数字人视频必备黑科技AI. 支持多国语言音频和唱歌音频对口型! 1&#xff1a;系统要求 软件运行支持32/64位window 10/11系统, 无硬件要求,不用显卡也能快速运行。 2&a…

vue+springboot实现excel批量数据的导入导出

①后端配置端口&#xff1a;修改UserController UserController&#xff1a; package com.example.springboot.controller;import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.…

教大家一键下载1688图片信息

电商图片是商品的视觉身份证&#xff0c;对销量有着决定性影响。它们不仅是展示产品&#xff0c;更是讲述品牌故事&#xff0c;激发情感共鸣的工具。高质量的图片能瞬间吸引顾客目光&#xff0c;准确传达产品细节&#xff0c;建立起顾客的信任与购买意愿。在无法亲身体验商品的…

全自动减压器法二氧化碳气容量测试仪:饮料行业的革新与未来

全自动减压器法二氧化碳气容量测试仪&#xff1a;饮料行业的革新与未来 一、引言 在追求品质与效率的现代饮料生产领域&#xff0c;全自动减压器法二氧化碳气容量测试仪凭借其高精度、高效率及无人工干预的显著优势&#xff0c;正逐渐成为行业的标杆。特别是在碳酸饮料的生产中…

【考古篇】Attension is all you need

Transformer 文章目录 Transformer1. What2. Why3. How3.1 Encoder3.2 Decoder3.3 Attention3.4 Application3.5 Position-wise Feed-Forward Networks(The second sublayer)3.6 Embeddings and Softmax3.7 Positional Encoding3.8 Why Self-Attention 1. What A new simple n…