You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术咨询:如何实现页面向下滚动时头部图片平滑淡出效果?

How to Implement a Smooth Scroll Fade Effect for Header Images

Hey Greg, totally get what you mean—those subtle, smooth fade-out effects for header images as you scroll are such a nice touch, and it’s super frustrating when you can’t pinpoint how they’re built just by scanning the page code! Let me walk you through two reliable, easy-to-implement methods that’ll get you that exact effect.

Method 1: Scroll Event Listener (Simple & Flexible)

This is the most common approach—we’ll listen to the window’s scroll event, calculate how far the user has scrolled, and dynamically adjust the image’s opacity (and optional position) to create the fade effect.

Step 1: Basic HTML Structure

First, set up your header and image:

<header class="page-header">
  <img src="your-header-image.jpg" alt="Featured Header" class="header-image">
</header>
<main class="page-content">
  <!-- Add enough content here to enable scrolling (lorem ipsum works great!) -->
</main>

Step 2: CSS for Base Styles & Transitions

We’ll add base styling for the header, and crucially, a transition property to make the opacity/position changes smooth:

.page-header {
  position: fixed; /* Use 'relative' if you want the header to scroll with the page */
  top: 0;
  width: 100%;
  height: 350px; /* Match this to your image's desired height */
  overflow: hidden;
  z-index: 10;
}

.header-image {
  width: 100%;
  height: 100%;
  object-fit: cover; /* Prevents image stretching */
  transition: opacity 0.4s ease-in-out, transform 0.4s ease-in-out; /* Smooth animation */
  opacity: 1;
  transform: translateY(0);
}

/* Optional: Add padding to main content if using fixed header */
.page-content {
  padding-top: 350px;
}

Step 3: JavaScript to Handle Scroll Logic

Now we’ll write the scroll listener to adjust the image’s styles based on scroll distance:

const headerImage = document.querySelector('.header-image');
const fadeStart = 50; // Start fading after scrolling 50px
const fadeEnd = 250; // Fully faded out by 250px scrolled

window.addEventListener('scroll', () => {
  const scrollDistance = window.scrollY;

  // Calculate opacity: goes from 1 to 0 as scroll moves from fadeStart to fadeEnd
  if (scrollDistance < fadeStart) {
    headerImage.style.opacity = '1';
    headerImage.style.transform = 'translateY(0)';
  } else if (scrollDistance > fadeEnd) {
    headerImage.style.opacity = '0';
    headerImage.style.transform = 'translateY(-30px)'; // Add subtle upward shift
  } else {
    const opacityValue = 1 - ((scrollDistance - fadeStart) / (fadeEnd - fadeStart));
    headerImage.style.opacity = opacityValue;
    const translateYValue = -30 * ((scrollDistance - fadeStart) / (fadeEnd - fadeStart));
    headerImage.style.transform = `translateY(${translateYValue}px)`;
  }
});

Method 2: Intersection Observer (Performance-Focused)

If you’re worried about performance (scroll events can fire hundreds of times per second), the Intersection Observer API is a better choice. It lets the browser handle detecting when elements enter/exit the viewport, which is way more efficient.

Step 1: HTML with a Trigger Element

We’ll add an invisible trigger element below the header—when this element enters the viewport, we’ll fade the image:

<header class="page-header">
  <img src="your-header-image.jpg" alt="Featured Header" class="header-image">
  <!-- Invisible trigger for Intersection Observer -->
  <div class="fade-trigger"></div>
</header>
<main class="page-content">
  <!-- Scrollable content -->
</main>

Step 2: CSS for Trigger & Transitions

.page-header {
  position: relative;
  width: 100%;
  height: 350px;
  overflow: hidden;
}

.header-image {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: opacity 0.4s ease-in-out, transform 0.4s ease-in-out;
}

.fade-trigger {
  position: absolute;
  bottom: -150px; /* Trigger fade when this 150px element enters the viewport */
  width: 100%;
  height: 150px;
  background: transparent; /* Invisible to users */
}

Step 3: JavaScript with Intersection Observer

const headerImage = document.querySelector('.header-image');
const fadeTrigger = document.querySelector('.fade-trigger');

// Set up the observer
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      // Trigger is in viewport: show the image
      headerImage.style.opacity = '1';
      headerImage.style.transform = 'translateY(0)';
    } else {
      // Trigger is out of viewport: fade the image
      headerImage.style.opacity = '0';
      headerImage.style.transform = 'translateY(-30px)';
    }
  });
}, { threshold: 0.3 }); // Trigger when 30% of the element is visible

// Start observing the trigger
observer.observe(fadeTrigger);

Pro Tips

  • Adjust the transition duration (e.g., 0.4s) and easing function (e.g., ease-in-out) to match your site’s vibe.
  • Play with the transform values (like translateY) to add subtle movement alongside the fade—this makes the effect feel more organic.
  • If you’re using a fixed header, always add padding to your main content to prevent it from being hidden under the header.

内容的提问来源于stack exchange,提问作者Greg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:16:18