Created
July 10, 2025 11:29
-
-
Save dnordby/bd90e76b249f87fda186cc04ae5521a3 to your computer and use it in GitHub Desktop.
Fade images up on load and scroll
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const scrollListenersAdded = /* @__PURE__ */ new WeakSet(); | |
function imageFadeUp() { | |
const imageWrappers = document.querySelectorAll(".js-fade-up"); | |
imageWrappers.forEach((wrapper) => { | |
const rect = wrapper.getBoundingClientRect(); | |
if (rect.top <= window.innerHeight - 45) { | |
const image = wrapper.querySelector("img"); | |
if (image) { | |
if (!image.complete) { | |
image.addEventListener( | |
"load", | |
() => wrapper.classList.add("is-visible"), | |
{ once: true } | |
); | |
} else { | |
wrapper.classList.add("is-visible"); | |
} | |
} | |
} | |
}); | |
} | |
function updateImageZoom() { | |
const imageWrappers = document.querySelectorAll(".js-fade-up"); | |
const viewportCenter = window.innerHeight / 2; | |
imageWrappers.forEach((wrapper) => { | |
const rect = wrapper.getBoundingClientRect(); | |
const image = wrapper.querySelector("img"); | |
if (image) { | |
const elementCenter = rect.top + rect.height / 2; | |
const distanceFromCenter = Math.abs(elementCenter - viewportCenter); | |
const maxDistance = window.innerHeight / 2; | |
const zoomFactor = Math.max( | |
1, | |
1.05 - distanceFromCenter / maxDistance * 0.05 | |
); | |
image.style.transform = `scale(${zoomFactor})`; | |
image.style.transition = "transform 0.1s ease-out"; | |
} | |
}); | |
} | |
function addScrollListener(element) { | |
if (!scrollListenersAdded.has(element)) { | |
element.addEventListener("scroll", () => { | |
imageFadeUp(); | |
updateImageZoom(); | |
}); | |
scrollListenersAdded.add(element); | |
} | |
} | |
function setupScrollListeners() { | |
if (!scrollListenersAdded.has(window)) { | |
window.addEventListener("scroll", () => { | |
imageFadeUp(); | |
updateImageZoom(); | |
}); | |
scrollListenersAdded.add(window); | |
} | |
const scrollableElements = document.querySelectorAll( | |
'[style*="overflow"], [class*="overflow"]' | |
); | |
scrollableElements.forEach((element) => { | |
if (element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth) { | |
addScrollListener(element); | |
} | |
}); | |
} | |
window.addEventListener("load", () => { | |
imageFadeUp(); | |
updateImageZoom(); | |
setupScrollListeners(); | |
}); | |
const observer = new MutationObserver(setupScrollListeners); | |
observer.observe(document.body, { childList: true, subtree: true }); | |
//# sourceMappingURL=custom.js.map |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage:
js-fade-up
class to image wrapper. This triggers the JS listener.fade-up
class to image wrapper to implement the scroll stylesCSS Updates Needed: