CSS定位与重叠上下文

272 阅读2分钟

定位

  • 让元素在一定程度上摆脱普通流的约束,放置在任意位置,对其它元素不受影响

定位有五个属性,四个值

position:static、relative、absolute、fixed、sticky

top、left、right、bottom

position:static

  • 指定元素在普通流中使用默认布局位置,等同于不加
  • 一般用于覆盖设置过其它定位方式的场景
  • 此时top、right、bottom、left和z-index属性无效
  • 日常所说的定位元素不包括static

position:relative

  • 未脱离普通流(为元素预留空间),元素本身在普通流中的位置并未发生变化,只是视觉上变化
  • 经常作为absolute的参考
    <div class="hero">
        <p>哈哈哈</p>
        <p>哈哈哈</p>
        <p>哈哈哈2</p>
    </div>
		.hero>p:nth-child(2){
            position: relative;
            top: 20px;
        }

上面代码,第二个p元素向下移动,但它后面的p却不随着它移动而移动

position:absolute

  • 指元素脱离普通流(不为元素预留空间),相对于最近的非static定位的祖先元素来进行偏移
  • 适用场景有:下拉菜单、弹窗、输入框内图标,以及其它任何可能产生“覆盖”的场景

position:fixed

  • 从普通流中完全脱离,相对于浏览器窗口进行定位,固定不变
  • 一定要设置top或者bottom

position:sticky

  • 当元素处于普通流中的时候,位置不变;当触碰到页面顶/底部的时候,元素脱离普通流,效果如同fixed一般
  • 如果在一个容器中放置了多个sticky,会出现下一个sticky元素把上一个“覆盖”的效果
  • 如果在并列的多个块容器中放置了多个sticky,会出现下一个sticky元素把上一个“推走”的效果

一些注意事项

  • 定位元素一般仅指代absolute和fixed

  • 定位元素的宽度会收缩,一般需要设置固定宽度或宽度100%

  • 设置为定位元素的行内元素拥有块级特性,可设置宽高

  • 定位元素脱离普通流,可相互覆盖,通过z-index设置层级

层叠上下文 Stacking Context

  • 一父多子参与构建的,遵循一定规则的,独立的环境
  • 子项可能创建新的上下文,与外层上下文有同样的规则,且与外层上下隔绝