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

滚动过s1元素时为blur元素切换active类的代码失效问题

问题修复方案

原代码存在的核心问题

  • document.getElementsByClassName('s1')返回的是HTMLCollection集合,直接访问.scrollTop会获取不到正确值,必须取集合中的第一个元素(scrolledSection[0])
  • 计算目标位置时用了错误的属性:scrollTop是元素内部的滚动偏移,不是元素在页面中的位置,应该用offsetTop获取元素相对于页面顶部的距离;如果要判断“滚动过s1元素”,需要计算s1元素的底部位置(offsetTop + offsetHeight)
  • window.scrollTop不是标准属性,现代浏览器应使用window.pageYOffset或document.documentElement.scrollTop
  • 使用classList.toggle()会在每次滚动满足条件时反复切换类,应该根据滚动位置判断是添加还是移除类

修复后的完整代码

HTML(无需修改)

<header>
    <div id="blur--linear-gradient"></div>
    <div id="header-container"></div>
</header>

<main>
    <div class="section-content s1"></div>
</main>

CSS(无需修改)

#blur--linear-gradient {
    display: none;
}

#blur--linear-gradient.active {
    display: block;
}

JavaScript(修复版)

var headerContainer = document.getElementById('header-container');
var blurOverlay = document.getElementById('blur--linear-gradient');
// 获取s1元素(取集合第一个,确保元素存在)
var scrolledSection = document.getElementsByClassName('s1')[0];

// 计算s1元素的底部位置(滚动过这个位置时触发)
var scrolledSectionBottomPos = scrolledSection.offsetTop + scrolledSection.offsetHeight;

window.addEventListener('scroll', () => {
    // 获取当前滚动位置(兼容所有浏览器)
    var scrollPos = window.pageYOffset || document.documentElement.scrollTop;

    if (scrollPos >= scrolledSectionBottomPos) {
        // 滚动过s1,添加active类
        blurOverlay.classList.add('active');
    } else {
        // 未滚动过s1,移除active类
        blurOverlay.classList.remove('active');
    }
});

额外说明

如果你的需求是当s1元素进入视口顶部时就触发,而不是滚动过整个元素,只需把scrolledSectionBottomPos改成scrolledSection.offsetTop即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:22:13