audio 自定义UI样式

这篇具有很好参考价值的文章主要介绍了audio 自定义UI样式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

audio 自定义UI样式

<template>
  <div class="audio-container">
    <audio :src="audiourl" ref="audioRef" @timeupdate="updateProgress" muted></audio>
    <div class="trumpet" @click="playAudio()">
        <img src="/img/btn-trumpet.png" class="labaPic" v-show="audioPlay" >
        <img src="/img/btn-mute.png" class="labaPic" v-show="!audioPlay">
    </div>
    <div class="slider-runnable-background">
      <div class="slider-runnable">
          <input type="range" :value=sliderValue ref="silderAudio" :style="sliderStyle" @change="aduioChange">
      </div>
      <div class="timer">
        {{audioStart}}
      </div>
    </div>

  </div>

</template>

<script>

export default {
  name: "audioPlayerSelf",
  props:{
    audiourl: {
      type: String,
      default: "/static/mp3/语音待添加.mp3"
    }
  },
  data(){
    return {
      audioPlay: false,
      audioStart: '00:00',
      audioDuration: '00:00',
      sound: false,
      sliderValue: 0,
      sliderStyle:{
       backgroundSize: '0% 100%'
      }
    }
  },
  mounted() {
    this.$refs.audioRef.volume = 1; // 获取audio元素
    this.updateTimeAudio();
    this.fetch();
    // 修改初始 值为null 的bug
    this.sliderValue=0
  },
  created() {

  },
  methods:{
    fetch() {
      let that = this
      var myVid = this.$refs.audioRef
      myVid.loop = false
      if (myVid != null) {
        myVid.oncanplay = function () {
          that.audioDuration = that.transTime(myVid.duration) // 计算音频时长
        }
        myVid.volume = 1 // 设置音量100%
      }
    },

    aduioChange(){
      let silder = this.$refs.silderAudio
      let curVal = parseFloat(silder.value);
      this.sliderValue = curVal
      this.sliderStyle = {
        backgroundSize: `${curVal}%, 100%`
      }
      let audio = this.$refs.audioRef
      audio.currentTime = audio.duration * curVal /100
      audio.play()
      this.audioPlay=true
    },
  
    // 更新进度条与当前播放时间
    updateProgress(e) {
      var value = e.target.currentTime / e.target.duration
      if (this.$refs.silderAudio) {
        this.sliderValue = value * 100
        if (e.target.currentTime === e.target.duration) {
      
          this.audioPlay = false
        }
      } else {
  
        this.audioPlay = false
      }
      this.audioStart = this.transTime(this.$refs.audioRef.currentTime)
    },

    // 播放暂停控制
    playAudio() {
      let recordAudio = this.$refs.audioRef // 获取audio元素

      if (this.audioPlay) {
        recordAudio.pause()
        this.audioPlay = false
      } else {
        recordAudio.play()
        this.audioPlay = true
      }
    },
    // 暂停语音
    YuYinPause(){
      let recordAudio = this.$refs.audioRef // 获取audio元素
      if(recordAudio.playing){
        recordAudio.pause()
        this.audioPlay = false
      }
    },
    /**
     * 音频播放时间换算
     * @param {number} value - 音频当前播放时间,单位秒
     */
    transTime(time) {
      var duration = parseInt(time)
      var minute = parseInt(duration / 60)
      var sec = (duration % 60) + ''
      var isM0 = ':'
      if (minute === 0) {
        minute = '00'
      } else if (minute < 10) {
        minute = '0' + minute
      }
      if (sec.length === 1) {
        sec = '0' + sec
      }
      return minute + isM0 + sec
    },
  },
  watch:{
    sliderValue(){
      this.sliderStyle = {
        backgroundSize: `${this.sliderValue}%, 100%`
      }
    },
  }
}
</script>

<style lang="scss" scoped>
.audio-container{
  display: flex;
  justify-content: space-between;

  .labaPic{
  width: 62px;
  height: 62px;
  }
}

.slider-runnable-background{

  width: 629px;
  height: 62px;
  background-color: #dddede;
  border-radius: 100px;
  margin-left: 20px;

  display: flex;
  align-items: center;


  .slider-runnable{
    display: flex;
    margin-left: 8px;
  }

  .timer{
    margin-left: 10px;
    font-size: 16px;
  }
}

input[type="range"] {
  width: 495px;
  -webkit-appearance: none;
  height: 8px;
  border-radius: 4px;
  background-image: -webkit-linear-gradient(#727272, #727272);
  background-repeat: no-repeat;
  background-color: white;
}

input[type="range"]::-webkit-slider-thumb {
  -webkit-appearance: none;
  background-color: #fff;
  width: 30px;
  height: 30px;
  border-radius: 30px;
  cursor: pointer;
}

input[type="range"]::-webkit-slider-thumb:hover {
  background: #666;
}
</style>

参考文档:
HTMLMediaElement: abort event
HTML5新特性——自定义滑动条(input[type=“range”])
vue自定义音频audio样式及操作面板文章来源地址https://www.toymoban.com/news/detail-488672.html

到了这里,关于audio 自定义UI样式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Naive-UI自定义TabPane样式

    前端开发通常使用 第三方 UI 组件库,像大家熟悉的 Element-UI、AntD Vue 等 最近发现一个 还比较好用的 组件库 Naive-UI 传送门 ,Vue 3 组件库, 使用 TypeScript , 用起来感觉还不错,它的主题也可以切换 (有暗夜模式),缺点可能就是提供的组件代码示例 比较少 很多页面都需要

    2024年02月07日
    浏览(45)
  • Element Ui 树形组件自定义样式与功能

    一、功能描述:可实现树节点内容修改、增加节点、删除节点等,根据层级不同显示不同的图标等,已封装成组件。 二、调用组件示例: 三、效果图如下:

    2024年02月15日
    浏览(39)
  • element-ui 自定义loading加载样式

    element-ui 中的 loading 加载功能,默认是全屏加载效果, 设置局部,需要自定义样式,自定义的方法如下:

    2024年02月11日
    浏览(51)
  • 自定义element-ui走马灯(轮播)样式

    自定义el-carousel-item指示器样式 把指示器变成圆点 效果图:  

    2024年02月13日
    浏览(43)
  • element ui组件的自定义类名样式不生效

    element ui中,类似描述列表这种组件  会提供自定义类名属性    需要注意,样式不能写在style scoped标签中,会被vue自动加上data-v属性,导致样式失效。 必须写在style标签里      

    2024年02月13日
    浏览(44)
  • 自定义日历.element-ui 修改时间选择器样式

    目录 一、自定义日历 二、时间选择样式自定义 先上效果图 已经封装成vue组件,可选择切换年月:  因 element-UI的时间选择器 el-date-picker 是将元素直接挂载到页面的 body 中,而非自身元素下,所以使用  /deep/、 、  ::v-deep  等穿透无法定位到元素。 解决方案: 利用时间选择

    2024年02月12日
    浏览(50)
  • USB Audio Class (UAC)音频解读规范

    USB 音频非常流行,原因之一是USB Audio 是USB 标准的一部分,因此原生模式驱动程序可用于所有流程的操作系统(Win Linux Mac)。USB 音频是一种灵活的解决方案,因为任何PC都提供USB接口。 提示:以下是本篇文章正文内容 USB Audio Class ,USB音频类,一个像USB这样的通用数据接口,可

    2023年04月08日
    浏览(39)
  • Template Pattern —— Behavioral Class

    钩子方法(Hook Method)之所以被称为“钩子”,是因为它在算法或流程中提供了一个“钩子”,允许子类在特定的点上“钩入”自己的实现逻辑,从而影响算法的行为或流程的执行。 它类似于一个挂钩、锚点,所以叫Hook method, 它允许子类插入自定义的代码来改变或扩展算法的

    2024年02月10日
    浏览(37)
  • Component template should contain exactly one root element

    报错的大致意思是:组件的模板应该只能包含一个根元素,也就是是说作为元素的直系儿子的元素只能有一个。报错的goods.vue中的中的内容如下图所示:

    2024年02月15日
    浏览(40)
  • element-ui form表单自定义label的样式、内容

    element-ui form表单自定义label的样式、内容

    2024年04月17日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包