将"position: sticky"应用于div的子元素

29

当我将 position: sticky 应用到 div 的子元素时,它似乎不起作用。如何解决?

HTML:

Lorem Ipsum
<div class="this-parent-div-is-necessary">
   <div class="div-sticky-class">
     Test
   </div>
</div>
Lorem Ipsum

CSS:

.div-sticky-class{
  color: red;
  position: sticky;
  position: -webkit-sticky;
  top: 0;
}

示例: https://jsfiddle.net/n8Le2tva/


你能分享更多的CSS代码吗?比如父级div的CSS?在父元素中使用overflow:auto会导致sticky在Safari中无法正常工作。我猜测你使用-webkit-sticky是因为要考虑Safari的兼容性问题。 - Robert
2
你需要使用JavaScript或以某种方式摆脱父元素。Firefox可以理解display:contents https://jsfiddle.net/n8Le2tva/1/,但这有什么意义呢?`display:inline`也可以 https://jsfiddle.net/n8Le2tva/2/。 - G-Cyrillus
@Bob 在 https://jsfiddle.net/n8Le2tva/3/ 中,将br标签添加到父元素内部,因为您的父元素太短了,无法保持粘性,这是相对于父div元素的。 - Huangism
@GCyrillus,两个很棒的解决方案,但它们在Safari上不起作用... - Bob
@Bob,你想要实现什么?看起来你不需要使用js。 - Huangism
显示剩余2条评论
5个回答

17
您的粘性元素效果正常,看不到它是因为包含它的容器 div 的高度与粘性元素本身一样短,因此当它固定后,父容器已经滚动出视图。
如果您在父 div 中添加 br 标签,则可以看到它固定。一旦您滚过父容器,它将随父容器一起滚动,并且不再可见,正如您在原始 fiddle 上所看到的。在此页面上有一个示例:https://developer.mozilla.org/en/docs/Web/CSS/position 如果您要将其停靠在整个页面上,则只需将粘性元素放置在更高级别的 div 下面,例如包含所有页面内容的 div。请记住,它只会在父容器内固定。 https://jsfiddle.net/n8Le2tva/3/ HTML
<div class="this-parent-div-is-necessary">
  <div class="div-sticky-class">
      Test
  </div>
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>br/><br/><br/><br/><br/><br/><br/><br/><br/>
  <br/><br/><br/><br/><br/>
</div>

这个例子https://jsfiddle.net/n8Le2tva/10/中,我把粘性元素移出来,以便它固定在整个视口上。


1
不知道你怎么想,但是我看到所有那些<br>标签时都忍不住皱眉,即使是在演示中也是如此。你可以使用<p>lorem1000</p>+TAB代替。测试完成后再删除段落。只是说一下。 - Ricardo Zea
@GustvandeWal 没有什么特别的,只是Emmet,代码完成工具包:https://emmet.io/ - 大多数文本编辑器已经内置了它。顺便说一句,我使用Sublime Text。 - Ricardo Zea

6
将所有内容放在你的 this-parent-div-is-necessary 容器中。

.div-sticky-class {
  color: red;
  position: sticky;
  position: -webkit-sticky;
  top: 0;
}
<div class="this-parent-div-is-necessary">
  Lorem Ipsum
  <div class="div-sticky-class">
    Test
  </div>
  Lorem Ipsum
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
  <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
</div>


1

固定定位只在父级div内起作用,你的html应该像这样:

Lorem Ipsum
<div class="this-parent-div-is-necessary">
   <div class="div-sticky-class">
     Test
   </div>
   <div>Lorem ...</div>
   <div>Lorem ...</div>
   <div>Lorem ...</div>
   <div>Lorem ...</div>
   <div>
     <p>It will works here too</p>
   </div>
</div>
Won't work here because it's outside the parent of div-sticky-class
<br/><br/><br/><br/><br/><br/><br/><br/><br/>

https://jsfiddle.net/n8Le2tva/7/


请解释一下为什么之前它没有工作。 - Huangism
Lorem ipsum文本位于class为“this-parent-div-is-necessary”的div之外。 - Moisés Ñañez
是的,Sagar!如果这些元素在粘性元素的父级 div 中,那么粘性将会生效。 - Moisés Ñañez
3
@MoisésÑañez 仍未解释为什么它不起作用,如果您在任何地方放置 div-sticky-class 元素,它都会起作用。这与父元素无关,唯一需要父元素具备足够的高度(定义或由内容填充),以便粘附时可以看到它。 - Huangism
@Huangism 粘性定位只能在兄弟元素中起作用。 - Moisés Ñañez

0
最有可能的是,您希望将“sticky”应用于页眉的导航链接,而不是标志本身。
<header>
  <img src="/logo.svg" alt="Logo"/>
  <ul>
     <li><a href="/">Home</a></li>
     <li><a href="/">About</a></li>
     <li><a href="/">Contact</a></li>
  </ul>
</header>

这里是你可以使用的潜在 CSS。

header {
  position: sticky;
  top: -100px;
}

这样,您的页眉底部就是固定显示的部分!

如果您的图像没有固定大小,则必须通过JS计算顶部值。然后,您可以找到ul并将其顶部属性设置为img的负高度。

当然,在桌面视图上,您很可能希望整个页眉元素都是粘性的,包括img,因此在桌面布局宽度上,只需使用css断点将顶部设置为0即可。


0

它实际上正在工作。但是具有类 div-sticky-class 的div位于另一个移动的div内(具有类 this-parent-div-is-necessary )。如果您想让它工作,可以给外部div相同的类,例如

Lorem Ipsum
<div class="this-parent-div-is-necessary div-sticky-class">
  <div class="div-sticky-class">
      Test
  </div>
</div>
Lorem Ipsum

2
我无法将其应用于父级 div。 - Bob
@Bob,请看一下我评论中的fiddle。 - Huangism

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接