[CSS学习笔记] 粘性固定 position:sticky

2020.06.08更新

在研究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>
demo

总结

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

兼容

  position: -webkit-sticky;
  position: sticky;

Reference

https://developer.mozilla.org/zh-CN/docs/Web/CSS/position

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,686评论 1 92
  • 一 外部式css样式 (也可称为外联式)就是把css代码写一个单独的外部文件中,这个css样式文件以“.css...
    KunMitnic阅读 4,580评论 0 1
  • 本课来自http://www.imooc.com/learn/9请不要用作商业用途。 HTML5 HTML介绍 H...
    PYLON阅读 8,578评论 0 5
  • 今天天气好的不可思议,太阳暖暖的,棒极了。下午有点空闲时间去看了《金刚狼3-殊死一战》,大概是高一时看的金刚狼1,...
    海拉尔一枝花阅读 2,755评论 0 0
  • 今天是一个好天气,六个好朋友正在魔幻森林里散步。 “嘿!哥们儿,你知不知道我把指压板粘在脚上的事...
    荷塘秋色_小盒子阅读 1,586评论 0 2