|
|
@ -317,8 +317,10 @@ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.image-viewer img { |
|
|
.image-viewer img { |
|
|
max-width: 100%; |
|
|
max-width: none; |
|
|
max-height: 100vh; |
|
|
max-height: none; |
|
|
|
|
|
width: auto; |
|
|
|
|
|
height: auto; |
|
|
object-fit: contain; |
|
|
object-fit: contain; |
|
|
transition: transform 0.1s ease; |
|
|
transition: transform 0.1s ease; |
|
|
cursor: grab; |
|
|
cursor: grab; |
|
|
@ -351,7 +353,8 @@ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.image-viewer-prev, |
|
|
.image-viewer-prev, |
|
|
.image-viewer-next { |
|
|
.image-viewer-next, |
|
|
|
|
|
.image-viewer-rotate { |
|
|
position: absolute; |
|
|
position: absolute; |
|
|
top: 50%; |
|
|
top: 50%; |
|
|
transform: translateY(-50%); |
|
|
transform: translateY(-50%); |
|
|
@ -368,6 +371,17 @@ |
|
|
justify-content: center; |
|
|
justify-content: center; |
|
|
transition: background-color 0.3s ease; |
|
|
transition: background-color 0.3s ease; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.image-viewer-rotate { |
|
|
|
|
|
top: auto; |
|
|
|
|
|
bottom: 20px; |
|
|
|
|
|
right: 80px; |
|
|
|
|
|
transform: none; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.image-viewer-rotate:hover { |
|
|
|
|
|
background-color: rgba(255, 255, 255, 0.4); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
.image-viewer-prev { |
|
|
.image-viewer-prev { |
|
|
left: 20px; |
|
|
left: 20px; |
|
|
@ -3469,6 +3483,7 @@ function showImageViewer(imgElement) { |
|
|
</div> |
|
|
</div> |
|
|
<button class="image-viewer-next" onclick="showNextImage(event)">></button> |
|
|
<button class="image-viewer-next" onclick="showNextImage(event)">></button> |
|
|
<button class="image-viewer-close" onclick="closeImageViewer()">×</button> |
|
|
<button class="image-viewer-close" onclick="closeImageViewer()">×</button> |
|
|
|
|
|
<button class="image-viewer-rotate" onclick="rotateImage()">↻</button> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<script> |
|
|
<script> |
|
|
@ -3479,6 +3494,7 @@ function showImageViewer(imgElement) { |
|
|
|
|
|
|
|
|
// 缩放和拖动相关变量 |
|
|
// 缩放和拖动相关变量 |
|
|
let scale = 1; |
|
|
let scale = 1; |
|
|
|
|
|
let rotation = 0; // 旋转角度变量 |
|
|
|
|
|
|
|
|
// showImageViewer函数已在下面正确定义,这里删除重复定义 |
|
|
// showImageViewer函数已在下面正确定义,这里删除重复定义 |
|
|
let lastScale = 1; |
|
|
let lastScale = 1; |
|
|
@ -3587,7 +3603,7 @@ function showImageViewer(imgElement) { |
|
|
currentImageIndex = (currentImageIndex - 1 + currentImageUrls.length) % currentImageUrls.length; |
|
|
currentImageIndex = (currentImageIndex - 1 + currentImageUrls.length) % currentImageUrls.length; |
|
|
document.getElementById('viewerImage').src = currentImageUrls[currentImageIndex]; |
|
|
document.getElementById('viewerImage').src = currentImageUrls[currentImageIndex]; |
|
|
document.getElementById('imageCounter').textContent = `${currentImageIndex + 1}/${currentImageUrls.length}`; |
|
|
document.getElementById('imageCounter').textContent = `${currentImageIndex + 1}/${currentImageUrls.length}`; |
|
|
// 重置缩放和拖动状态 |
|
|
// 重置缩放、拖动和旋转状态 |
|
|
resetImageTransform(); |
|
|
resetImageTransform(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -3598,7 +3614,7 @@ function showImageViewer(imgElement) { |
|
|
currentImageIndex = (currentImageIndex + 1) % currentImageUrls.length; |
|
|
currentImageIndex = (currentImageIndex + 1) % currentImageUrls.length; |
|
|
document.getElementById('viewerImage').src = currentImageUrls[currentImageIndex]; |
|
|
document.getElementById('viewerImage').src = currentImageUrls[currentImageIndex]; |
|
|
document.getElementById('imageCounter').textContent = `${currentImageIndex + 1}/${currentImageUrls.length}`; |
|
|
document.getElementById('imageCounter').textContent = `${currentImageIndex + 1}/${currentImageUrls.length}`; |
|
|
// 重置缩放和拖动状态 |
|
|
// 重置缩放、拖动和旋转状态 |
|
|
resetImageTransform(); |
|
|
resetImageTransform(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -3607,6 +3623,7 @@ function showImageViewer(imgElement) { |
|
|
function resetImageTransform() { |
|
|
function resetImageTransform() { |
|
|
const viewerImage = document.getElementById('viewerImage'); |
|
|
const viewerImage = document.getElementById('viewerImage'); |
|
|
scale = 1; |
|
|
scale = 1; |
|
|
|
|
|
rotation = 0; // 重置旋转角度 |
|
|
lastScale = 1; |
|
|
lastScale = 1; |
|
|
pointX = 0; |
|
|
pointX = 0; |
|
|
pointY = 0; |
|
|
pointY = 0; |
|
|
@ -3617,7 +3634,56 @@ function showImageViewer(imgElement) { |
|
|
// 更新图片变换 |
|
|
// 更新图片变换 |
|
|
function updateImageTransform() { |
|
|
function updateImageTransform() { |
|
|
const viewerImage = document.getElementById('viewerImage'); |
|
|
const viewerImage = document.getElementById('viewerImage'); |
|
|
viewerImage.style.transform = `translate(${pointX}px, ${pointY}px) scale(${scale})`; |
|
|
viewerImage.style.transform = `translate(${pointX}px, ${pointY}px) scale(${scale}) rotate(${rotation}deg)`; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 旋转图片函数 |
|
|
|
|
|
function rotateImage() { |
|
|
|
|
|
rotation += 90; // 每次旋转90度 |
|
|
|
|
|
updateImageTransform(); |
|
|
|
|
|
// 旋转后重新计算位置,确保图片完全显示 |
|
|
|
|
|
adjustImagePosition(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 调整图片位置和缩放,确保完全显示 |
|
|
|
|
|
function adjustImagePosition() { |
|
|
|
|
|
const viewerImage = document.getElementById('viewerImage'); |
|
|
|
|
|
const viewerContent = document.querySelector('.image-viewer-content'); |
|
|
|
|
|
|
|
|
|
|
|
// 重置缩放和位置 |
|
|
|
|
|
scale = 1; |
|
|
|
|
|
pointX = 0; |
|
|
|
|
|
pointY = 0; |
|
|
|
|
|
updateImageTransform(); |
|
|
|
|
|
|
|
|
|
|
|
// 获取图片原始尺寸 |
|
|
|
|
|
const imgNaturalWidth = viewerImage.naturalWidth; |
|
|
|
|
|
const imgNaturalHeight = viewerImage.naturalHeight; |
|
|
|
|
|
|
|
|
|
|
|
// 获取容器尺寸 |
|
|
|
|
|
const containerWidth = viewerContent.clientWidth; |
|
|
|
|
|
const containerHeight = viewerContent.clientHeight; |
|
|
|
|
|
|
|
|
|
|
|
// 计算旋转后的宽高(90度倍数旋转) |
|
|
|
|
|
let rotatedWidth, rotatedHeight; |
|
|
|
|
|
if ([90, 270].includes(rotation % 360)) { |
|
|
|
|
|
// 旋转90度或270度,宽高互换 |
|
|
|
|
|
rotatedWidth = imgNaturalHeight; |
|
|
|
|
|
rotatedHeight = imgNaturalWidth; |
|
|
|
|
|
} else { |
|
|
|
|
|
// 0度或180度,宽高不变 |
|
|
|
|
|
rotatedWidth = imgNaturalWidth; |
|
|
|
|
|
rotatedHeight = imgNaturalHeight; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 计算适合容器的缩放比例 |
|
|
|
|
|
const scaleX = containerWidth / rotatedWidth; |
|
|
|
|
|
const scaleY = containerHeight / rotatedHeight; |
|
|
|
|
|
const fitScale = Math.min(scaleX, scaleY, 1); // 不超过原始大小 |
|
|
|
|
|
|
|
|
|
|
|
// 应用缩放 |
|
|
|
|
|
scale = fitScale; |
|
|
|
|
|
updateImageTransform(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 设置图片查看器事件 |
|
|
// 设置图片查看器事件 |
|
|
@ -3721,21 +3787,22 @@ function showImageViewer(imgElement) { |
|
|
const wheelDelta = delta > 0 ? 0.9 : 1.1; |
|
|
const wheelDelta = delta > 0 ? 0.9 : 1.1; |
|
|
scale *= wheelDelta; |
|
|
scale *= wheelDelta; |
|
|
|
|
|
|
|
|
// 限制缩放范围,最小为照片原始大小 |
|
|
// 限制缩放范围,最小为0.1倍,最大为10倍 |
|
|
scale = Math.min(Math.max(scale, 1), 10); |
|
|
scale = Math.min(Math.max(scale, 0.1), 10); |
|
|
|
|
|
|
|
|
// 当缩放到接近原始大小时,平滑调整位置偏移,确保照片始终可见 |
|
|
// 当缩放到接近原始大小时,平滑调整位置偏移,确保照片始终可见 |
|
|
if (scale <= 1.1) { |
|
|
if (scale <= 1.1) { |
|
|
// 根据当前缩放比例计算位置偏移的衰减因子 |
|
|
// 仅在缩放比例接近1时才调整位置,小于0.9时不调整 |
|
|
const decayFactor = (scale - 1) / 0.1; |
|
|
if (scale >= 0.9) { |
|
|
// 当缩放到原始大小时,位置偏移完全重置 |
|
|
// 根据当前缩放比例计算位置偏移的衰减因子 |
|
|
if (scale === 1) { |
|
|
const decayFactor = (scale - 0.9) / 0.2; |
|
|
pointX = 0; |
|
|
|
|
|
pointY = 0; |
|
|
|
|
|
} else { |
|
|
|
|
|
// 平滑过渡,避免照片在缩小过程中消失 |
|
|
// 平滑过渡,避免照片在缩小过程中消失 |
|
|
pointX *= decayFactor; |
|
|
pointX *= decayFactor; |
|
|
pointY *= decayFactor; |
|
|
pointY *= decayFactor; |
|
|
|
|
|
} else if (scale === 1) { |
|
|
|
|
|
// 当精确缩放到原始大小时,位置偏移完全重置 |
|
|
|
|
|
pointX = 0; |
|
|
|
|
|
pointY = 0; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|