你可能真的不会用sticky

position: sticky 是开发中相对高频的一个用法,不过在最近的项目中竟然被我玩翻车了,设置了sticky尽然不生效了,于是便想一探究竟。

元素根据正常文档流进行定位,然后相对它的最近滚动祖先(nearest scrolling ancestor)和 containing block (最近块级祖先 nearest block-level ancestor),包括table-related元素,基于top,right, bottom, 和 left的值进行偏移。偏移值不会影响任何其他元素的位置。

该值总是创建一个新的层叠上下文(stacking context)。注意,一个sticky元素会“固定”在离它最近的一个拥有“滚动机制”的祖先上(当该祖先的overflow 是 hidden, scroll, auto, 或 overlay时),即便这个祖先不是最近的真实可滚动祖先。这有效地抑制了任何“sticky”行为

它是做什么的?

  • 它先以正常的文档流的定时进行定位,当页面滚动到指定位置的时候会脱离文档流。

它有什么问题?

  • 它是相对于最近的滚动元素进行定位的
  • 它可以被父级元素的overflow属性所影响

sticky的正常效果

<div class="content-wrap">
  <div class="content">
    <div class="top">顶部区域</div>
    <div class="sticky">粘性布局</div>
    <div class="bottom">底部区域</div>
  </div>
</div>

<style>
  .top {
    height: 100px;
    text-align: center;
    background-color: gray;
  }

  .bottom {
    height: 2000px;
    background-color: paleturquoise;
  }

  .sticky {
    height: 30px;
    background-color: red;
    position: sticky;
    top: 0px;
  }
</style>

在这里插入图片描述

失效的原因

1、sticky 设置了非滚动父元素。

 <div class="prent">
   <div class="sticky">粘性布局</div>
 </div>

当我们将为sticky元素设置了父组件时,也就是sticky的父元素不为body根元素时,此时的sticky定位时相对于prent元素的
在这里插入图片描述
当然现在我们还没有办法去理解这样的一个行为,我们来给prent加一点高度再来看一看

 .prent {
   border: 2px solid yellow;
   height: 200px;
   background-color: #aaaaaa;
 }

在这里插入图片描述
有趣的是,当元素滑动到prent时,sticky元素开始生效了;

当我们继续向下滑动到bottom时,sticky元素随着prent元素离开了页面。

那么我们就可以得出结论,sticky元素的定位时相对于父级元素的,并且父级元素需要为可滚动的元素

2、父元素设置overflow

前面说道,当sticky脱离了文档流,使用overflow属性的以下hidden, scroll, auto, 或 overlay时会阻止元素的定位。

.prent {
  border: 2px solid yellow;
  height: 200px;
  background-color: #aaaaaa;
  overflow: hidden;
}

总结

1、使用sticky是父级元素需要拥有滚动机制
2、使用sticky不使用overflow的属性

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值