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

滚动时背景图透明度降至0.5并限制最小值的实现问题

解决滚动背景透明度异常问题

问题根源

你之前用Math.max()导致所有页面透明度锁死在0.5,本质是没区分「着陆页内滚动」和「离开着陆页」两种场景——直接全局限制最小值,会把着陆页内本该从1过渡到0.5的动态计算值也强制拉到0.5,自然就看不到变化了。

正确实现思路

核心要分两种状态处理:

  • 在着陆页范围内:随着滚动距离增加,背景透明度从1线性降到0.5
  • 完全离开着陆页:透明度固定为0.5;如果滚回着陆页,透明度再从0.5回升到1

这里的「着陆页范围」默认按浏览器视口高度(首屏)算,如果你有自定义高度的着陆区块,直接替换成对应元素的高度即可。

完整代码

// 获取背景元素(替换成你实际的选择器)
const bgElement = document.querySelector('.hero-bg');
// 定义着陆页高度(首屏高度,或自定义区块高度)
let landingHeight = window.innerHeight;
// 最低透明度阈值
const minOpacity = 0.5;

// 滚动处理函数
function adjustBgOpacity() {
  const scrollDistance = window.scrollY;
  
  let opacity;
  if (scrollDistance < landingHeight) {
    // 线性计算透明度:滚到着陆页底部时刚好降到0.5
    opacity = 1 - (scrollDistance / landingHeight) * (1 - minOpacity);
  } else {
    // 离开着陆页后固定最低透明度
    opacity = minOpacity;
  }
  
  bgElement.style.opacity = opacity;
}

// 初始化设置透明度为1
bgElement.style.opacity = '1';
// 绑定滚动监听
window.addEventListener('scroll', adjustBgOpacity);
// 窗口大小变化时更新着陆页高度(避免窗口resize后计算错误)
window.addEventListener('resize', () => {
  landingHeight = window.innerHeight;
});

自定义适配

如果你的着陆页不是整屏,比如是一个带class为landing-section的区块,只需修改着陆页高度的获取方式:

const landingSection = document.querySelector('.landing-section');
let landingHeight = landingSection.offsetHeight;

性能优化(可选)

滚动事件会频繁触发,添加节流函数减少计算次数:

// 节流函数:每16ms(约60帧)执行一次
function throttle(func, delay = 16) {
  let timer = null;
  return (...args) => {
    if (!timer) {
      timer = setTimeout(() => {
        func.apply(this, args);
        timer = null;
      }, delay);
    }
  };
}

// 用节流后的函数绑定滚动事件
window.addEventListener('scroll', throttle(adjustBgOpacity));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:10:34