mirror of
https://github.com/rustdesk/doc.rustdesk.com.git
synced 2025-07-01 07:15:31 +00:00
151 lines
4.5 KiB
JavaScript
151 lines
4.5 KiB
JavaScript
// Image zoom functionality
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
// Create modal overlay
|
||
const modal = document.createElement('div');
|
||
modal.id = 'image-zoom-modal';
|
||
modal.style.cssText = `
|
||
display: none;
|
||
position: fixed;
|
||
top: 0;
|
||
left: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
background-color: rgba(0, 0, 0, 0.9);
|
||
z-index: 9999;
|
||
cursor: pointer;
|
||
transition: opacity 0.3s ease;
|
||
`;
|
||
|
||
// Create close button
|
||
const closeBtn = document.createElement('div');
|
||
closeBtn.innerHTML = '×';
|
||
closeBtn.style.cssText = `
|
||
position: absolute;
|
||
top: 20px;
|
||
right: 30px;
|
||
color: white;
|
||
font-size: 40px;
|
||
font-weight: bold;
|
||
cursor: pointer;
|
||
z-index: 10001;
|
||
user-select: none;
|
||
transition: color 0.3s ease;
|
||
`;
|
||
closeBtn.onmouseover = () => closeBtn.style.color = '#ccc';
|
||
closeBtn.onmouseout = () => closeBtn.style.color = 'white';
|
||
|
||
// Create image container
|
||
const imgContainer = document.createElement('div');
|
||
imgContainer.style.cssText = `
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
width: 100%;
|
||
height: 100%;
|
||
padding: 20px;
|
||
box-sizing: border-box;
|
||
`;
|
||
|
||
// Create zoomed image
|
||
const zoomedImg = document.createElement('img');
|
||
zoomedImg.style.cssText = `
|
||
max-width: 90%;
|
||
max-height: 90%;
|
||
object-fit: contain;
|
||
border-radius: 8px;
|
||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
|
||
transition: transform 0.3s ease;
|
||
`;
|
||
|
||
imgContainer.appendChild(zoomedImg);
|
||
modal.appendChild(closeBtn);
|
||
modal.appendChild(imgContainer);
|
||
document.body.appendChild(modal);
|
||
|
||
// Function to show modal
|
||
function showModal(imgSrc, imgAlt) {
|
||
zoomedImg.src = imgSrc;
|
||
zoomedImg.alt = imgAlt || '';
|
||
modal.style.display = 'block';
|
||
document.body.style.overflow = 'hidden';
|
||
|
||
// Fade in
|
||
setTimeout(() => {
|
||
modal.style.opacity = '1';
|
||
}, 10);
|
||
}
|
||
|
||
// Function to hide modal
|
||
function hideModal() {
|
||
modal.style.opacity = '0';
|
||
setTimeout(() => {
|
||
modal.style.display = 'none';
|
||
document.body.style.overflow = '';
|
||
}, 300);
|
||
}
|
||
|
||
// Close modal when clicking outside image or close button
|
||
modal.addEventListener('click', function(e) {
|
||
if (e.target === modal || e.target === imgContainer) {
|
||
hideModal();
|
||
}
|
||
});
|
||
|
||
closeBtn.addEventListener('click', hideModal);
|
||
|
||
// Close modal with Escape key
|
||
document.addEventListener('keydown', function(e) {
|
||
if (e.key === 'Escape' && modal.style.display === 'block') {
|
||
hideModal();
|
||
}
|
||
});
|
||
|
||
// Add click handlers to all images in content
|
||
function addImageZoom() {
|
||
const contentImages = document.querySelectorAll('.hextra-content img, article img, .content img, main img');
|
||
|
||
contentImages.forEach(img => {
|
||
// Skip if already has zoom functionality
|
||
if (img.classList.contains('zoom-enabled')) return;
|
||
|
||
// Add zoom class and cursor style
|
||
img.classList.add('zoom-enabled');
|
||
img.style.cursor = 'zoom-in';
|
||
img.style.transition = 'transform 0.2s ease, box-shadow 0.2s ease';
|
||
|
||
// Add hover effect
|
||
img.addEventListener('mouseenter', function() {
|
||
this.style.transform = 'scale(1.02)';
|
||
this.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.15)';
|
||
});
|
||
|
||
img.addEventListener('mouseleave', function() {
|
||
this.style.transform = 'scale(1)';
|
||
this.style.boxShadow = 'none';
|
||
});
|
||
|
||
// Add click handler for zoom
|
||
img.addEventListener('click', function(e) {
|
||
e.preventDefault();
|
||
showModal(this.src, this.alt);
|
||
});
|
||
});
|
||
}
|
||
|
||
// Initialize zoom for existing images
|
||
addImageZoom();
|
||
|
||
// Re-initialize for dynamically loaded content
|
||
const observer = new MutationObserver(function(mutations) {
|
||
mutations.forEach(function(mutation) {
|
||
if (mutation.addedNodes.length > 0) {
|
||
addImageZoom();
|
||
}
|
||
});
|
||
});
|
||
|
||
observer.observe(document.body, {
|
||
childList: true,
|
||
subtree: true
|
||
});
|
||
}); |