From bd1e958207fd3eaf8a82881bdf94892458d5f7d6 Mon Sep 17 00:00:00 2001 From: Benjamin Wiegand Date: Sun, 8 Sep 2024 13:40:36 -0700 Subject: [PATCH] resize image boundary to match aspect ratio to reduce jank --- www/image-modal.js | 41 ++++++++++++++++-- www/img/security-camera-screenshot-thumb.webp | Bin 15940 -> 13046 bytes www/index.html | 2 +- www/style.css | 15 ++++--- 4 files changed, 46 insertions(+), 12 deletions(-) diff --git a/www/image-modal.js b/www/image-modal.js index 83705fd..5e7532f 100644 --- a/www/image-modal.js +++ b/www/image-modal.js @@ -6,6 +6,7 @@ for (const image of images) { const lazy_image = image.querySelector('.lazy-image') const zoom = modal.querySelector('input') const open = image.querySelector('input'); + const thumbnail = image.querySelector('img'); // for pan let grabbed = false; @@ -17,6 +18,24 @@ for (const image of images) { let clickY = 0; let initW = lazy_image.clientWidth; let initH = lazy_image.clientHeight; + + // for aspect + function fixAspectRatio() { + let img_aspect = thumbnail.clientWidth / thumbnail.clientHeight + let window_aspect = window.innerWidth / window.innerHeight; + let base = zoom.checked ? 200 : 90; + + if (img_aspect > window_aspect) { + // img wider than window + lazy_image.style['min-width'] = base + 'vw'; + lazy_image.style['min-height'] = (base * thumbnail.clientHeight / thumbnail.clientWidth) + 'vw'; + } else { + // window wider than img + lazy_image.style['min-width'] = (base * img_aspect) + 'vh'; + lazy_image.style['min-height'] = base + 'vh'; + } + } + thumbnail.addEventListener('load', fixAspectRatio); // pan the image lazy_image.addEventListener('mouseleave', () => {grabbed = false;}); @@ -41,12 +60,13 @@ for (const image of images) { }); // unzoom on close - close.addEventListener('click', () => { - zoom.checked = false; + open.addEventListener('change', () => { + if (!open.checked) zoom.checked = false; }); // zoom to click target zoom.addEventListener('change', e => { + fixAspectRatio(); if (zoom.checked) { zoom_factor = Math.max( lazy_image.clientWidth / initW, @@ -57,11 +77,24 @@ for (const image of images) { modal.scrollLeft = x; modal.scrollTop = y; } - }) + }); + + // resize image plane to match image aspect ratio + open.addEventListener('change', e => { + if (open.checked) { + fixAspectRatio(); + window.addEventListener('resize', fixAspectRatio); + } else { + window.removeEventListener('resize', fixAspectRatio); + } + }); // close image on escape key document.addEventListener('keydown', e => { - if (e.key == 'Escape') open.checked = false; + if (e.key == 'Escape') { + open.checked = false; + zoom.checked = false; + } }); } diff --git a/www/img/security-camera-screenshot-thumb.webp b/www/img/security-camera-screenshot-thumb.webp index 8fd2eae1288f8e795b73c1c444c602204491f2dc..e490f6e3a4c5f12f64fe15cd6a3ab427a303eeb7 100644 GIT binary patch literal 13046 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

-