【问题标题】:Javascript Sticky Element onscroll avoid jumpingJavascript Sticky Element onscroll 避免跳转
【发布时间】:2021-06-17 07:28:36
【问题描述】:

当我向下滚动时,我正在尝试修复一个元素。 代码运行良好,但正如您在下面的link 中看到的那样,带有 3 个黄色按钮的栏在即将到达顶部时会跳跃! 似乎有一些模板 css 类导致了这个问题, 但我不知道是哪一个

这是代码

var fixmeTop = $('.pulsanti').offset().top;       

$(window).scroll(function() {                  

    var currentScroll = $(window).scrollTop(); 

    if (currentScroll >= fixmeTop) {          
        $('.pulsanti').css({                      
            position: 'fixed',
            top: '0',
            zIndex: '1020'
        });
    } else {                                   
        $('.pulsanti').css({              
            position: 'relative'
        });
    }

});

谢谢大家

【问题讨论】:

  • 好吧,您更改位置的代码:相对(按钮保持原位)到位置:固定导致问题,这就是按钮跳起来的原因。如果您将相对位置放在位置上,它们将回到旧位置。
  • @MirkoAcimovic 抱歉,但我希望元素在滚动时具有固定位置!

标签: javascript fixed onscroll


【解决方案1】:

我认为问题是在加载某些元素之前分配了 fixmeTop:

var fixmeTop = $('.pulsanti').offset().top;

我的 chrome 控制台输出如下:

> fixmeTop 
< 2314.3374633789062
> $('.pulsanti').offset().top; 
< 3207.5623779296875

可以看到fixmeTop变量并不是真正的元素位置。

也许您需要在body.onload() 中分配它?

更新

页面加载完成后在chrome控制台中执行fixmeTop = $('.pulsanti').offset().top;后,可以验证元素是否顺利贴在页面顶部。

添加此代码片段将创建一个处理函数,以便在窗口的加载事件触发时调用。这将在所有内容(div、图像)加载后发生。这样 fixmeTop 将包含真正的元素位置。

window.onload = function () {
   fixmeTop = $('.pulsanti').offset().top;
}

您可以将变量声明保留在原始脚本中,也可以将其删除并在此处添加var。

另外,请记住,只有在页面上的所有内容都加载完毕后它才会起作用,并且当页面上的任何内容移动时它也将无效 - 例如。页面调整大小,div 重新排列。您必须为每个此类事件添加侦听器以相应地调整值。这样的东西可能有用:

function updateFixmeTop() {
    fixmeTop = $('.pulsanti').offset().top;
}

window.addEventListener("resize", updateFixmeTop);

编辑:在事件监听器中将元素主体更改为窗口

希望对你有帮助!

更新2

假设您添加了 resize 事件侦听器 的代码并滚动到元素应该停留在顶部的位置。如果您要调整窗口的大小,fixmeTop 将被分配一个与页面顶部的元素相对应的值,而不是原始元素位置。

要解决此问题,您可能需要添加一个没有任何边距或填充的虚拟元素:

<div id="elementJustBeforeFixmeTop"></div> <! -- dummy element -->
<div class="pulsanti"> <! -- sticky element -->
    ...
</div>

并且引用它的位置而不是粘性元素

fixmeTop = $('#elementJustBeforeFixmeTop').offset().top;

这样您将存储您希望元素粘贴的滚动位置,如果元素已经在顶部,则不会有所不同。

您可能想检查您的页面是否没有在其他地方更改其布局,并更新那里的 fixmeTop 值以确保它始终指向正确的元素。

【讨论】:

  • 我认为我不必更改代码...正如您在此重复页面上看到的那样,我已删除按钮黄色之前的所有元素,并且该栏修复得很好link
  • 在此示例中,值相同,因此可以按预期工作。在您的页面上,您链接的有问题的值不匹配。 ``` > $('.pulsanti').offset().top; fixmeTop
  • 您的代码评估 if (currentScroll >= fixmeTop) 但 fixmeTop 设置为与实际位置不对应的某个值元素
  • 是的,我的错。 resize 应该绑定到 window 而不是 body。另外我可以告诉你,简单地为 resize 赋值并不能完全解决问题。如果在元素已经粘到顶部时触发此事件,它将分配其当前位置 - 滚动位置 - 到 fixmeTop 。您可以通过在真实元素之前创建一个虚拟元素并记录它的位置来适应它。我会再次更新我的答案
  • 你可以做一些事情,比如当元素粘住时将虚拟元素 padding-bottom 更改为粘滞元素的高度
猜你喜欢
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多