广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue使用H5的audio标签问题
  • 632
分享到

vue使用H5的audio标签问题

vue使用H5H5的audio标签vue audio标签 2022-12-08 20:12:31 632人浏览 八月长安
摘要

目录使用H5的audio标签Vue中自定义audio总结使用H5的audio标签 template代码: <audio ref="audio" :src="audioUrl"&

使用H5的audio标签

template代码:

<audio ref="audio" :src="audioUrl"></audio>

data里绑定audioUrl为audio的路径

audioUrl: 'static/audio/notify.wav' // 声音源

按钮播放声音:

click () {
    this.$refs.audio.play()
}

vue中自定义audio

一个页面上创建很多audio标签 并且自定义样式播放。

首先创建可以增删的播放列表CSS就不再显示了

<div class="d_andio_wrap">
          
          <div class="d_audio" v-for="(item,index) in audioList" :key="index">
            <audio id="audioMedia"  :src="item.src" @timeupdate="updateTime" ref='audioMedia' @ended="end"></audio>
            <img v-if="!item.isplay" class="img" src="../../../assets/images/icon_play.png" alt="" @click="playAudio(index)">
            <img v-if="item.isplay" class="img" src="../../../assets/images/icon_pause.png" alt="" @click="pauseAudio(index)">
            <div class="audio_body">
              <div class="audio_title">
                <span>{{item.title}}</span>
              </div>
              <div class="audio_info">
                <span class="audio_live">{{item.play_live | audioTime}}</span>
                <div class="audio_progress"  @mousedown.self="mousedown($event,index)">
                  <div class="audio_progress_line" :style="{width:item.play_live/item.play_time*100+'%'}" @mousedown.self="mousedownP($event,index)"></div>
                  <div class="audio_progress_dot" :style="{left:item.play_live/item.play_time*100+'%'}"  @mousedown.self="drag('audio_progress_dot',index)"></div>
                </div>
                <span class="audio_live">{{item.play_time | audioTime}}</span>
              </div>
            </div>
            <i class="el-icon-error"  @click="deleteAudio(index)"></i>
          </div>
        </div>

data数据

        audioList:[
        {
          title:'龙的传人',
          key:0,
          videoid:'',
          src:"ssssss.mp3",
          play_live:0,
          play_time:'154',
          isplay:false,//是否播放
        },
        {
          title:'龙的传人',
          key:0,
          videoid:'',
          src:"sssssss.mp3",
          play_live:0,
          play_time:'154',
          isplay:false,//是否播放
        }
      ],

删除音频,增加音频就不再写了

 //删除音频
    deleteAudio(index){
      this.audioList.splice(index, 1);
    },

然后点击播放、暂停、 监听音频当前时间以及播放完毕

//播放音频
    playAudio(index){
      let _this =this;
      let audioMedia = this.$refs.audioMedia;//获取所有audio对象
      this.audioList[this.playAudioIndex].isplay = false;//上一个播放的audio图片换为暂停
      audioMedia[this.playAudioIndex].pause();//上一个播放的audio暂停
      this.audioList[index].isplay = true;//把当前audio图片设置为播放状态
      //当前audio延时播放--此处处理是由于updateTime在获取当前播放时长时,会获取一次上个audio的播放时长,才能获取到当前时长,页面播放进度会跳一下
      setTimeout(()=>{
        audioMedia[index].currentTime = this.audioList[index].play_live;
        audioMedia[index].play();
        _this.playAudioIndex = index;
      },100)
      // console.log(this.audioList[index].play_live)
    },
    //暂停音频
    pauseAudio(index){
      let audioMedia = this.$refs.audioMedia;
      this.audioList[index].isplay = false;
      audioMedia[index].pause();
    },
    //音频监测当前时间
    updateTime(e){
        let _this = this;
        // _this.$set(_this.audioList[_this.playAudioIndex],"play_live",_this.audioList[_this.playAudioIndex].play_live);
        //用秒数来显示当前播放进度
        // console.log(e.target.currentTime)
        let timeDisplay = Math.floor(e.target.currentTime);//获取实时时间
        _this.$set(_this.audioList[_this.playAudioIndex],"play_live",timeDisplay);
    },
    //音频监测播放完毕
    end(e){
      console.log(e)
      this.audioList[this.playAudioIndex].isplay = false;
    },

实现了播放之后,再处理点击播放

这里注意的e.clientX offsetLeft e.target.offsetLeft

//点击的是未拖动过进度的进度条
    mousedown(e,index){
      let audioMedia = this.$refs.audioMedia;
      //父级
      let fdrag = document.getElementsByClassName("d_andio_wrap")[0];
      //点击时离左边框距离  e.clientX点击的那个点离浏览器左边距  fdrag.offsetLeft父级离浏览器距离  e.target.offsetLeft事件源离父级左边框距离
      let targetLeft = e.clientX-fdrag.offsetLeft-e.target.offsetLeft;
      //获取事件源的宽度
      let targetWidth = e.target.offsetWidth;
      //根据百分比转化成音频想要的秒数
      let play_live = Math.floor((targetLeft/targetWidth)*this.audioList[index].play_time);

      // console.log(targetLeft,targetWidth);
      this.audioList[index].play_live = play_live;
        
      //判断播放状态时直接跳转播放
      if(!audioMedia[index].paused){
        // console.log('播放')
        audioMedia[index].currentTime = play_live;
      }
      
    },
    //点击已经播放的进度条 但是要使用class = audio_progress的宽度以及距左边的距离
     mousedownP(e,index){
      let audioMedia = this.$refs.audioMedia;
      //父级
      let fdrag = document.getElementsByClassName("d_andio_wrap")[0];
      //进度条底色的总长度作为进度条总宽度
      let zdrag = document.getElementsByClassName("audio_progress")[0];
      //点击时离左边框距离  e.clientX点击的那个点离浏览器左边距  fdrag.offsetLeft父级离浏览器距离  zdrag.offsetLeft事件源离父级左边框距离
      let targetLeft = e.clientX-fdrag.offsetLeft-zdrag.offsetLeft;
      //获取事件源的宽度
      let targetWidth = zdrag.offsetWidth;
      //根据百分比转化成音频想要的秒数
      let play_live = Math.floor((targetLeft/targetWidth)*this.audioList[index].play_time);
      // console.log(play_live);
      this.audioList[index].play_live = play_live;
      //判断播放状态时直接跳转播放
      if(!audioMedia[index].paused){
        // console.log('播放')
        audioMedia[index].currentTime = play_live;
      }
    },

拖动进度条

 drag(element,index) {
      let elementIndex = index;
      let audioMedia = this.$refs.audioMedia;
      //事件源
      let _this = this;
      let drag = document.getElementsByClassName(element)[index];
      let draGoffsetLeft = drag.offsetLeft;
      //父级容器的宽高 -- 避免在容器外拖拽
      let fdrag = document.getElementsByClassName("audio_progress")[index];
       //获取事件源的宽度  这里是因为圆点的宽度为drag.offsetWidth  不减去本身宽度不能够精确地表示出音频长短  也可以在moveX 加上drag.offsetWidth
      let fdragWidth = fdrag.offsetWidth - drag.offsetWidth;
      let diffX;//fdrag离浏览器左边的固定距离
      let diffY;
      let play_live;
      drag.onmousedown = function(event) {
        let e = event || window.event;
        //e.clientX 鼠标离浏览器边框的距离  drag.offsetLeft鼠标离事件源左边框距离
        e.preventDefault();
        diffX = e.clientX - drag.offsetLeft;
        if (typeof drag.setCapture !== "undefined") {
          drag.setCapture();
        }
         document.onmousemove = function(event) {
          let e = event || window.event;
          let moveX = e.clientX - diffX;//移动时的距离
          if (moveX <= 0) {
            moveX = 0;
          } else if (moveX > fdrag.offsetWidth - drag.offsetWidth) {
            moveX = fdrag.offsetWidth - drag.offsetWidth;
          }
          
          play_live = Math.floor((moveX/fdragWidth)*_this.audioList[elementIndex].play_time);
          _this.audioList[elementIndex].play_live = play_live;
          
        };
        document.onmouseup = function(event) {
          
          this.onmousemove = null;
          this.onmouseup = null;
          if (typeof drag.setCapture !== "undefined") {
            drag.setCapture();
          }
          //判断播放状态时直接跳转播放
            if(!audioMedia[elementIndex].paused){
              // console.log('播放')
              audioMedia[elementIndex].currentTime = play_live;
            }
        };
      };
      
    },

小结:同一个页面如果只创建一个audio时,也可以实现切换src进行播放,但是在跳转时间点播放时失效,可能的原因是在切换src后,音频没有缓存,导致从0开始播放了。

在点击跳转时,点击进度条上面时要注意事件源的不同,从而导致获取的距浏览器距离已经距左边框距离的错误。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: vue使用H5的audio标签问题

本文链接: https://www.lsjlt.com/news/174279.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue使用H5的audio标签问题
    目录使用H5的audio标签vue中自定义audio总结使用H5的audio标签 template代码: <audio ref="audio" :src="audioUrl"&...
    99+
    2022-12-08
    vue使用H5 H5的audio标签 vue audio标签
  • 怎么使用h5新增的audio与video标签
    本篇内容主要讲解“怎么使用h5新增的audio与video标签”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用h5新增的audio与video标签”吧! ...
    99+
    2022-10-19
  • H5页面使用audio标签播放音频
    H5页面播放音乐其实很简单,只需要用<audio>这个标签就行十分方便。 路径选在音乐所在位置就行了。 <audio id="bgMusic" src="js/2....
    99+
    2023-03-07
    audio标签的使用方法 audio标签支持的音频格式 audio标签自动播放
  • H5页面如何使用audio标签播放音频
    本篇内容主要讲解“H5页面如何使用audio标签播放音频”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“H5页面如何使用audio标签播放音频”吧!H5页面播放音乐其实很简单,只需要用<au...
    99+
    2023-07-05
  • HTML5的audio标签和video标签怎么使用
    这篇文章主要介绍了HTML5的audio标签和video标签怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇HTML5的audio标签和video标签怎么使用文章都会有所...
    99+
    2022-10-19
  • html5的audio标签如何使用
    这篇文章主要介绍“html5的audio标签如何使用”,在日常操作中,相信很多人在html5的audio标签如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”html5的...
    99+
    2022-10-19
  • HTML5中audio标签的使用方式
    本篇内容主要讲解“HTML5中audio标签的使用方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“HTML5中audio标签的使用方式”吧!在HTML5标准网...
    99+
    2022-10-19
  • 解决vue的component标签渲染问题
    目录component标签渲染问题vue如何识别import对象和require对象component组件嵌套,导致页面重复渲染,重复请求的bug错误代码正确代码component标...
    99+
    2022-11-13
  • 如何解决vue的component标签渲染问题
    这篇文章主要介绍了如何解决vue的component标签渲染问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。component标签渲染问题最近遇到一个问题,就是通过Load...
    99+
    2023-06-29
  • vue中怎么使用h5 video标签实现弹窗播放本地视频
    这篇“vue中怎么使用h5 video标签实现弹窗播放本地视频”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue...
    99+
    2023-06-30
  • html5 音乐播放器 audio 标签使用是怎样的
    html5 音乐播放器 audio 标签使用是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 代码如下:...
    99+
    2022-10-19
  • 关于vue中标签的属性绑定值渲染问题
    目录标签的属性绑定值渲染问题最终解决办法vue标签属性条件渲染1、v-bind2、v-if和v-show的区别标签的属性绑定值渲染问题 在项目中遇到一个棘手的问题,给span标签添加...
    99+
    2022-11-13
  • html使用a标签要注意的问题有哪些
    这篇文章将为大家详细讲解有关html使用a标签要注意的问题有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 当我们定义a{color:red;}时,它代表了A的四种...
    99+
    2022-10-19
  • vue在使用element组件出现<el-input>标签无法输入的问题
    目录使用element组件出现<el-input>标签无法输入第一种情况第二种情况el-input无法输入产生原因总结使用element组件出现<el-input&...
    99+
    2023-05-17
    vue使用element组件 el-input标签无法输入 vue element el-input标签
  • 如何解决H5的a标签的download属性下载service上的文件出现跨域问题
    小编给大家分享一下如何解决H5的a标签的download属性下载service上的文件出现跨域问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1.通过点击下载多媒体文件(图片/视频/文件...
    99+
    2022-10-19
  • 关于Vue中使用alibaba的iconfont矢量图标的问题
    网上有很多引入方法,官方也给出了三种引入方法,但是大多数人引入后都不会显示,或者是不能自定义样式,下面这种方法不会存在上面的那些问题,是目前最好的引入方式。 1、网址 阿里巴巴矢量图...
    99+
    2022-11-12
  • Vue中transition标签的基本使用教程
    目录transition 标签配合 animation配合 transitiontransition-group 标签动画库 animate.css总结transition 标签 t...
    99+
    2022-11-13
  • vue elementUi中的tabs标签页使用教程
    目录前言一、整体页面布局与完成效果二、代码编写1.标签页引入2.标签页参数设置2.1 标签页主要参数2.2 打开和切换标签页方法2.3 mainview中添加数据2.4 侧边栏相关设...
    99+
    2023-03-23
    elementui tabs标签页 elementui的tab切换 element ui tab页
  • vue elementUi中的tabs标签页如何使用
    本文小编为大家详细介绍“vue elementUi中的tabs标签页如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue elementUi中的tabs标签页如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路...
    99+
    2023-07-05
  • 如何解决png图片在html中IMG标签使用问题
    这篇文章给大家分享的是有关如何解决png图片在html中IMG标签使用问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 规画png图片在html中IMG标签使用PNG图片IE...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作