如何自定义音频播放器?

时间:2019-06-04 19:28:27

标签: javascript html css audio-player

我正在尝试复制此音频播放器:

https://medium.com/s/story/the-law-of-least-effort-is-the-success-secret-nobody-talks-about-c713eeab8ade

带有灰色进度条,但我似乎无法弄清楚以下四件事:

  1. 如何在播放/暂停按钮旁边放置进度条?
  2. 如何将总时间位数保留为两位小数? (48秒)
  3. 如何为currentTimer使用2个小数? (前9秒)
  4. 如何将计时器放在开头和结尾?

var barSize = 640;
var bar = document.getElementById('defaultBar');
var progressBar = document.getElementById('progressBar');

mytrack.addEventListener("loadedmetadata", function() {
  var minutes = parseInt(mytrack.duration / 60);
  var seconds = parseInt(mytrack.duration % 60);
  duration.innerHTML = minutes + ':' + seconds;
})

duration.innerHTML = mytrack.duration;

playButton.addEventListener('click', playOrPause, false);
bar.addEventListener('click', clickedBar, false);
#progressBar {
  position: absolute;
  height: 2px;
  background-color: #C6C6C6;
  width: 0px;
  float: left;
}

#playButton {
  background-color: #FFFFFF;
  border: none;
  outline: none;
  height: 60px;
  width: 60px;
  background-image: url(../Desktop/Play%20button.png);
  background-repeat: no-repeat;
  background-position: center;
}

#player {
  background-color: #FFFFFF;
  width: 400px;
  margin-left: 300px;
  padding: 5px;
  box-sizing: border-box;
}
<div id="wrapper">

  <audio id="mytrack">
    <source src="file:///Users/Pier/Desktop/Narrated%20Story%20-%20Example.m4a" type="audio/mp3"/>
  </audio>

  <nav>
    <div id="defaultBar">
      <div id="progressBar"></div>
    </div>
    <div id="buttons">
      <button type="button" id="playButton"></button>
      <span id="currentTime">0:00</span>
      <span id="fullDuration">0:00</span>
    </div>
  </nav>

</div>

1 个答案:

答案 0 :(得分:1)

您引用的页面使用flexbox进行布局。您可能会考虑类似的方法。

下面,我重新构造了HTML,并将每个控件元素都设置为flexbox项。
我还用align-items:center将所有项目垂直居中。

var myTrack = document.getElementById('myTrack');
var progressBar = document.getElementById('progressBar');
var currentTime = document.getElementById('currentTime');
var fullDuration = document.getElementById('fullDuration');

function zeroPad(s) {
  return ('00' + s).slice(-2);
}

function formatTime(t) {
  var m = Math.floor(t / 60);
  var s = Math.floor(t % 60);
  return zeroPad(m) + ':' + zeroPad(s);
}

function playOrPause() {
  myTrack.paused ? myTrack.play() : myTrack.pause();
}

myTrack.addEventListener("loadedmetadata", function() {
  fullDuration.innerHTML = formatTime(this.duration);
});

myTrack.addEventListener("timeupdate", function() {
  var thisTime = this.currentTime;
  var duration = this.duration;
  progressBar.style.width = thisTime / duration * 100 + '%';
  currentTime.innerHTML = formatTime(thisTime);
});

playButton.addEventListener('click', playOrPause, false);
#audioControls {
  display: flex;
  align-items: center;
}

.controlTime {
  margin: 0 1em;
}

#progressWrap {
  /* Allow this element to grow */
  flex: 1 0 auto;
  border: 1px solid #EEE;
  border-radius: 0.5em;
  overflow: hidden;
}

#progressBar {
  height: 0.5em;
  background-color: #55AA55;
  width: 0;
}

#playButton {
  background-color: #FFFFFF;
  border: 1px solid #CCC;
  border-radius: 3px;
  padding: 0.7em 1em;
  outline: none;
  cursor: pointer;
}

#playButton:hover {
  background-color: darkgray;
  color: white;
}
<div id="wrapper">

  <audio id="myTrack">
    <source src="https://example-files.online-convert.com/audio/m4a/example.m4a" type="audio/mp3"/>
  </audio>

  <nav id="audioControls">
    <button type="button" id="playButton">play</button>
    <span class="controlTime" id="currentTime">00:00</span>
    <div id="progressWrap">
      <div id="progressBar"></div>
    </div>
    <span class="controlTime" id="fullDuration">00:00</span>
  </nav>

</div>