当前位置: 首页 > 知识库问答 >
问题:

javascript - CSS scroll-snap与JS滚动事件冲突,如何修复滚动时scrollTop始终为0的问题【自动生成的标题 俺不懂啊】?

饶谦
2024-07-08

【css js】使用 scroll-snap-type和scroll-snap-align写了一个整屏滚动页面,用js写页面滚动事件时被卷去的头部一直为0,不知道怎么办?
想实现的功能是:当页面开始滚动时,一个固定定位的盒子位置改变。
类似于蛋仔网站https://party.163.com/ 当页面滚动时右侧导航栏向左滑动出现。
求求了看看我吧纯自学好难啊谢谢大家!

  <script>
        // 1.导航栏向左滑动出现模块
        const main = document.querySelector('.main-wrap')
        const s = document.querySelector('.switch')
        main.addEventListener('scroll', function () {
            const n = document.documentElement.scrollTop
            console.log('滚动了') //这里会正常输出
            console.log(n) //这里输出一直为0
            if (n > 0) {
                s.style.right = '50px'
            }
        })
    </script>

omg AI好牛 怎么办怎么办有了AI要我何用

共有2个答案

彭衡
2024-07-08

回答:此时你这个需求比较适合用GSAP来实现,可以参考渡一web袁老师讲的一个示例

濮阳鸿祯
2024-07-08

当你在一个使用了 CSS scroll-snap 的页面上尝试通过 JavaScript 监听滚动事件并获取滚动位置时,可能会遇到 scrollToppageYOffset 始终为 0 的情况。这通常是因为滚动事件是在一个滚动容器内部触发的,而不是在 document.documentElementwindow 上。

由于你提到了 scroll-snap,我猜测你的滚动事件可能是在一个具有滚动能力的容器元素(如 .main-wrap)上触发的,而不是在文档的根元素上。为了修复这个问题,你应该在 .main-wrap 上添加滚动事件监听器,并检查该元素的 scrollTop 属性。

这里是修改后的代码示例:

<script>
    // 1. 导航栏向左滑动出现模块
    const main = document.querySelector('.main-wrap'); // 假设这是你的滚动容器
    const s = document.querySelector('.switch');

    // 在 main 上添加滚动事件监听器,而不是在 document.documentElement 上
    main.addEventListener('scroll', function () {
        // 使用 main 的 scrollTop 而不是 document.documentElement.scrollTop
        const n = this.scrollTop; // 'this' 在这里指的是 main
        console.log('滚动了');
        console.log(n); // 这里将输出实际的滚动位置

        if (n > 0) {
            s.style.right = '50px';
        } else {
            // 可能还需要一个条件来处理滚动回顶部时的情况
            s.style.right = 'initial'; // 或者你想要的任何默认位置
        }
    });
</script>

请注意,如果 .main-wrap 没有滚动条(即其内容没有超出其可视区域),那么滚动事件将不会触发。确保 .main-wrap 的高度足够大,或者至少有一个可以滚动的子元素。

另外,你还需要确保 .main-wrapoverflow 属性设置为 autoscroll,以便它可以有滚动条并触发滚动事件。

最后,如果你想要实现类似于蛋仔网站那样的导航栏效果,你可能还需要添加一些过渡效果(使用 CSS transition 属性)来平滑地改变 .switch 的位置。

 类似资料:
  • 我有一个这样的代码,我想在滚动期间将一个类添加到我的头上,但是在函数 这是我的html 这是我的jQuery 类没有被添加...在浏览器中,即使在滚动之后,控制台日志函数也没有输出任何内容 解决方案 我把窗户拆了,加了一个尸体,它起作用了。

  • 问题内容: 我正在创建一个标头,一旦滚动到一定数量的像素,它就会固定并保持在原位。 我可以只使用CSS和html来执行此操作吗,还是也需要jquery? 我创建了一个演示,以便您可以理解。任何帮助将是巨大的! 问题答案: 您需要一些JS来进行滚动事件。最好的方法是为固定位置设置一个新的CSS类,当滚动超过某个点时,该类将分配给相关的div。 HTML CSS jQuery 编辑:扩展示例 如果触发

  • 我是JavaFX的新手,不知道如何解决这个问题。所以,我在TableView中有一个复选框列。例如,我先选择3个框,然后向下滚动表格。但当我进入表格顶部时,复选框没有被选中。以下是一些代码: 和数据类"User":

  • 问题内容: 我如何避免滚动页面的其余部分?我考虑过使用和,只是想知道是否有更简单,更用户友好的方法,这样做的最佳实践是什么? 问题答案: 使用的包含您的头,喜欢的东西 在此示例中,当开始时位于下方100px处,但随着用户滚动,它保持原位。当然,不用说,您需要确保有背景,以便当两个s重叠时,其内容实际上是可见的。

  • 问题内容: 我在移动鼠标时在状态栏中显示document.body.scrollTop的值。在IE中,该值始终为0。为什么总是0?还有另一种方法来获取滚动条移动了多少? 问题答案: 您可能要尝试在IE中使用较旧的文档类型:

  • 本文向大家介绍js滚轮事件 js自定义滚动条的实现,包括了js滚轮事件 js自定义滚动条的实现的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js自定义滚动条的实现的具体代码,供大家参考,具体内容如下 描述: 自定义滚动条的实现 效果: 实现: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。