ビデオプレーヤー Video Player

カスタムコントロール付きの動画再生UI。再生/一時停止、シークバー、音量、全画面を制御。

使用場面: コース動画の再生や、プロダクト紹介ビデオの埋め込み表示 採用例: YouTube, Vimeo

ライブデモ

0:00
0:00
3:45

ソースコード

<div class="demo-vplayer">
  <div class="demo-vplayer-screen">
    <div class="demo-vplayer-poster">
      <button class="demo-vplayer-big-play" aria-label="再生">
        <svg width="48" height="48" viewBox="0 0 24 24" fill="currentColor"><polygon points="5 3 19 12 5 21 5 3"/></svg>
      </button>
    </div>
    <div class="demo-vplayer-time-display">0:00</div>
  </div>
  <div class="demo-vplayer-controls">
    <button class="demo-vplayer-play" aria-label="再生/一時停止">
      <svg class="demo-vplayer-play-icon" width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><polygon points="5 3 19 12 5 21 5 3"/></svg>
      <svg class="demo-vplayer-pause-icon" width="20" height="20" viewBox="0 0 24 24" fill="currentColor" style="display:none;"><rect x="6" y="4" width="4" height="16"/><rect x="14" y="4" width="4" height="16"/></svg>
    </button>
    <span class="demo-vplayer-current">0:00</span>
    <div class="demo-vplayer-seekbar">
      <div class="demo-vplayer-seekbar-fill"></div>
      <div class="demo-vplayer-seekbar-thumb"></div>
    </div>
    <span class="demo-vplayer-duration">3:45</span>
    <div class="demo-vplayer-volume-wrap">
      <button class="demo-vplayer-mute" aria-label="ミュート">
        <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="11 5 6 9 2 9 2 15 6 15 11 19 11 5"/><path d="M19.07 4.93a10 10 0 010 14.14M15.54 8.46a5 5 0 010 7.07"/></svg>
      </button>
      <div class="demo-vplayer-volume-bar">
        <div class="demo-vplayer-volume-fill"></div>
      </div>
    </div>
    <button class="demo-vplayer-fullscreen" aria-label="全画面">
      <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="15 3 21 3 21 9"/><polyline points="9 21 3 21 3 15"/><line x1="21" y1="3" x2="14" y2="10"/><line x1="3" y1="21" x2="10" y2="14"/></svg>
    </button>
  </div>
</div>
.demo-vplayer { border-radius: 12px; overflow: hidden; background: #0f0f1a; }
.demo-vplayer-screen {
  position: relative; aspect-ratio: 16/9; background: linear-gradient(135deg, #1a1a2e, #16213e);
  display: flex; align-items: center; justify-content: center;
}
.demo-vplayer-poster { display: flex; align-items: center; justify-content: center; }
.demo-vplayer-big-play {
  width: 72px; height: 72px; border-radius: 50%; border: none;
  background: rgba(0,0,0,0.5); color: #fff; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  backdrop-filter: blur(4px); transition: all 0.2s;
}
.demo-vplayer-big-play:hover { background: var(--ui-primary); transform: scale(1.08); }
.demo-vplayer-big-play svg { margin-left: 4px; }
.demo-vplayer-time-display {
  position: absolute; bottom: 12px; left: 12px;
  color: rgba(255,255,255,0.7); font-size: 12px;
  font-variant-numeric: tabular-nums; display: none;
}
.demo-vplayer-controls {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 14px; background: #1a1a2e;
}
.demo-vplayer-play {
  border: none; background: none; color: #fff; cursor: pointer;
  padding: 4px; display: flex; align-items: center; transition: color 0.2s;
}
.demo-vplayer-play:hover { color: var(--ui-primary); }
.demo-vplayer-current, .demo-vplayer-duration {
  font-size: 12px; color: #888; font-variant-numeric: tabular-nums; white-space: nowrap;
}
.demo-vplayer-seekbar {
  flex: 1; height: 4px; background: #333; border-radius: 2px;
  cursor: pointer; position: relative;
}
.demo-vplayer-seekbar:hover { height: 6px; }
.demo-vplayer-seekbar-fill {
  height: 100%; width: 0%; background: var(--ui-primary);
  border-radius: 2px; transition: width 0.1s;
}
.demo-vplayer-seekbar-thumb {
  position: absolute; top: 50%; right: auto;
  width: 12px; height: 12px; border-radius: 50%;
  background: var(--ui-primary); transform: translate(-50%, -50%);
  left: 0%; opacity: 0; transition: opacity 0.2s;
}
.demo-vplayer-seekbar:hover .demo-vplayer-seekbar-thumb { opacity: 1; }
.demo-vplayer-volume-wrap { display: flex; align-items: center; gap: 4px; }
.demo-vplayer-mute {
  border: none; background: none; color: #999; cursor: pointer;
  display: flex; padding: 4px; transition: color 0.2s;
}
.demo-vplayer-mute:hover { color: #fff; }
.demo-vplayer-volume-bar {
  width: 60px; height: 4px; background: #333; border-radius: 2px;
  cursor: pointer; overflow: hidden;
}
.demo-vplayer-volume-fill {
  height: 100%; width: 80%; background: var(--ui-primary);
  border-radius: 2px;
}
.demo-vplayer-fullscreen {
  border: none; background: none; color: #999; cursor: pointer;
  display: flex; padding: 4px; transition: color 0.2s;
}
.demo-vplayer-fullscreen:hover { color: #fff; }
(function(){
  var playing = false;
  var progress = 0;
  var interval = null;
  var totalSec = 225;
  var playBtn = document.querySelector('.demo-vplayer-play');
  var playIcon = playBtn.querySelector('.demo-vplayer-play-icon');
  var pauseIcon = playBtn.querySelector('.demo-vplayer-pause-icon');
  var bigPlay = document.querySelector('.demo-vplayer-big-play');
  var seekFill = document.querySelector('.demo-vplayer-seekbar-fill');
  var seekThumb = document.querySelector('.demo-vplayer-seekbar-thumb');
  var currentEl = document.querySelector('.demo-vplayer-current');
  var seekbar = document.querySelector('.demo-vplayer-seekbar');
  function fmt(s){ var m=Math.floor(s/60); var sec=Math.floor(s%60); return m+':'+String(sec).padStart(2,'0'); }
  function updateUI(){
    var pct = (progress / totalSec) * 100;
    seekFill.style.width = pct + '%';
    seekThumb.style.left = pct + '%';
    currentEl.textContent = fmt(progress);
  }
  function play(){
    playing = true;
    playIcon.style.display = 'none';
    pauseIcon.style.display = 'block';
    bigPlay.parentElement.style.display = 'none';
    interval = setInterval(function(){
      progress += 1;
      if(progress >= totalSec){ progress = 0; pause(); }
      updateUI();
    }, 1000);
  }
  function pause(){
    playing = false;
    playIcon.style.display = 'block';
    pauseIcon.style.display = 'none';
    clearInterval(interval);
  }
  function toggle(){ if(playing) pause(); else play(); }
  playBtn.addEventListener('click', toggle);
  bigPlay.addEventListener('click', play);
  seekbar.addEventListener('click', function(e){
    var rect = this.getBoundingClientRect();
    var pct = (e.clientX - rect.left) / rect.width;
    progress = Math.round(pct * totalSec);
    updateUI();
  });
  var volumeBar = document.querySelector('.demo-vplayer-volume-bar');
  var volumeFill = document.querySelector('.demo-vplayer-volume-fill');
  var muteBtn = document.querySelector('.demo-vplayer-mute');
  var muted = false;
  muteBtn.addEventListener('click', function(){
    muted = !muted;
    volumeFill.style.width = muted ? '0%' : '80%';
    this.style.color = muted ? '#555' : '#999';
  });
  volumeBar.addEventListener('click', function(e){
    var rect = this.getBoundingClientRect();
    var pct = Math.max(0, Math.min(100, ((e.clientX - rect.left) / rect.width) * 100));
    volumeFill.style.width = pct + '%';
    muted = pct === 0;
  });
})();

AIプロンプト

Basic
ビデオプレーヤーUIをHTML/CSS/JSで作ってください。再生/一時停止ボタン、シークバー、時間表示、音量コントロールを含むカスタムコントロールです。
Custom
以下の仕様でビデオプレーヤーUIを実装してください。
- 16:9 の映像表示領域
- 大きな中央再生ボタン(ホバーでアクセントカラー)
- コントロールバー(再生/一時停止、シークバー、時間、音量、全画面)
- シークバーにホバーでサムネイル表示風のドット
- プライマリカラー: #2563eb
- ダークテーマのコントロール
Advanced
フル機能のビデオプレーヤーを実装してください。
- Adaptive Bitrate対応(HLS.js / DASH)
- ピクチャインピクチャ対応
- 再生速度変更(0.5x 〜 2.0x)
- 字幕表示(WebVTT対応)
- キーボードショートカット(Space: 再生/一時停止、←→: 10秒スキップ、↑↓: 音量)
- ダブルクリックで全画面
- バッファリングインジケーター
- チャプター表示とジャンプ
- Media Session API対応(OS通知バーで操作)