粘性定位元素position:sticky

本文深入探讨CSS中sticky定位的特性和使用场景,解释如何利用sticky实现元素在特定阈值前后的相对和固定定位,以及在字母列表头部元素定位中的应用。

这里我们不讨论position其他的:static,fixed,relative和absolute几个属性了,之讨论sticky的特性

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

该值总是创建一个新的 Stacking context(层叠上下文)。注意,一个sticky元素会“固定”在离它最近的一个拥有“滚动机制”的祖先上(当该祖先的overflow 是 hiddenscrollauto, 或 overlay时),即便这个祖先不是真的滚动祖先。

overlay:行为与auto相同,但滚动条绘制在内容之上而不是占用空间。 仅在基于WebKit(例如,Safari)和基于Blink的(例如,Chrome或Opera)浏览器中受支持

粘性定位

粘性定位可以被认为是相对定位和固定定位的混合。元素在跨越特定阈值前为相对定位,跨越之后为固定定位。例如:

#one { position: sticky; top: 10px; }

在 viewport 视口滚动到元素 top 距离小于 10px 之前,元素为相对定位。之后,元素将固定定位在与顶部距离 10px 的位置,直到 viewport 视口回滚到阈值以下。

必要条件

  1. 须指定top,right,bottom,left四个阈值其中之一,才可使粘性定位生效。否则其行为与相对定位相同。
  2. sticky元素仅在拥有“滚动机制”的祖先元素中(不一定是直接父元素)生效(不能是overflow:hidden)

我们先来看一个普通的栗子:

HTML内容:

    <div class="box">
        <div class="top"></div>
        <div class="item">top 50px</div>
        <div class="space"></div>
        <div class="space"></div>
        <div class="space"></div>
        <div class="space"></div>
        <div class="space"></div>
        <div class="space"></div>
    </div>

CSS内容:

.box{
    width:400px;
    height:300px;
    border:1px solid #c00;
    overflow:auto;
    background:#ccc;
}
.top{
    height:200px;
    background:lightgreen;
}
.item{
    position:sticky;
    top:50px;
    background:greenyellow;
    color:#000;
    font-size:20px;
    text-align:center;
    width:100%;
    height:60px;
    line-height:60px;
    border:1px solid #000;
}
.space{
    width:100%;
    height:100px;
    background:khaki;
    border:1px solid #c00;
}

效果:

上面栗子中,我们的阈值时top:50px,具有滚动机制的祖先元素时item的直接父元素box。当item到达阈值50时,就定位到box内距离50的位置。

 

进阶:

粘性定位常用于定位字母列表的头部元素。标示 B 部分开始的头部元素在滚动 A 部分时,始终处于 A 的下方。而在开始滚动 B 部分时,B 的头部会固定在屏幕顶部,直到所有 B 的项均完成滚动后,才被 C 的头部替代。

HTML内容:

<div class="box1">
    <div class="box2">
        <dl>
          <dt>A</dt>
          <dd>Andrew W.K.</dd>
          <dd>Apparat</dd>
          <dd>Arcade Fire</dd>
          <dd>At The Drive-In</dd>
          <dd>Aziz Ansari</dd>
        </dl>
        <dl>
          <dt>C</dt>
          <dd>Chromeo</dd>
          <dd>Common</dd>
          <dd>Converge</dd>
          <dd>Crystal Castles</dd>
          <dd>Cursive</dd>
        </dl>
        <dl>
          <dt>E</dt>
          <dd>Explosions In The Sky</dd>
        </dl>
        <dl>
          <dt>T</dt>
          <dd>Ted Leo & The Pharmacists</dd>
          <dd>T-Pain</dd>
          <dd>Thrice</dd>
          <dd>TV On The Radio</dd>
          <dd>Two Gallants</dd>
        </dl>
      </div>
</div>

CSS内容:

* {
  box-sizing: border-box;
}
.box1{
    width:400px;
    height:200px;
    overflow:auto;
    border:1px solid
}
dl {
  margin: 0;
  padding: 24px 0 0 0;
}
dt {
  background: #B8C1C8;
  border-bottom: 1px solid #989EA4;
  border-top: 1px solid #717D85;
  color: #FFF;
  font: bold 18px/21px Helvetica, Arial, sans-serif;
  margin: 0;
  padding: 2px 0 0 12px;
  position: sticky;
  top: -1px;
}
dd {
  font: bold 20px/45px Helvetica, Arial, sans-serif;
  margin: 0;
  padding: 0 0 0 12px;
  white-space: nowrap;
}
dd + dd {
  border-top: 1px solid #CCC
}

效果:

我们这里出现了多个需要定位的元素,他们会依次覆盖上面的sticky定位元素。

并且这里我们嵌套了两层box,具有滚动的元素在外层的box,sticky作用的区域不一定时父级,而是祖先带有滚动机制的元素。

兼容:

position:sticky;
position:-webkit-sticky;

 

### 关于 `position: sticky` 和 `bottom` 属性 #### 支持情况 尽管 `position: sticky` 是一种强大的布局工具,但在实际应用中,它的行为受到浏览器实现的影响。通常情况下,`position: sticky` 主要依赖于顶部偏移量 (`top`) 来定义触发粘性的条件[^1]。然而,在某些现代浏览器中,也可以通过设置底部偏移量 (`bottom`) 实现类似的粘性效果。 需要注意的是,当使用 `bottom` 而不是 `top` 时,可能会遇到兼容性问题。目前主流浏览器对 `position: sticky` 的支持已经较为广泛,但对于 `bottom` 的具体实现仍存在差异。因此建议优先考虑基于 `top` 的设计模式[^2]。 #### 使用方法 以下是利用 `bottom` 进行粘性定位的一个简单示例: ```html <div class="container"> <div class="content">Scroll down...</div> <div class="sticky-element">I stick to the bottom!</div> </div> <style> .container { height: 400px; overflow-y: auto; border: 1px solid black; } .content { height: 800px; /* Simulate long content */ } .sticky-element { position: -webkit-sticky; /* For Safari compatibility */ position: sticky; bottom: 10px; /* Define offset from bottom edge */ background-color: yellow; padding: 10px; } </style> ``` 在这个例子中,`.sticky-element` 将会在容器接近页面底端时保持距离底部边缘 10 像素的位置不动[^3]。 #### 兼容性注意事项 虽然上述代码可以在部分最新版本的浏览器上正常工作,但并非所有环境都完全支持这种用法。特别是较旧版或者特定移动设备上的表现可能不一致。为了确保跨平台一致性,开发者应测试目标受众使用的各种浏览器,并准备相应的回退方案(如 JavaScript 或其他 CSS 技巧)。此外,Safari 浏览器需要额外声明 `-webkit-sticky` 才能生效[^4]。 ### 结论 综上所述,虽然理论上可以通过设定 `bottom` 来运用 `position: sticky` 达成预期视觉效果,但由于潜在的技术局限性和不同客户端间的差异,推荐尽可能采用更稳定可靠的配置——即依靠 `top` 参数完成大部分需求规划。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值