html + js + css 实现可拖拽音频播放器

52 篇文章 1 订阅
38 篇文章 0 订阅

效果图

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .audio-container{
      width:343px;
      height:44px;
      border-radius:22px;
      border:1px solid rgba(224,225,239,1);
      display: flex;
      align-items: center;
      padding: 0 12px;
    }
    .play-pause{
      width: 24px;
      height: 24px;
      cursor: pointer;
    }
    .progress-container{
      flex: 1;
      display: flex;
      align-items: center;
    }
    .progress-box{
      flex: 1;
      height:2px;
      background:rgba(241,241,241,1);
      border-radius:5px;
    }
    .progress-bar{
      width: 0;
      height:2px;
      background:rgba(115,164,255,1);
      border-radius:5px;
      position: relative;
    }
    .progress-dragger{
      width: 14px;
      height: 14px;
      background: url('./circle.png') no-repeat;
      background-size: 100%;
      position: absolute;
      top: 50%;
      right: -9px;
      transform: translateY(-50%);
      cursor: pointer;
    }
    .time{
      min-width: 43px;
      padding: 0 5px;
    }
  </style>
</head>
<body>
  <div class="audio-container">
    <audio src="https://mv.xesimg.com/test_library/audio/2017/07/03/t_791698_17181920.mp3?1499050517"></audio>
    <img class="play-pause" src="./play.png" alt="">
    <div class="progress-container">
      <span class="time current-time">00:00</span>
      <div class="progress-box">
        <div class="progress-bar">
            <div class="progress-dragger"></div>
        </div>
      </div>
      <span class="time duration">00:00</span>
    </div>
  </div>

  <div class="audio-container">
    <audio src="https://mv.xesimg.com/test_library/audio/2017/07/03/t_791698_17181920.mp3?1499050517"></audio>
    <img class="play-pause" src="./play.png" alt="">
    <div class="progress-container">
      <span class="time current-time">00:00</span>
      <div class="progress-box">
        <div class="progress-bar">
            <div class="progress-dragger"></div>
        </div>
      </div>
      <span class="time duration">00:00</span>
    </div>
  </div>

  <script>
    // 时间转换
    const secondsToMS = (seconds) => {
      const mm = (parseInt(seconds/60) + '').padStart(2, '0')
      const ss = (parseInt(seconds % 60) + '').padStart(2, '0')

      return `${mm}:${ss}`
    }

    const audioArr = document.querySelectorAll('audio')
    audioArr.forEach((audio) => {
      const duration = audio.parentNode.querySelector('.duration')
      let totalTime = 0
      audio.addEventListener('canplay', function() {
        totalTime = this.duration
        duration.innerText = secondsToMS(totalTime)
      })

      const currentDuration = audio.parentNode.querySelector('.current-time')
      const progressBar = audio.parentNode.querySelector('.progress-bar')
      audio.addEventListener('timeupdate', function(){
        const currentTime = this.currentTime
        currentDuration.innerText = secondsToMS(currentTime)
        progressBar.style.width = (currentTime / totalTime * 100) + '%' 
      })

      const img = audio.parentNode.querySelector('.play-pause')
      audio.addEventListener('ended', function() {
        img.src = './play.png'
      })
    })

    // 点击播放/暂停音频
    document.addEventListener('click', (e) => {
      const target = e.target
      if (target.tagName.toLowerCase() !== 'img') return
      const currentAudio = target.parentNode.querySelector('audio')
      if (!currentAudio || currentAudio.tagName.toLowerCase() !== 'audio') return

      if (!currentAudio.paused) {
        target.src = './play.png'
        currentAudio.pause()
      } else {
        audioArr.forEach((audio) => {
          const img = audio.parentNode.querySelector('.play-pause')
          img.src = './play.png'
          audio.pause()
        })

        target.src = './pause.png'
        currentAudio.play()
      }
    })

    let progressBar,progress,currentAudio
    // 拖动音频
    document.addEventListener('mousedown', (e) => {
      if (e.target.className.includes('progress-dragger')) {
        progressBar = e.target.parentNode
        progress = progressBar.parentNode
        currentAudio = progress.parentNode.parentNode.querySelector('audio')

        document.addEventListener('mousemove', dragHandler)

        document.addEventListener('mouseup', () => {
          document.removeEventListener('mousemove', dragHandler)
        })
      }
    })

    const dragHandler = (e) => {
      const progressClinetW = progress.clientWidth
      const startPos = progress.getBoundingClientRect().left
      const endPos = progress.getBoundingClientRect().right
      const pageX = e.pageX

      const width = Math.max(startPos, Math.min(pageX, endPos)) - startPos

      progressBar.style.width = width + 'px'

      const currentTime = width / progressClinetW * currentAudio.duration

      currentAudio.currentTime = currentTime
    }
  </script>
</body>
</html>

 circle.png

pause.png

play.png

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有很多好看的Vue音频播放器组件可以使用,其中一款比较受欢迎的是Vue-Audio-Player。它是一个基于Vue.jsHTML5的音频播放器组件,支持拖动进度条、音量控制、播放列表等功能,并且可以自定义样式。以下是一个简单的示例代码: 1. 安装Vue-Audio-Player组件 ``` npm install vue-audio-player --save ``` 2. 在Vue项目中注册Vue-Audio-Player组件 ```javascript import VueAudioPlayer from 'vue-audio-player'; import 'vue-audio-player/dist/vue-audio-player.css'; export default { components: { VueAudioPlayer } } ``` 3. 在Vue模板中使用Vue-Audio-Player组件 ```html <vue-audio-player :src="audioSrc" :autoplay="false" :loop="false" :preload="true" @ended="onEnded" @timeupdate="onTimeupdate" :color="color" :waveColor="waveColor" :progressColor="progressColor" :sliderColor="sliderColor" :barWidth="barWidth" :sliderHeight="sliderHeight" :barHeight="barHeight" :sliderWidth="sliderWidth" :waveHeight="waveHeight" :waveWidth="waveWidth" :showFilledWave="showFilledWave" :mediaSession="mediaSession" :hideTime="false" :hideTitle="false" :title="title" :artist="artist" :album="album" :albumImage="albumImage" :preloadAudio="true" :maxTime="maxTime" :currentTime="currentTime" :initialVolume="initialVolume" @timeupdate="timeupdate" @volumechange="volumechange" @loadedmetadata="loadedmetadata" @audioprocess="audioprocess" @ended="ended" @pause="pause" @play="play" @seeked="seeked" @seeking="seeking" @stalled="stalled" @suspend="suspend" @waiting="waiting" ></vue-audio-player> ``` 在上述代码中,我们使用Vue-Audio-Player组件来实现音频播放器,可以通过设置组件的各种属性来自定义样式和功能。比如,我们可以设置音频的src属性、autoplay属性、loop属性等来控制音频的播放。我们还可以设置组件的颜色、进度条颜色、音量控制器颜色、进度条高度、音波高度等等来自定义样式。 以上是一个简单的Vue-Audio-Player示例,你可以根据自己的需求进行修改和扩展。如果需要更多自定义功能,可以查看Vue-Audio-Player的官方文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值