d
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title>视频圆形放大镜(修复版)</title>
|
<title>视频圆形放大镜(最终流畅版)</title>
|
||||||
<script src="./lazyload.min.js"></script>
|
<script src="./lazyload.min.js"></script>
|
||||||
<style>
|
<style>
|
||||||
* {
|
* {
|
||||||
@@ -43,21 +43,25 @@
|
|||||||
/* 放大镜样式 */
|
/* 放大镜样式 */
|
||||||
.video-magnifier {
|
.video-magnifier {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
width: 380px;
|
width: 400px;
|
||||||
height: 380px;
|
height: 400px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
border: 3px solid #fff;
|
border: 3px solid rgba(255, 255, 255, 0.9);
|
||||||
box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
|
box-shadow: 0 0 30px rgba(0, 0, 0, 0.6), 0 0 0 4px rgba(0, 0, 0, 0.3);
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
z-index: 9999;
|
z-index: 10000;
|
||||||
display: none;
|
display: none;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
transition: left 0.02s ease-out, top 0.02s ease-out;
|
||||||
|
background: transparent !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.video-magnifier video {
|
.video-magnifier video {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
background: transparent !important;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
@@ -81,9 +85,27 @@
|
|||||||
const magnifier = document.getElementById('magnifier');
|
const magnifier = document.getElementById('magnifier');
|
||||||
const magnifierVideo = document.getElementById('magnifierVideo');
|
const magnifierVideo = document.getElementById('magnifierVideo');
|
||||||
let hoveredVideo = null;
|
let hoveredVideo = null;
|
||||||
|
let magnifierEnabled = false;
|
||||||
|
|
||||||
|
// ==================== 流畅缩放配置 ====================
|
||||||
|
const minMagnifierSize = 400; // 最小尺寸
|
||||||
|
const maxMagnifierSize = 600; // 最大尺寸(防卡顿)
|
||||||
|
const stepSize = 100; // 每次增减 40px(流畅不卡)
|
||||||
|
let magnifierSize = 400;
|
||||||
|
const scale = 4;
|
||||||
|
|
||||||
|
// 记录当前鼠标位置
|
||||||
|
let currentMouseX = 0;
|
||||||
|
let currentMouseY = 0;
|
||||||
|
|
||||||
let lazyLoadInstance = null;
|
let lazyLoadInstance = null;
|
||||||
|
|
||||||
|
// 实时记录鼠标位置
|
||||||
|
document.addEventListener('mousemove', (e) => {
|
||||||
|
currentMouseX = e.clientX;
|
||||||
|
currentMouseY = e.clientY;
|
||||||
|
});
|
||||||
|
|
||||||
const initLazyLoad = () => {
|
const initLazyLoad = () => {
|
||||||
if (lazyLoadInstance) return;
|
if (lazyLoadInstance) return;
|
||||||
lazyLoadInstance = new LazyLoad({
|
lazyLoadInstance = new LazyLoad({
|
||||||
@@ -156,28 +178,80 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
document.onclick = toggleScroll;
|
document.onclick = toggleScroll;
|
||||||
|
|
||||||
|
// 强制更新放大镜到当前鼠标位置
|
||||||
|
function updateMagnifierToMouse() {
|
||||||
|
if (!magnifierEnabled) return;
|
||||||
|
|
||||||
|
magnifier.style.width = magnifierSize + 'px';
|
||||||
|
magnifier.style.height = magnifierSize + 'px';
|
||||||
|
|
||||||
|
const element = document.elementFromPoint(currentMouseX, currentMouseY);
|
||||||
|
if (!element || element.tagName !== 'VIDEO') {
|
||||||
|
magnifier.style.display = 'none';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const video = element;
|
||||||
|
if (hoveredVideo !== video) {
|
||||||
|
hoveredVideo = video;
|
||||||
|
magnifierVideo.src = video.dataset.src || video.src;
|
||||||
|
magnifierVideo.play().catch(() => { });
|
||||||
|
}
|
||||||
|
|
||||||
|
magnifier.style.display = 'block';
|
||||||
|
magnifier.style.left = (currentMouseX - magnifierSize / 2) + 'px';
|
||||||
|
magnifier.style.top = (currentMouseY - magnifierSize / 2) + 'px';
|
||||||
|
|
||||||
|
const rect = video.getBoundingClientRect();
|
||||||
|
const relativeX = (currentMouseX - rect.left) / rect.width;
|
||||||
|
const relativeY = (currentMouseY - rect.top) / rect.height;
|
||||||
|
const offsetX = -(relativeX - 0.5) * rect.width * scale;
|
||||||
|
const offsetY = -(relativeY - 0.5) * rect.height * scale;
|
||||||
|
magnifierVideo.style.transform = `scale(${scale}) translate(${offsetX}px, ${offsetY}px)`;
|
||||||
|
}
|
||||||
|
|
||||||
document.onkeydown = (e) => {
|
document.onkeydown = (e) => {
|
||||||
const { keyCode } = e;
|
const { keyCode } = e;
|
||||||
if (keyCode === 79) {
|
|
||||||
|
// F键:开关放大镜
|
||||||
|
if (keyCode === 70) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
if (currentVideo) open(currentVideo.author);
|
magnifierEnabled = !magnifierEnabled;
|
||||||
|
if (magnifierEnabled) {
|
||||||
|
updateMagnifierToMouse();
|
||||||
|
} else {
|
||||||
|
magnifier.style.display = 'none';
|
||||||
|
magnifierVideo.pause();
|
||||||
|
magnifierVideo.src = '';
|
||||||
|
hoveredVideo = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (keyCode === 32) {
|
|
||||||
|
// + 键:每次增加 40px,最大 800px
|
||||||
|
if (keyCode === 107 || keyCode === 187) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
toggleScroll();
|
if (magnifierSize < maxMagnifierSize) {
|
||||||
|
magnifierSize += stepSize;
|
||||||
|
updateMagnifierToMouse();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (keyCode === 82) {
|
|
||||||
|
// - 键:每次减少 40px,最小 400px
|
||||||
|
if (keyCode === 109 || keyCode === 189) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
scrollSpeed = defaultSpeed;
|
if (magnifierSize > minMagnifierSize) {
|
||||||
}
|
magnifierSize -= stepSize;
|
||||||
if (keyCode === 40) {
|
updateMagnifierToMouse();
|
||||||
e.preventDefault();
|
}
|
||||||
scrollSpeed += 2;
|
|
||||||
}
|
|
||||||
if (keyCode === 38) {
|
|
||||||
e.preventDefault();
|
|
||||||
scrollSpeed > defaultSpeed && (scrollSpeed -= 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 其他原有按键
|
||||||
|
if (keyCode === 79) { e.preventDefault(); if (currentVideo) open(currentVideo.author); }
|
||||||
|
if (keyCode === 32) { e.preventDefault(); toggleScroll(); }
|
||||||
|
if (keyCode === 82) { e.preventDefault(); scrollSpeed = defaultSpeed; }
|
||||||
|
if (keyCode === 40) { e.preventDefault(); scrollSpeed += 2; }
|
||||||
|
if (keyCode === 38) { e.preventDefault(); scrollSpeed > defaultSpeed && (scrollSpeed -= 2); }
|
||||||
};
|
};
|
||||||
|
|
||||||
let scrollTimer = null;
|
let scrollTimer = null;
|
||||||
@@ -194,45 +268,19 @@
|
|||||||
}, 150);
|
}, 150);
|
||||||
};
|
};
|
||||||
|
|
||||||
// ==================== 已修复:鼠标指哪放大哪 ====================
|
|
||||||
const scale = 4; // 放大倍数
|
|
||||||
ul.addEventListener('mousemove', (e) => {
|
ul.addEventListener('mousemove', (e) => {
|
||||||
if (e.target.tagName !== 'VIDEO') return;
|
if (!magnifierEnabled) return;
|
||||||
const video = e.target;
|
updateMagnifierToMouse();
|
||||||
|
|
||||||
// 切换视频时更新放大镜源
|
|
||||||
if (hoveredVideo !== video) {
|
|
||||||
hoveredVideo = video;
|
|
||||||
magnifierVideo.src = video.dataset.src || video.src;
|
|
||||||
magnifierVideo.play();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 放大镜跟随鼠标(中心对齐)
|
|
||||||
magnifier.style.display = 'block';
|
|
||||||
magnifier.style.left = (e.clientX - magnifier.offsetWidth / 2) + 'px';
|
|
||||||
magnifier.style.top = (e.clientY - magnifier.offsetHeight / 2) + 'px';
|
|
||||||
|
|
||||||
// 获取视频元素的位置和尺寸
|
|
||||||
const rect = video.getBoundingClientRect();
|
|
||||||
// 鼠标在视频内的相对坐标(0~1)
|
|
||||||
const relativeX = (e.clientX - rect.left) / rect.width;
|
|
||||||
const relativeY = (e.clientY - rect.top) / rect.height;
|
|
||||||
|
|
||||||
// 核心修复:让鼠标位置在放大镜正中心
|
|
||||||
const offsetX = -(relativeX - 0.5) * rect.width * scale;
|
|
||||||
const offsetY = -(relativeY - 0.5) * rect.height * scale;
|
|
||||||
magnifierVideo.style.transform = `scale(${scale}) translate(${offsetX}px, ${offsetY}px)`;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 移出视频区域关闭放大镜
|
|
||||||
ul.addEventListener('mouseleave', () => {
|
ul.addEventListener('mouseleave', () => {
|
||||||
|
if (!magnifierEnabled) return;
|
||||||
magnifier.style.display = 'none';
|
magnifier.style.display = 'none';
|
||||||
magnifierVideo.pause();
|
magnifierVideo.pause();
|
||||||
magnifierVideo.src = '';
|
magnifierVideo.src = '';
|
||||||
hoveredVideo = null;
|
hoveredVideo = null;
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
// 原有播放逻辑
|
|
||||||
ul.addEventListener("mouseenter", (e) => {
|
ul.addEventListener("mouseenter", (e) => {
|
||||||
if (e.target.tagName === "VIDEO") {
|
if (e.target.tagName === "VIDEO") {
|
||||||
e.target.readyState >= 2 && e.target.play();
|
e.target.readyState >= 2 && e.target.play();
|
||||||
|
|||||||
Reference in New Issue
Block a user