diff --git a/newKs/src/public/index.html b/newKs/src/public/index.html
index 0cfe2ae..71230ba 100644
--- a/newKs/src/public/index.html
+++ b/newKs/src/public/index.html
@@ -4,7 +4,7 @@
- 视频圆形放大镜(修复版)
+ 视频圆形放大镜(最终流畅版)
@@ -81,9 +85,27 @@
const magnifier = document.getElementById('magnifier');
const magnifierVideo = document.getElementById('magnifierVideo');
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;
+ // 实时记录鼠标位置
+ document.addEventListener('mousemove', (e) => {
+ currentMouseX = e.clientX;
+ currentMouseY = e.clientY;
+ });
+
const initLazyLoad = () => {
if (lazyLoadInstance) return;
lazyLoadInstance = new LazyLoad({
@@ -156,28 +178,80 @@
};
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) => {
const { keyCode } = e;
- if (keyCode === 79) {
+
+ // F键:开关放大镜
+ if (keyCode === 70) {
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();
- toggleScroll();
+ if (magnifierSize < maxMagnifierSize) {
+ magnifierSize += stepSize;
+ updateMagnifierToMouse();
+ }
}
- if (keyCode === 82) {
+
+ // - 键:每次减少 40px,最小 400px
+ if (keyCode === 109 || keyCode === 189) {
e.preventDefault();
- scrollSpeed = defaultSpeed;
- }
- if (keyCode === 40) {
- e.preventDefault();
- scrollSpeed += 2;
- }
- if (keyCode === 38) {
- e.preventDefault();
- scrollSpeed > defaultSpeed && (scrollSpeed -= 2);
+ if (magnifierSize > minMagnifierSize) {
+ magnifierSize -= stepSize;
+ updateMagnifierToMouse();
+ }
}
+
+ // 其他原有按键
+ 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;
@@ -194,45 +268,19 @@
}, 150);
};
- // ==================== 已修复:鼠标指哪放大哪 ====================
- const scale = 4; // 放大倍数
ul.addEventListener('mousemove', (e) => {
- if (e.target.tagName !== 'VIDEO') return;
- const video = e.target;
-
- // 切换视频时更新放大镜源
- 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)`;
+ if (!magnifierEnabled) return;
+ updateMagnifierToMouse();
});
- // 移出视频区域关闭放大镜
ul.addEventListener('mouseleave', () => {
+ if (!magnifierEnabled) return;
magnifier.style.display = 'none';
magnifierVideo.pause();
magnifierVideo.src = '';
hoveredVideo = null;
}, true);
- // 原有播放逻辑
ul.addEventListener("mouseenter", (e) => {
if (e.target.tagName === "VIDEO") {
e.target.readyState >= 2 && e.target.play();