audio进度条(改进)

HTML5 audio标签自定义控制器

参照之前的修改下进度条,使进度条更美观

效果如下
在这里插入图片描述

代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      html {
        font-size: 50px;
      }
      body {
        margin: 0;
        padding: 0;
      }
      .mp3Box {
        display: flex;
        justify-content: space-between;
        align-items: center;
        /* width: 100%; */
        height: 1.08rem;
        border: 1px solid black;
        padding: 0 0.4rem;
      }
      .radioBox {
        width: 0.6rem;
        height: 0.6rem;
        /* border: 1px solid red; */
        border-radius: 50%;
        background: url(./bofan.jpg) no-repeat center center;
        background-size: 0.6rem 0.6rem;
      }

      .voice {
        width: 0.5rem;
        height: 0.5rem;
        border-radius: 50%;
        background: url(./voiceon.jpg) no-repeat center center;
        background-size: 0.5rem 0.5rem;
      }
      #yinliang {
        display: none;
        position: relative;
        top: 0.2rem;
        left: -2.14rem;
      }
      .time {
        font-size: 0.2rem;
        -moz-user-select: none;
        -webkit-user-select: none;
        user-select: none;
      }
      .progress {
        position: relative;
        width: 50%;
        height: 0.08rem;
        background-color: #ccc;
      }
      .slide {
        position: absolute;
        top: -0.1rem;
        width: 0.3rem;
        height: 0.3rem;
        border-radius: 50%;
        background-color: #3299cc;
        z-index: 9;
      }
      .fill{
        position: absolute;
        top: 0;
        height: 0.08rem;
        background-color: #3299cc;
      }
    </style>
  </head>
  <body>
    <div class="mp3Box">
      <!-- 播放开关 -->
      <div class="radioBox" onclick="bofan()">
        <audio id="ado"></audio>
      </div>
      <!-- 进度条 -->
      <div class="progress">
        <div class="slide"></div>
        <div class="fill"></div>
      </div>
      <!-- 时间 -->
      <div class="time">
        <span class="currentTime">00:00</span> /
        <span class="duraTime">00:00</span>
      </div>
      <!-- 是否静音 -->
      <div class="voice"></div>
    </div>
    <script>
      var audio = document.querySelector("#ado");
      // 音频地址
      audio.src =
        "http://antiserver.kuwo.cn/anti.s?useless=/resource/&format=mp3&rid=MUSIC_96409423&response=res&type=convert_url&";
      audio.controls = false;
      audio.loop = true;
      audio.volume = 0.3;
      var rBox = document.querySelector(".radioBox");
      rBox.appendChild(audio);
      //   调整声音是否静音
      var voice = document.querySelector(".voice");
      voice.addEventListener("click", function () {
        if (audio.muted) {
          audio.muted = false;
          voice.style.backgroundImage = "url(./voiceon.jpg)";
        } else {
          audio.muted = true;
          voice.style.backgroundImage = "url(./voiceoff.jpg)";
        }
      });
      //   播放暂停
      function bofan() {
        if (audio.paused) {
          audio.play();
          rBox.style.backgroundImage = "url(./zanting.jpg)";
        } else {
          audio.pause();
          rBox.style.backgroundImage = "url(./bofan.jpg)";
        }
      }

      //   获取音频总时长
      if (audio != null) {
        var duration;
        audio.load();
        audio.oncanplay = function () {
          var duraTime = document.querySelector(".duraTime");
          duraTime.innerHTML = transTime(audio.duration);
        };
      }
      //   格式化时间格式
      function transTime(time) {
        let duration = parseInt(time);
        let minute = parseInt(duration / 60);
        let sec = (duration % 60) + "";
        let isM0 = ":";
        if (minute == 0) {
          minute = "00";
        } else if (minute < 10) {
          minute = "0" + minute;
        }
        if (sec.length == 1) {
          sec = "0" + sec;
        }
        return minute + isM0 + sec;
      }
      // 时长进度条
      var progress = document.querySelector(".progress");
      var slide = document.querySelector(".slide");
      var fill = document.querySelector(".fill")
      audio.ontimeupdate = function () {
        var l = (audio.currentTime / audio.duration) * 100;
        slide.style.left = l + "%";
        fill.style.width = l + "%";
        if (audio.currentTime == 0) {
          slide.style.left = "0%";
        }
        var currentTime = document.querySelector(".currentTime");
        currentTime.innerHTML = transTime(parseInt(audio.currentTime));
        var duraTime = document.querySelector(".duraTime");
        duraTime.innerHTML = transTime(audio.duration);
      };
      // 点击进度条
      progress.onmousedown = function (e) {
        var rate = (e.clientX - progress.offsetLeft) / this.clientWidth*audio.duration
        audio.currentTime = rate-(progress.clientWidth*0.005)
      };
      //进度条拖动
      slide.onmousedown = function (e) {
        var x = e.clientX - this.offsetLeft; //240
        document.onmousemove = function (e) {
          var jlx = ((e.clientX - x) / progress.clientWidth) * 100;
          if (jlx <= 100 && jlx >= 0) {
            slide.style.left = jlx + "%";
          }
          audio.currentTime = (jlx / 100) * audio.duration;
        };
        document.onmouseup = function (e) {
          document.onmousemove = null;
          document.onmouseup = null;
        };
      };
      slide.ontouchstart = function (e) {
        var x = e.targetTouches[0].clientX - this.offsetLeft; //240
        document.ontouchmove = function (e) {
          var jlx = ((e.targetTouches[0].clientX - x) / progress.clientWidth) * 100;
          if (jlx <= 100 && jlx >= 0) {
            slide.style.left = jlx + "%";
          }
          audio.currentTime = (jlx / 100) * audio.duration;
        };
        document.ontouchend = function (e) {
          document.ontouchmove = null;
          document.ontouchend = null;
        };
      };
    </script>
  </body>
</html>


图片素材:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
小程序的audio组件可以让开发者方便地实现音频播放的功能。进度条是音频播放界面中经常用到的一种控件。在小程序中使用audio进度条可以让用户更加清晰地了解音频的播放进度,从而更好地掌握音频的播放状态。 实现audio进度条的方法比较简单。在audio组件中,可以使用onTimeUpdate事件来监听音频的播放进度。当音频播放时,该事件会不断触发,并携带当前的播放进度信息。开发者可以通过计算当前的播放进度与总时长的比值,得出当前进度条的位置,并动态更新进度条的UI。另外,如果需要实现进度条的拖动功能,也可以在进度条组件上设置bindchange事件,来监听用户对进度条的操作,并根据操作更新音频播放进度。 在实现audio进度条时,需要注意的一些点包括:首先,由于音频播放进度是不断变化的,因此需要在不断更新进度条UI的同时,尽量减少不必要的UI渲染操作,以提高程序的运行效率。其次,在用户暂停或拖动进度条时需要及时暂停或调整音频的播放进度,以保证播放的准确性。最后,在设计进度条样式时需要注意与整个应用程序的UI风格保持一致,以提高用户的使用体验。 总之,通过使用小程序的audio组件,并结合进度条控件的应用,能够为用户提供一个清晰、直观的音频播放体验,同时也有助于开发者更好地掌握和管理音频的播放进度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值