From 45814105ded8f4d437fe208ccc907b5e6416d02e Mon Sep 17 00:00:00 2001
From: shuaiplus <2327005759@qq.com>
Date: Tue, 6 May 2025 03:17:17 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=9B=BE=E7=89=87=E9=A2=84?=
=?UTF-8?q?=E8=A7=88=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=96=B0=E5=A2=9E=E7=BC=A9?=
=?UTF-8?q?=E6=94=BE=E5=92=8C=E6=8B=96=E5=8A=A8=E6=94=AF=E6=8C=81=EF=BC=8C?=
=?UTF-8?q?=E6=94=B9=E8=BF=9B=E7=94=A8=E6=88=B7=E4=BA=A4=E4=BA=92=E4=BD=93?=
=?UTF-8?q?=E9=AA=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
web/main.js | 66 +++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 62 insertions(+), 4 deletions(-)
diff --git a/web/main.js b/web/main.js
index f6af59f..23c2659 100644
--- a/web/main.js
+++ b/web/main.js
@@ -507,8 +507,8 @@ function showImageModal(src) {
modal.className = 'img-modal-bg';
modal.innerHTML = `
-

+
+
×
`;
@@ -516,15 +516,73 @@ function showImageModal(src) {
// 关闭逻辑
modal.querySelector('.img-modal-close').onclick = () => modal.remove();
modal.onclick = (e) => { if (e.target === modal) modal.remove(); };
- // 支持缩放
+ // 支持缩放和拖动
const img = modal.querySelector('img');
let scale = 1;
+ let isDragging = false;
+ let lastX = 0, lastY = 0;
+ let offsetX = 0, offsetY = 0;
+ img.ondragstart = function(e) { e.preventDefault(); };
img.onwheel = function(ev) {
ev.preventDefault();
+ const prevScale = scale;
scale += ev.deltaY < 0 ? 0.1 : -0.1;
scale = Math.max(0.2, Math.min(5, scale));
- img.style.transform = `scale(${scale})`;
+ // 缩放以图片中心为基准
+ if (scale === 1) {
+ offsetX = 0;
+ offsetY = 0;
+ } else if (prevScale !== scale) {
+ // 缩放时保持当前偏移不变
+ }
+ updateTransform();
};
+
+ function updateTransform() {
+ img.style.transform = `translate(${offsetX}px,${offsetY}px) scale(${scale})`;
+ img.style.cursor = scale > 1 ? (isDragging ? 'grabbing' : 'grab') : 'zoom-in';
+ }
+
+ img.onmousedown = function(ev) {
+ if (scale <= 1) return;
+ isDragging = true;
+ lastX = ev.clientX;
+ lastY = ev.clientY;
+ img.style.cursor = 'grabbing';
+ document.body.style.userSelect = 'none';
+ };
+ window.onmousemove = function(ev) {
+ if (!isDragging) return;
+ offsetX += ev.clientX - lastX;
+ offsetY += ev.clientY - lastY;
+ lastX = ev.clientX;
+ lastY = ev.clientY;
+ updateTransform();
+ };
+ window.onmouseup = function() {
+ if (isDragging) {
+ isDragging = false;
+ img.style.cursor = 'grab';
+ document.body.style.userSelect = '';
+ }
+ };
+ // 双击还原
+ img.ondblclick = function() {
+ scale = 1;
+ offsetX = 0;
+ offsetY = 0;
+ updateTransform();
+ };
+ // 关闭时清理事件
+ const cleanup = () => {
+ window.onmousemove = null;
+ window.onmouseup = null;
+ document.body.style.userSelect = '';
+ };
+ modal.addEventListener('remove', cleanup);
+ modal.querySelector('.img-modal-close').addEventListener('click', cleanup);
+ // 初始化
+ updateTransform();
}
// 页面初始化