ビデオプレーヤー Video Player
カスタムコントロール付きの動画再生UI。再生/一時停止、シークバー、音量、全画面を制御。
ライブデモ
0:00
0:003: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通知バーで操作)