CSS 绝对定位知识点

335 阅读2分钟

1. 脱离了文档流

网页中脱离文档流的元素有三种:

  • root 根元素
  • float 浮动元素
  • absolute 绝对定位
  • fixed 固定定位

脱离正常文档流后,元素及其内部元素大小、位置的改变,对周边元素没有影响。在做动画时,使用绝对定位,可以减少重排或者重绘,这样可以提高性能。

2. 定位的原点

相对定位是相对自身在正常文档流中位置的偏移,而绝对定位是相对其包含块containing block)的偏移。这个包含块可以近似理解为其最近一个非 static 定位的祖先的 padding box 左上角。如果没有这样的祖先,那么会相对于 initial containing block 进行定位,也就是包含整个文档的矩形(不是HTML、也不是BODY)。看下面的例子,展示的视觉效果:

  * {
    margin: 0;
    padding: 0;
  }
  html {
    background-color: rgb(200, 228, 146);
    border: 10px solid black;
  }
  .square {
    height: 100px;
    width: 100px;
    position: absolute;
    top: 0px;
    background-color: blue;
  }
  .container {
    margin-left: 200px;
    position: relative;
    border: 10px solid green;
    height: 200px;
    width: 200px;
  }
  <body>
    <div class="square"></div>
    <div class="container">
      <div class="square"></div>
    </div>
  </body>

绝对定位.png

图中两个蓝色正方形是完全一样的。注意top: 0px,相对 .container 定位的蓝色方块没有覆盖到 border,而相对 initial containing block 的左边蓝色正方形覆盖到了 html 的边框。这说明 initial containing block 是包含 html 的,而不是由 html 元素生成的。

3. 新的 block formatting context

绝对定位元素会生成一个新的 BFC,它的外边距不会折叠,内部的浮动元素不会溢出来。

4. 层叠堆栈上下文(z-index)

绝对定位元素会生成一个层叠上下文,并且在当前层叠上下文中,默认不设值的情况下,它比正常流中的元素以及浮动元素拥有更高的层级,会覆盖到其他元素之上。

5. 绝对定位元素的 float 和 display 的变化

使用了绝对定位的元素,float 属性将无效,display 的变化如下表:

设定值计算值
inline-tabletable
inline, table-row-group, table-column, table-column-group, table-header-group, table-footer-group, table-row, table-cell, table-caption, inline-blockblock
其他与设定值一致