粘性定位元素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;

 

### 回答1: CSS粘性定位position:sticky)是一种新的定位方式,它可以在不同滚动位置下保留元素位置,使得页面更加直观。但是这种方式还存在一些采坑需要注意。 首先是浏览器兼容性问题。目前,不支持CSS粘性定位的浏览器非常常见,如IE、Edge,这使得使用CSS粘性定位时需要考虑到网站使用的浏览器类型和版本。 其次是定位方式问题。CSS粘性定位的原理是在元素滚动到指定位置时切换元素position属性,如果在滚动到指定位置之前改变元素位置,则会影响其粘性定位效果。因此,在使用CSS粘性定位时需要特别注意元素位置是否会发生改变。 最后是滚动容器问题。CSS粘性定位是基于滚动容器进行计算的,因此滚动容器的设置会影响粘性定位效果。例如,如果没有设置滚动容器,粘性定位元素将无法执行其粘性效果。另外,在滚动容器中,如果存在其他元素会影响CSS粘性定位元素的位置,也会影响粘性定位效果。 总结来说,CSS粘性定位虽然具有很多优点,但其实现也需要我们仔细考虑各种问题。在使用CSS粘性定位时,需要考虑到浏览器兼容性、定位方式和滚动容器设置,这样才能真正实现理想中的效果。 ### 回答2: CSS粘性定位position:sticky对于前端开发者来说已经是一种必备的技能。它可以让元素在滚动时保持位置的稳定性,同时也能始终保持相对应的位置。但是,尽管这个特性看似简单,却有着许多的问题和坑点需要注意。 第一个坑:浏览器兼容性问题。 尽管CSS粘性定位position:sticky已成为CSS三大定位属性之一,但实际上在早期的所有浏览器版本中它并不存在。因此,需要考虑浏览器的兼容性问题。在IE11和最新版Chrome、Firefox、Edge等浏览器中已支持。 第二个坑: z-index问题。 当元素使用position:sticky定位时,有时候会出现 z-index 失效的问题。可以通过设置该元素 position 属性为 relative 或者设置 z-index 属性来解决这个问题。 第三个坑:父级元素的高度问题。 CSS粘性定位position:sticky必须要有一个与父元素等高度的容器,否则它的粘性定位就不会生效。 第四个坑:滚动元素的高度限制问题。 如果滚动元素的高度不够,因此没有滚动条,那么粘性元素就会跟随滚动元素消失,而不是一直保持在相应的位置。 第五个坑:移动设备兼容性问题。 在移动设备上,由于touch事件的特性,很难达到粘性定位的效果, 因此需要进行移动端的优化。 总之, CSS粘性定位position:sticky对于提高用户体验来说是相当不错的,但是它在使用中需要注重以下几个方面的问题:浏览器兼容性, z-index问题,父级元素的高度问题,滚动元素的高度限制问题,移动设备兼容性问题,只有注重这些问题,我们才能避免采坑的风险。 ### 回答3: CSS 粘性定位 position:sticky 是在滚动时保持元素位置不变直到到达特定位置才滑动的 CSS 属性。相比于 fixed 和 absolute 定位,它的一个重要优点是具有相对定位的特性,可以在父元素内使用。 然而,在使用 CSS 粘性定位时,会遇到一些采坑的问题。 1. 浏览器兼容性问题 CSS 粘性定位 position:sticky 并不是所有浏览器都支持。在国内主流浏览器中,Chrome 和 Firefox 都已经支持,但是 IE 和 Safari 中并不可用。由于兼容性问题,需要考虑向下兼容,使用传统的 JavaScript 实现滚动粘性定位。 2. 内容多少不一致,表现难以统一 如果父元素的高度不固定,而导致子元素的高度也不确定时,粘性定位会出现问题。如果子元素超过了父元素的高度,那么粘性定位就会失效。因此,在使用 CSS 粘性定位时,需要确保父元素的高度和子元素的高度保持一致,以保持表现的一致性。 3. 滚动条过长,性能开销大 当页面滚动距离过长,粘性定位会占用大量的 CPU 资源。如果页面中存在大量粘性定位元素,那么会对页面的性能造成很大的影响。因此,在使用 CSS 粘性定位时,需要考虑到页面性能的因素,尽量减少使用量。 总之,在使用 CSS 粘性定位时需要认真考虑兼容性、表现一致性和性能因素。建议在使用时灵活选择,并且在必要时使用 JavaScript 实现滚动粘性定位
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值