Javascript 30 - Gün 11

2 Mayıs 2023

Bugün Javascript ile özel video oynatıcı geliştireceğiz.

Projenin demosu : Demo

Başlangıç dosyalarını bulabileceğiniz repom: js-30 | github

Amaç

Javascript ve HTML5 Video API'ını kullanarak özel bir video oynatıcı geliştireceğiz. Bu oynatıcı;

  • Video oynatma/duraklatma
  • Ses kontrolü
  • Hız kontrolü
  • İleri/geri sarma
  • Tam ekran butonuna sahip olacak.

Çözümüm

<div class="player">
  <video class="player__video viewer" src="652333414.mp4"></video>
 
  <div class="player__controls">
    <div class="progress">
      <div class="progress__filled"></div>
    </div>
    <button class="player__button toggle" title="Toggle Play"></button>
    <input
      type="range"
      name="volume"
      class="player__slider"
      min="0"
      max="1"
      step="0.05"
      value="1"
    />
    <input
      type="range"
      name="playbackRate"
      class="player__slider"
      min="0.5"
      max="2"
      step="0.1"
      value="1"
    />
    <button data-skip="-10" class="player__button">« 10s</button>
    <button data-skip="25" class="player__button">25s »</button>
    <button class="toggle-fullscreen">Full</button>
  </div>
</div>
 
<script src="scripts.js"></script>
// Elementlerimizi alalım
const player = document.querySelector(".player");
const video = player.querySelector(".viewer");
const progress = player.querySelector(".progress");
const progressBar = player.querySelector(".progress__filled");
const toggle = player.querySelector(".toggle");
const toggleFullscreeen = document.querySelector(".toggle-fullscreen");
const skipButtons = player.querySelectorAll("[data-skip]");
const ranges = player.querySelectorAll(".player__slider");
 
// Fonksiyonlarımızı oluşturalım
function togglePlay() {
  // Video duraklatıldıysa oynatır oynuyorsa duraklatır.
  if (video.paused) {
    video.play();
  } else {
    video.pause();
  }
}
 
function updateButton() {
  // Oynatma/duraklatma butonunun içindeki ikonu günceller
  const icon = this.paused ? "" : "";
  toggle.textContent = icon;
}
 
function skip() {
  // Butonun sahip olduğu "data-skip" özelliği kadar ileri/geri alır. 
  const skipAmount = parseFloat(this.dataset.skip);
  video.currentTime += skipAmount;
}
 
function handleRangeUpdate() {
  // Ses ve oynatma hızını günceller
  video[this.name] = this.value;
}
 
function handleProgress() {
  // Video ilerleme çubuğunu günceller
  const percent = (video.currentTime / video.duration) * 100;
  progressBar.style.flexBasis = `${percent}%`;
}
 
function scrub(e) {
  // İlerleme çubuğuna tıklanıldığında videoyu ilgili yere alır
  const scrubTime = (e.offsetX / progress.offsetWidth) * video.duration;
  video.currentTime = scrubTime;
}
 
// Olay dinleyicilerini ekleyelim
video.addEventListener("click", togglePlay);
video.addEventListener("play", updateButton);
video.addEventListener("pause", updateButton);
video.addEventListener("timeupdate", handleProgress);
toggle.addEventListener("click", togglePlay);
 
skipButtons.forEach((skipButton) => skipButton.addEventListener("click", skip));
 
ranges.forEach((range) => range.addEventListener("change", handleRangeUpdate));
ranges.forEach((range) =>
  range.addEventListener("mousemove", handleRangeUpdate)
);
 
let mousedown = false;
progress.addEventListener("click", scrub);
progress.addEventListener("mousemove", (e) => mousedown && scrub(e));
progress.addEventListener("mousedown", () => (mousedown = true));
progress.addEventListener("mouseup", () => (mousedown = false));
 
toggleFullscreeen.addEventListener("click", () => {
  // Tam ekran modunu açar/kapatır
  if (!video.fullscreenElement) {
    video.requestFullscreen();
  } else if (video.exitFullscreen) {
    video.exitFullscreen();
  }
});
GitHubBu sayfayı düzenle