为什么`overflow:hidden`阻止`position:sticky`工作?

问题描述 投票:30回答:4

在下面的代码片段中,有一个粘贴在容器内的div。它始终保持在容器内部,并粘在滚动面板的顶部。这与iOS上的UITableView标题的行为相同,其中标题保持可见,直到下一个标题位于顶部。

在第二个片段中,除了容器具有overflow:hidden CSS规则之外,一切都是相同的。这似乎可以防止position:sticky行为正常工作。

.parent {
  position: relative;
  background: #ccc;
  width: 500px;
  height: 150px;
  overflow: auto;
  margin-bottom: 20px;
}

.hidden-overflow {
  overflow: hidden;
}

.sticky {
  position: sticky;
  background: #333;
  text-align: center;
  color: #fff;
  top: 10px;
}
<div class="parent">
  <div>
    <div class="sticky">
      Hi, I am a sticky inside the container which contains the first paragraph.
    </div>
    <p>
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus volutpat sed metus et porttitor. Integer bibendum lacus eget massa ultricies fermentum. Donec cursus magna eu congue posuere. Sed eget ligula quam. Sed laoreet enim sapien, eget volutpat nisl pellentesque vel. Nulla id dolor sed dolor sodales tristique. Curabitur feugiat massa sed massa bibendum semper et ac orci. In imperdiet nibh quis iaculis viverra. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Quisque vestibulum, nunc non volutpat tristique, nisl nisi volutpat nibh, quis pulvinar purus ex nec justo. Sed a cursus turpis. Quisque nulla odio, lacinia quis vestibulum sit amet, elementum laoreet nisi. Etiam aliquet ligula sagittis,
    consectetur ipsum sit amet, sodales augue.
    </p>
  </div>
  <p>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus volutpat sed metus et porttitor. Integer bibendum lacus eget massa ultricies fermentum. Donec cursus magna eu congue posuere. Sed eget ligula quam. Sed laoreet enim sapien, eget volutpat
    nisl pellentesque vel. Nulla id dolor sed dolor sodales tristique. Curabitur feugiat massa sed massa bibendum semper et ac orci. In imperdiet nibh quis iaculis viverra. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos
    himenaeos. Quisque vestibulum, nunc non volutpat tristique, nisl nisi volutpat nibh, quis pulvinar purus ex nec justo. Sed a cursus turpis. Quisque nulla odio, lacinia quis vestibulum sit amet, elementum laoreet nisi. Etiam aliquet ligula sagittis,
    consectetur ipsum sit amet, sodales augue.
  </p>
  <p>
    Integer congue augue a quam tincidunt, vitae dictum sem iaculis. Proin feugiat nibh vitae leo facilisis, eget laoreet augue dictum. Nunc facilisis tempor feugiat. Aenean eget interdum diam. Maecenas non risus iaculis, scelerisque ipsum eu, facilisis urna.
    Integer velit justo, vestibulum vel vulputate vel, bibendum eu lorem. Phasellus viverra nisl a mi pretium eleifend.
  </p>
</div>
<div class="parent">
  <div class="hidden-overflow">
    <div class="sticky">
      Hi, I am another sticky in the container which contains the first paragraph, but my container has overflow:hidden.
    </div>
    <p>
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus volutpat sed metus et porttitor. Integer bibendum lacus eget massa ultricies fermentum. Donec cursus magna eu congue posuere. Sed eget ligula quam. Sed laoreet enim sapien, eget volutpat nisl pellentesque vel. Nulla id dolor sed dolor sodales tristique. Curabitur feugiat massa sed massa bibendum semper et ac orci. In imperdiet nibh quis iaculis viverra. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Quisque vestibulum, nunc non volutpat tristique, nisl nisi volutpat nibh, quis pulvinar purus ex nec justo. Sed a cursus turpis. Quisque nulla odio, lacinia quis vestibulum sit amet, elementum laoreet nisi. Etiam aliquet ligula sagittis,
    consectetur ipsum sit amet, sodales augue.
    </p>
  </div>
  <p>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus volutpat sed metus et porttitor. Integer bibendum lacus eget massa ultricies fermentum. Donec cursus magna eu congue posuere. Sed eget ligula quam. Sed laoreet enim sapien, eget volutpat
    nisl pellentesque vel. Nulla id dolor sed dolor sodales tristique. Curabitur feugiat massa sed massa bibendum semper et ac orci. In imperdiet nibh quis iaculis viverra. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos
    himenaeos. Quisque vestibulum, nunc non volutpat tristique, nisl nisi volutpat nibh, quis pulvinar purus ex nec justo. Sed a cursus turpis. Quisque nulla odio, lacinia quis vestibulum sit amet, elementum laoreet nisi. Etiam aliquet ligula sagittis,
    consectetur ipsum sit amet, sodales augue.
  </p>
  <p>
    Integer congue augue a quam tincidunt, vitae dictum sem iaculis. Proin feugiat nibh vitae leo facilisis, eget laoreet augue dictum. Nunc facilisis tempor feugiat. Aenean eget interdum diam. Maecenas non risus iaculis, scelerisque ipsum eu, facilisis urna.
    Integer velit justo, vestibulum vel vulputate vel, bibendum eu lorem. Phasellus viverra nisl a mi pretium eleifend.
  </p>
</div>

(改编自@ Daniel's here的片段)

为什么position:sticky不在overflow:hidden的容器中工作?

css css-position
4个回答
38
投票

overflow: hidden并没有阻止position: sticky工作。但是如果你在粘性元素的任何祖先上设置overflowhidden,那么这个祖先元素将是你的粘性元素的滚动容器。如果你将祖先的overflow值从hidden切换到scroll并滚动这个祖先(不是窗口),那么你可以看到粘性仍在工作。

另见https://github.com/wilddeer/stickyfill#pro-tips

任何前驱元素上的overflow,overflow-x或overflow-y的任何非默认值(不可见)都将sticky粘贴到该前任的溢出上下文中。简单来说,滚动前一个将导致粘贴,滚动窗口不会。这是溢出的预期:自动和溢出:滚动,但经常导致问题和溢出混淆:隐藏。

或者http://www.coreyford.name/files/position-sticky-presentation/

框的位置取决于其包含块(建立为position:static)以及其滚动容器,由同一文档中最近的祖先定义,其中'overflow-x'或'overflow-y'的计算值除外'visible',或视口,如果不存在这样的祖先。

或者CSS Positioned Layout Module Level 3 W3C Working Draft

粘性定位的盒子与相对定位的盒子类似地定位,但是偏移是参考具有滚动框的最近祖先计算的,或者如果没有祖先具有滚动框则计算视口。


1
投票

我不确定这会在所有情况下都有效,但是我遇到了这个问题并且能够通过用overflow: hidden;替换clip-paths来解决这个问题。

.parent {
    /*overflow: hidden; removed */
    position: absolute; /*this is required for clip-paths to work*/
    -webkit-clip-path: inset(0); /* safari*/
    clip-path: inset(0);
    clip: rect(0px, auto, auto, 0px); /* IE11/Edge (not that IE11 supports sticky anyway!) */
}

至于必须添加绝对位置,将overflow:hidden元素包装在另一个位置:relative元素然后添加top,bottom,left和right:0;应该让它填充它的父容器。


-3
投票

根据Mozilla(link here

Sticky是一个实验性API,不应在生产代码中使用。

所以对我而言,这就是它无法正常工作的原因。 Edge和IE 11都不支持它,所以对我来说,使用javascript做这样的事情将是前进的方向,有很多应该有所帮助。

这个here就是一个例子

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.