滚动到屏幕后,如何使 div 粘在屏幕顶部?

IT技术 javascript jquery css scroll positioning
2021-02-05 03:05:05

我想创建一个 div,它位于内容块下方,但是一旦页面滚动到足以接触其顶部边界,就会固定到位并随页面滚动。

6个回答

您可以简单地使用 css,将您的元素定位为fixed

.fixedElement {
    background-color: #c0c0c0;
    position:fixed;
    top:0;
    width:100%;
    z-index:100;
}

编辑:您应该拥有绝对位置的元素,一旦滚动偏移量到达该元素,则应将其更改为固定,并将顶部位置设置为零。

您可以使用scrollTop函数检测文档的顶部滚动偏移

$(window).scroll(function(e){ 
  var $el = $('.fixedElement'); 
  var isPositionFixed = ($el.css('position') == 'fixed');
  if ($(this).scrollTop() > 200 && !isPositionFixed){ 
    $el.css({'position': 'fixed', 'top': '0px'}); 
  }
  if ($(this).scrollTop() < 200 && isPositionFixed){
    $el.css({'position': 'static', 'top': '0px'}); 
  } 
});

当滚动偏移量达到 200 时,元素会在浏览器窗口的顶部,因为是固定放置的。

您的编辑现在确实满足了问题的需求,但是当页面再次滚动到顶部时仍然有问题。您可以在到达元素 scrollTop 后将其存储在某处,并且当页面再次点击该位置时(向上滚动时)将 css 更改回默认值......可能最好使用 .toggleClass 来做到这一点......
2021-03-17 03:05:05
这不能实现我的目标。我希望元素从页面顶部下方 200px 开始(为其他内容留出空间),然后一旦用户向下滚动就固定在顶部。
2021-03-19 03:05:05
@DerrickPetzold 我把它放在答案中,非常重要的东西:)
2021-03-20 03:05:05
new example你给链接非常干净和清晰,我什至看不到它!-_-
2021-04-04 03:05:05
这几乎是什么时候,但是当 is 窗口滚动回顶部时,我确实必须删除固定位置。 if ($(this).scrollTop() < 200 && $el.css('position') == 'fixed') { $('.fixedElement').css({'position': 'static', 'top': '0px'}); }
2021-04-06 03:05:05

您已经在 Google Code 的问题页面和(最近才)在 Stack Overflow 的编辑页面上看到了这个示例

当您向上滚动时,CMS 的回答不会恢复定位。这是从 Stack Overflow 无耻地窃取的代码:

function moveScroller() {
    var $anchor = $("#scroller-anchor");
    var $scroller = $('#scroller');

    var move = function() {
        var st = $(window).scrollTop();
        var ot = $anchor.offset().top;
        if(st > ot) {
            $scroller.css({
                position: "fixed",
                top: "0px"
            });
        } else {
            $scroller.css({
                position: "relative",
                top: ""
            });
        }
    };
    $(window).scroll(move);
    move();
}
<div id="sidebar" style="width:270px;"> 
  <div id="scroller-anchor"></div> 
  <div id="scroller" style="margin-top:10px; width:270px"> 
    Scroller Scroller Scroller
  </div>
</div>

<script type="text/javascript"> 
  $(function() {
    moveScroller();
  });
</script> 

和一个简单的现场演示

一个新生的、无脚本的替代方案是position: sticky,Chrome、Firefox 和 Safari 都支持它。请参阅有关 HTML5Rocks演示文章以及Mozilla 文档

当我使用与演示 (1.3.2) 相同版本的 jQuery 时,这似乎工作得很好。在某些时候offset必须停止接受一个对象作为输入api.jquery.com/offset@Eddie 您的修改对于当前的 jQuery 应该是安全的。
2021-03-11 03:05:05
出于某种原因,{scroll:false} 给我带来了问题(jQuery 1.6.2)。没有它似乎工作。来自链接演示的分叉知道它是否有目的吗?
2021-03-12 03:05:05
是否有任何理由,你不能代替var d = $("#scroller-anchor").offset().top;var d = $("#sidebar").offset().top;,摆脱空卷轴锚定格的所有在一起吗?这是我的叉子,展示了我在说什么。
2021-03-12 03:05:05
我在这方面遇到了很多麻烦,我一生都无法复制,我什至尝试复制现场演示,但它不起作用。任何人都可以链接到提供分步说明的教程吗?
2021-03-18 03:05:05
@MikeDeck 我怀疑如果有边距或填充,您希望能够控制滚动条相对于容器的位置。
2021-04-01 03:05:05

截至 2017 年 1 月和 Chrome 56 发布,大多数常用浏览器都支持position: stickyCSS 中属性。

#thing_to_stick {
  position: sticky;
  top: 0px;
}

在 Firefox 和 Chrome 中对我有用。

在 Safari 中,您仍然需要使用position: -webkit-sticky.

Polyfill 可用于 Internet Explorer 和 Edge;https://github.com/wilddeer/stickyfill似乎是一个不错的选择。

这在当今常用的大多数浏览器中都得到支持。参见 caniuse.com/#feat=css-sticky 其次,我更喜欢可以将 2 行代码归结为需要自定义 Javascript 的版本的解决方案。它也是面向未来的。如果您担心浏览器兼容性,请使用 polyfill。
2021-03-13 03:05:05
我想在此评论中添加我们可以 z-index: 99999; ,因为如果不是,当它到达顶部时,将首先呈现其他内容。但这应该是公认的解决方案。
2021-03-19 03:05:05
只需将其包装在 id="thing_to_stick" 的 div 中
2021-03-27 03:05:05
px部分对我不起作用,让我觉得粘性不起作用。它应该只是top: 0;
2021-04-04 03:05:05

我和你有同样的问题,最终制作了一个 jQuery 插件来解决它。它实际上解决了人们在此处列出的所有问题,此外它还添加了一些可选功能。

选项

stickyPanelSettings = {
    // Use this to set the top margin of the detached panel.
    topPadding: 0,

    // This class is applied when the panel detaches.
    afterDetachCSSClass: "",

    // When set to true the space where the panel was is kept open.
    savePanelSpace: false,

    // Event fires when panel is detached
    // function(detachedPanel, panelSpacer){....}
    onDetached: null,

    // Event fires when panel is reattached
    // function(detachedPanel){....}
    onReAttached: null,

    // Set this using any valid jquery selector to 
    // set the parent of the sticky panel.
    // If set to null then the window object will be used.
    parentSelector: null
};

https://github.com/donnyv/sticky-panel

演示: http : //htmlpreview.github.io/? https: //github.com/donnyv/sticky-panel/blob/master/jquery.stickyPanel/Main.htm

还添加了一个 parentSelector 选项以支持滚动 div。
2021-03-16 03:05:05
嘿 Donny,也喜欢你的插件 (v1.4.1)... 确实遇到了一个问题,如果没有指定块元素就会失去宽度。所以在分离时改变了它......只有通过设置宽度才能保持不变。code// 分离面板 node.css({ "margin": 0, "left": nodeLeft, "top": newNodeTop, "position": "fixed", "width": node.width() });code
2021-03-17 03:05:05
嘿!谢谢!这是一个很好的解决方案,感谢分享,当然它为我节省了很多时间。这应该是这个问题的整体公认解决方案,因为据我所知,它是最完整的解决方案。基本上,其他人没有解决应用位置:固定样式后块的原始X位置的问题。你的解决了这个问题。真的,非常感谢!
2021-03-22 03:05:05
寻找并尝试了许多解决方案,这“开箱即用”。惊人的工作!谢谢!
2021-03-28 03:05:05
@WillHancock 我添加了 iPad 支持,修复了刷新错误并添加了 onDetached 和 onReattached 事件。新事件将使您可以在分离和重新连接后访问面板和间隔面板。
2021-04-06 03:05:05

这是没有jquery 的方法(更新:请参阅其他答案,您现在只能使用 CSS 执行此操作)

var startProductBarPos=-1;
window.onscroll=function(){
  var bar = document.getElementById('nav');
  if(startProductBarPos<0)startProductBarPos=findPosY(bar);

  if(pageYOffset>startProductBarPos){
    bar.style.position='fixed';
    bar.style.top=0;
  }else{
    bar.style.position='relative';
  }

};

function findPosY(obj) {
  var curtop = 0;
  if (typeof (obj.offsetParent) != 'undefined' && obj.offsetParent) {
    while (obj.offsetParent) {
      curtop += obj.offsetTop;
      obj = obj.offsetParent;
    }
    curtop += obj.offsetTop;
  }
  else if (obj.y)
    curtop += obj.y;
  return curtop;
}
* {margin:0;padding:0;}
.nav {
  border: 1px red dashed;
  background: #00ffff;
  text-align:center;
  padding: 21px 0;

  margin: 0 auto;
  z-index:10; 
  width:100%;
  left:0;
  right:0;
}

.header {
  text-align:center;
  padding: 65px 0;
  border: 1px red dashed;
}

.content {
  padding: 500px 0;
  text-align:center;
  border: 1px red dashed;
}
.footer {
  padding: 100px 0;
  text-align:center;
  background: #777;
  border: 1px red dashed;
}
<header class="header">This is a Header</header>
<div id="nav" class="nav">Main Navigation</div>
<div class="content">Hello World!</div>
<footer class="footer">This is a Footer</footer>

@sng 我的示例页面这样做吗?
2021-03-13 03:05:05
非常感谢,这很有效,因为 jquery 与我的项目拥有的一些遗留企业代码相冲突
2021-03-25 03:05:05
@JimW 我发现了这个问题。我试图将它与左侧主要内容 div 旁边的垂直菜单栏一起使用。当您向下滚动时,它会出错,因为它无法确定它何时正确击中页面底部。我最终添加了一行代码,将容器 div 高度设置为滚动事件侦听器的窗口屏幕大小
2021-04-01 03:05:05
虽然我遇到了一个问题,如果我滚动到页面底部,它会自动将我弹回到顶部。
2021-04-03 03:05:05
谢谢!现在很难找到原生 JS 解决方案。这工作得很好。
2021-04-07 03:05:05