β Volver
Apple-Style Scroll Storytelling Hero
Apple-style scroll storytelling section with sticky scene, scroll-driven text transitions, and immersive cinematic progression
Marketing
Preview
<section class="w-full bg-black text-white">
<!-- SCROLL CONTAINER -->
<div class="h-[300vh] relative">
<!-- STICKY FRAME -->
<div class="sticky top-0 h-screen flex items-center justify-center overflow-hidden">
<!-- Background -->
<div class="absolute inset-0">
<img
src="https://images.unsplash.com/photo-1519681393784-d120267933ba?q=80&w=1600&auto=format&fit=crop"
class="w-full h-full object-cover opacity-40 transition duration-700"
id="bgImage"
/>
<div class="absolute inset-0 bg-gradient-to-b from-black/60 via-black/80 to-black"></div>
</div>
<!-- Content -->
<div class="relative z-10 text-center px-6 max-w-3xl">
<h1 id="title" class="text-4xl md:text-6xl font-semibold leading-tight transition-all duration-500">
Enter the Experience
</h1>
<p id="desc" class="mt-6 text-white/70 text-lg transition-all duration-500">
Scroll to begin the journey.
</p>
</div>
</div>
</div>
<script>
const title = document.getElementById("title");
const desc = document.getElementById("desc");
window.addEventListener("scroll", () => {
const scroll = window.scrollY;
const max = document.body.scrollHeight - window.innerHeight;
const progress = scroll / max;
// π Apple-style storytelling logic
// Scroll drives state (this is key concept) :contentReference[oaicite:0]{index=0}
if (progress < 0.25) {
title.innerText = "Enter the Experience";
desc.innerText = "Scroll to begin the journey.";
}
else if (progress < 0.5) {
title.innerText = "Speed becomes perception";
desc.innerText = "Motion is no longer animation β it's interaction.";
}
else if (progress < 0.75) {
title.innerText = "Everything responds to you";
desc.innerText = "Every scroll reveals a new layer of meaning.";
}
else {
title.innerText = "This is scroll storytelling";
desc.innerText = "Not just UI. A guided experience.";
}
// subtle animation
title.style.opacity = 1 - Math.abs(0.5 - progress);
desc.style.opacity = 1 - Math.abs(0.5 - progress);
});
</script>
</section>