Spaces:
Running
Running
Update index.html
Browse files- index.html +80 -5
index.html
CHANGED
@@ -977,7 +977,58 @@ function updateVolume(value) {
|
|
977 |
}
|
978 |
}
|
979 |
|
980 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
981 |
function handleVideoChange() {
|
982 |
const selected = videoSelect.value;
|
983 |
|
@@ -990,12 +1041,36 @@ function handleVideoChange() {
|
|
990 |
}
|
991 |
|
992 |
video.src = selected;
|
993 |
-
previewVideo.src = selected;
|
994 |
-
|
995 |
-
|
996 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
997 |
}
|
998 |
|
|
|
|
|
999 |
// 再生/一時停止を切り替え
|
1000 |
function togglePlayPause() {
|
1001 |
if (video.paused) {
|
|
|
977 |
}
|
978 |
}
|
979 |
|
980 |
+
|
981 |
+
// プレビュー用動画のソースをメイン動画と同期
|
982 |
+
previewVideo.src = video.src;
|
983 |
+
|
984 |
+
// ホバー時のプレビュー更新関数(メイン動画を操作しない)
|
985 |
+
function updateHoverPreview(e) {
|
986 |
+
if (!video.duration) return;
|
987 |
+
|
988 |
+
const rect = progressContainer.getBoundingClientRect();
|
989 |
+
const pos = Math.min(Math.max((e.clientX - rect.left) / rect.width, 0), 1);
|
990 |
+
const time = pos * video.duration;
|
991 |
+
|
992 |
+
// 時間表示更新
|
993 |
+
const minutes = Math.floor(time / 60);
|
994 |
+
const seconds = Math.floor(time % 60).toString().padStart(2, '0');
|
995 |
+
hoverTime.textContent = `${minutes}:${seconds}`;
|
996 |
+
hoverTime.style.display = 'block';
|
997 |
+
hoverTime.style.left = `${e.clientX - rect.left}px`;
|
998 |
+
|
999 |
+
// プレビュー動画のみを更新(メイン動画は変更しない)
|
1000 |
+
if (previewVideo.readyState > 0) {
|
1001 |
+
previewVideo.currentTime = time;
|
1002 |
+
}
|
1003 |
+
|
1004 |
+
// プレビュー動画の位置調整
|
1005 |
+
previewVideo.style.display = "block";
|
1006 |
+
previewVideo.style.left = `${e.clientX}px`;
|
1007 |
+
}
|
1008 |
+
|
1009 |
+
// ホバーイベントリスナーの設定
|
1010 |
+
function setupHoverEvents() {
|
1011 |
+
const hoverTime = document.createElement('div');
|
1012 |
+
hoverTime.className = 'hover-time';
|
1013 |
+
progressContainer.appendChild(hoverTime);
|
1014 |
+
|
1015 |
+
let hoverTimeout;
|
1016 |
+
|
1017 |
+
progressContainer.addEventListener("mousemove", (e) => {
|
1018 |
+
clearTimeout(hoverTimeout);
|
1019 |
+
hoverTimeout = setTimeout(() => {
|
1020 |
+
updateHoverPreview(e);
|
1021 |
+
}, 30); // 30msのデバウンス
|
1022 |
+
});
|
1023 |
+
|
1024 |
+
progressContainer.addEventListener("mouseleave", () => {
|
1025 |
+
hoverTime.style.display = "none";
|
1026 |
+
previewVideo.style.display = "none";
|
1027 |
+
clearTimeout(hoverTimeout);
|
1028 |
+
});
|
1029 |
+
}
|
1030 |
+
|
1031 |
+
// 動画変更時の処理(プレビュー動画も同期)
|
1032 |
function handleVideoChange() {
|
1033 |
const selected = videoSelect.value;
|
1034 |
|
|
|
1041 |
}
|
1042 |
|
1043 |
video.src = selected;
|
1044 |
+
previewVideo.src = selected; // プレビュー動画も更新
|
1045 |
+
|
1046 |
+
// 両方の動画をロード
|
1047 |
+
const loadVideo = video.load();
|
1048 |
+
const loadPreview = previewVideo.load();
|
1049 |
+
|
1050 |
+
Promise.all([loadVideo, loadPreview])
|
1051 |
+
.then(() => video.play())
|
1052 |
+
.catch(e => console.error("動画読み込みエラー:", e));
|
1053 |
+
}
|
1054 |
+
|
1055 |
+
// 初期化関数
|
1056 |
+
function init() {
|
1057 |
+
setupHoverEvents();
|
1058 |
+
|
1059 |
+
// プレビュー動画のメタデータが読み込まれたら準備完了
|
1060 |
+
previewVideo.addEventListener('loadedmetadata', () => {
|
1061 |
+
console.log("プレビュー動画の準備が完了しました");
|
1062 |
+
});
|
1063 |
+
|
1064 |
+
// メイン動画のイベントリスナー設定
|
1065 |
+
video.addEventListener('loadedmetadata', () => {
|
1066 |
+
previewVideo.src = video.src; // ソースを再度同期
|
1067 |
+
updatePlaybackRate(speedRange.value);
|
1068 |
+
updateVolume(volumeRange.value);
|
1069 |
+
});
|
1070 |
}
|
1071 |
|
1072 |
+
// 初期化を実行
|
1073 |
+
init();
|
1074 |
// 再生/一時停止を切り替え
|
1075 |
function togglePlayPause() {
|
1076 |
if (video.paused) {
|