fix: maintain visual position during zoom - eliminate perspective effect

When zooming, the page was scaling from a fixed point causing content
to appear to "move through" the viewport like a 3D perspective effect.
This made the zoom feel disorienting as the visible content would shift.

Solution: Proportional scroll compensation
- Track current scale before applying new scale
- Calculate scale ratio (newScale / currentScale)
- Adjust scroll position by multiplying by scale ratio
- Example: scrollTop 1000px at 100% → 1500px at 150%

Benefits:
- Content you're viewing stays in the same visual position
- Zoom feels more like "magnification" than "perspective"
- Smooth, stable zoom experience without content shifting
- Eliminates the "going through me and getting farther" effect

Technical changes:
- Extract current scale from transform property via regex
- Calculate proportional scroll adjustment
- Apply synchronized transform + scroll in requestAnimationFrame
This commit is contained in:
juanatsap
2025-11-12 11:59:00 +00:00
parent a90d923956
commit 405b88bac0
+17 -6
View File
@@ -322,18 +322,29 @@
const cvPaper = document.querySelector('.cv-paper');
if (!cvPaper) return;
// Convert percentage to scale factor (100 = 1.0, 150 = 1.5, etc.)
const scaleFactor = zoomValue / 100;
// 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;
// Preserve scroll position (matching existing toggle pattern)
// Convert percentage to scale factor (100 = 1.0, 150 = 1.5, etc.)
const newScale = zoomValue / 100;
// Calculate scale ratio for scroll adjustment
const scaleRatio = newScale / currentScale;
// Preserve visual position by adjusting scroll proportionally
requestAnimationFrame(() => {
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
// Apply transform
cvPaper.style.transform = `scale(${scaleFactor})`;
cvPaper.style.transform = `scale(${newScale})`;
// Restore scroll position
window.scrollTo(0, scrollTop);
// Adjust scroll position to maintain visual stability
// When zooming in (scaleRatio > 1), scroll more to keep same content visible
// When zooming out (scaleRatio < 1), scroll less
const newScrollTop = scrollTop * scaleRatio;
window.scrollTo(0, newScrollTop);
// Update display
updateZoomDisplay(zoomValue);