粘性固定 position:sticky

在研究rem布局时,无意中看到网易新闻移动端首页的导航栏用上了一个CSS 3的属性粘性定位position:sticky,它是相对定位(position:relative)和固定定位(position:fixed)的混合。
使用它,我们不再用监听scroll事件,即可实现导航栏滚动绝对定位的效果。

 

 

基本用法

nav{
  position:sticky;
  top:10px; /* 阈值 */
}

top/bottom属性

top,bottom的距离阈值取决于最近一个overflowhidden scroll autooverlay祖先元素(并不是相对于viewport 视口)。

例如我们设置top:100px时,在元素滚动到距离祖先元素顶部小于设置的top:100px之前,元素为相对定位。当滚动到超过或等于top:100px时,元素将固定在与祖先元素顶部距离 top:100px 的相对位置,直到距离回滚到阈值以下。

根据下面的例子,我们可以看到position:sticky元素设置的top值是最近一个设置了overflow的祖先元素的距离,当它滚到距离低于其值时将固定在视口当中,此时该元素的效果就为固定定位。

下面例子的结构:

<style>
 /*  精简的部分  */
.container {
    display: flex;
}
.left {
    width: 30%;
    border: 1px solid;
}
.right {
    border: 1px solid red;
    width: 100%;
    margin-top: 40px;
     /*  祖先元素为 auto scroll hidden  */
    overflow: scroll; 
    height: 400px;
}
nav {
  position: sticky;
  top: 100px;
}
</style>
<div class="container">
  <div class="left">右边距离顶部有margin-top: 100px</div>
  <div class="right">
    <h1 style="height:200px;">顶部高200px 红线为中线</h1>
    <nav>这是导航 top:100px</nav>
    <p>滚一个</p>
    <p>滚一个</p>
    <p>滚一个</p>
    <p>滚一个</p>
    <p>到底啦!</p>
  </div>
</div>

 

 

总结

  1. topbottom 的生效距离由最近一个overflow属性是hidden scroll autooverlay祖先元素决定。
  2. 父元素为overflow:hidden时,由于容器内无法滚动,所以实际上也无法生效。
  3. 必须指定topbottomleftright4个值之一,否则只会处于相对定位。
  4. 父元素的高度不能低于sticky元素的高度。
  position: -webkit-sticky;
  position: sticky;

 

 来源: https://www.jianshu.com/p/b72f504121f5


sticky失效的原因,可以参考

https://www.cnblogs.com/coco1s/p/14180476.html

 

l

 

posted @ 2022-01-04 17:15  幽冥狂_七  阅读(114)  评论(0编辑  收藏  举报