fix: simplify zoom to prevent empty space issues
The viewport-centered zoom approach was creating empty space above the content when zooming to 50%, causing the CV to move down. Solution: Simple top-anchored zoom - Removed all complex scroll compensation logic - Set transform-origin to "top center" (fixed position) - Page now scales naturally from the top without movement - No dynamic transform-origin calculations - No scroll position adjustments Result: - Page stays anchored at top during zoom - No empty space created above content - Clean, predictable zoom behavior - Works correctly at all zoom levels (50%-200%) The page simply scales up/down from the top center point, maintaining its position without any jumping or space issues.
This commit is contained in:
+2
-2
@@ -551,8 +551,8 @@ iconify-icon {
|
|||||||
min-height: auto; /* Changed from 100vh */
|
min-height: auto; /* Changed from 100vh */
|
||||||
|
|
||||||
/* Zoom transform properties */
|
/* Zoom transform properties */
|
||||||
transform-origin: center center; /* Default origin, dynamically updated by JS to viewport center */
|
transform-origin: top center; /* Scale from top center - page stays anchored at top */
|
||||||
transition: transform 0.08s linear, transform-origin 0s; /* Smooth zoom, instant origin change */
|
transition: transform 0.08s linear; /* Smooth, immediate zoom response */
|
||||||
will-change: transform; /* Hint browser to optimize for transforms */
|
will-change: transform; /* Hint browser to optimize for transforms */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-30
@@ -322,39 +322,13 @@
|
|||||||
const cvPaper = document.querySelector('.cv-paper');
|
const cvPaper = document.querySelector('.cv-paper');
|
||||||
if (!cvPaper) return;
|
if (!cvPaper) return;
|
||||||
|
|
||||||
// Get current scale from the element (if any)
|
|
||||||
const currentTransform = cvPaper.style.transform;
|
|
||||||
const currentScaleMatch = currentTransform.match(/scale\(([\d.]+)\)/);
|
|
||||||
const currentScale = currentScaleMatch ? parseFloat(currentScaleMatch[1]) : 1.0;
|
|
||||||
|
|
||||||
// Convert percentage to scale factor (100 = 1.0, 150 = 1.5, etc.)
|
// Convert percentage to scale factor (100 = 1.0, 150 = 1.5, etc.)
|
||||||
const newScale = zoomValue / 100;
|
const scaleFactor = zoomValue / 100;
|
||||||
|
|
||||||
// Zoom from the center of the viewport (user's current viewing position)
|
// Simple transform without scroll manipulation
|
||||||
|
// CSS transform-origin is set to "top center" so page scales from top
|
||||||
requestAnimationFrame(() => {
|
requestAnimationFrame(() => {
|
||||||
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
|
cvPaper.style.transform = `scale(${scaleFactor})`;
|
||||||
const viewportHeight = window.innerHeight;
|
|
||||||
|
|
||||||
// Calculate the point in the page that's at the center of the viewport
|
|
||||||
const viewportCenter = scrollTop + (viewportHeight / 2);
|
|
||||||
|
|
||||||
// Calculate the percentage of the page height where the viewport center is
|
|
||||||
const pageHeight = cvPaper.scrollHeight;
|
|
||||||
const centerPercent = (viewportCenter / pageHeight) * 100;
|
|
||||||
|
|
||||||
// Set transform-origin to the viewport center so zoom happens from where you're looking
|
|
||||||
cvPaper.style.transformOrigin = `center ${centerPercent}%`;
|
|
||||||
|
|
||||||
// Apply transform
|
|
||||||
cvPaper.style.transform = `scale(${newScale})`;
|
|
||||||
|
|
||||||
// Adjust scroll to keep the same content at viewport center
|
|
||||||
// The content position scales with the zoom, so adjust accordingly
|
|
||||||
const scaleRatio = newScale / currentScale;
|
|
||||||
const newViewportCenter = viewportCenter * scaleRatio;
|
|
||||||
const newScrollTop = newViewportCenter - (viewportHeight / 2);
|
|
||||||
|
|
||||||
window.scrollTo(0, newScrollTop);
|
|
||||||
|
|
||||||
// Update display
|
// Update display
|
||||||
updateZoomDisplay(zoomValue);
|
updateZoomDisplay(zoomValue);
|
||||||
|
|||||||
Reference in New Issue
Block a user