你不知道的 position

285 阅读3分钟

本文不对 position 进行文档式的总结,而且总结一些你可能忽略或不了解的 position 知识点

定位类型

以下内容来自MDN,是理解position的重要概念和基础

  • 定位元素(positioned element) 是其计算后位置属性为 relative, absolute, fixedsticky 的一个元素(换句话说,除static以外的任何东西)。

  • 相对定位元素(relatively positioned element)计算后位置属性为 relative的元素。

  • 绝对定位元素(absolutely positioned element)计算后位置属性为 absolutefixed 的元素。

  • 粘性定位元素(stickily positioned element)计算后位置属性为 sticky 的元素。

偏移属性的优先级

你是否遇到过这种情况:同时设置了 top 和 bottom,期待元素能够被撑开,但是却发现只有 top 生效。这就是偏移属性的优先级问题。

注意:这里我将 topbottomleftright 定义为偏移属性。

按照是否能够将元素尺寸撑开,将偏移属性的优先级规则分为两种情况

  1. 元素能够被撑开

    条件heightwidth 被设定为 auto 的绝对定位元素

    规则:被绝对定位的元素可以通过指定 topbottom,保留 height 未指定(即auto),来填充可用的垂直空间。它们同样可以通过指定 leftright 并将 width 指定为auto来填充可用的水平空间。

  2. 元素不能被撑开

    条件:除上述情况的其他情况

    规则

    • topbottom 优先;
    • directionltr 时,leftright 优先;当 directionrtl 时,反之。

强大的 sticky 属性值

你可能并不知道 positionsticky 这样一个属性值,或者知道但是很容易忽略它。

为什么说它强大,因为刚了解它的用法时,就发现它能很简单地实现一个看似不那么简单的效果,可以参考如下这个来自 MDN 的 demo:

See the Pen Sticky positioning by Šime Vidas (@simevidas) on CodePen.

如何理解 sticky 这个属性值呢?

首先理解下这个单词的意思,sticky 意为 “粘性的”,事实上它的表现也符合它的意思——当元素到达指定的位置处就会被 “粘住”(固定)。

官方一点的理解是,sticky 元素的表现就像是在 relativefixed 之间切换,至于表现为哪种,取决于元素所处的位置。当元素还没到达偏移属性所指定的位置时,表现为 relative ;反之表现为 fixed

再来看看一个更简单的 demo(参考 W3C),是不是就能理解并马上用起来了:

See the Pen ZEYBNQd by YOUNGmaxer (@youngmaxer) on CodePen.

再深入了解一下 sticky

值得注意的是,你可能会遇到以下情况:

  • sticky 并没有生效;
  • 想实现挤占效果;

那么你需要更清楚地了解一下 position: sticky 的一些细节和特性,不妨参考张鑫旭大佬的总结:

  1. 父级元素不能有任何overflow:visible以外的overflow设置,否则没有粘滞效果。因为改变了滚动容器(即使没有出现滚动条)。因此,如果你的position:sticky无效,看看是不是某一个祖先元素设置了overflow:hidden,移除之即可。
  2. 父级元素也不能设置固定的height高度值,否则也没有粘滞效果。
  3. 同一个父容器中的sticky元素,如果定位值相等,则会重叠;如果属于不同父元素,则会鸠占鹊巢,挤开原来的元素,形成依次占位的效果。
  4. sticky定位,不仅可以设置top,基于滚动容器上边缘定位;还可以设置bottom,也就是相对底部粘滞。如果是水平滚动,也可以设置leftright值。

参考