阅读MDN - CSS定位学习笔记

没有z-index属性的元素堆叠层级

元素没有z-index属性的情况下, 各个元素在z轴从底部到顶部的顺序如下:

  1. 背景及根元素的border
  2. 后代没有定位属性的block, 根据其在HTML中的顺序排列
  3. 后代有定位属性的元素, 根据其在HTML中的顺序排列

CSS定位的各个属性

各个属性: (均为计算后属性)

  • static: 默认的定位, 相当于没有定位属性, top, right, bottom, left, z-index在此情况下均无效.

  • relative: 相对定位属性, 含有该属性的元素, 其top/left/bottom/right的值表明该元素相对正常位置(static情况下的位置)的距离. 根据文档的正常流进行定位, 因此元素会被默认添加space, 不会影响任何其他元素的定位. 如果z-index的值不是默认值auto, 会创建一个新的堆叠层, relative属性不作用与含有这些属性的元素: table-*-group, table-row, table-column, table-cell, table-caption

  • absolute: 脱离正常文档流, 不会被默认添加space. 元素相对于其最近的含有定位元素的祖先元素进行定位, 如果没有符合条件的祖先元素, 则相对于其最初的包含块进行定位. 最终的位置由top, right, bottom, left决定. 如果z-index的值不是默认值auto, 会创建一个新的堆叠层. 这种元素可以有外边距且不和其他外边距重叠.

  • fixed: 脱离正常文档流, 不会被默认添加space. 相对于屏幕视口的位置, 不会随着页面滚动而改变位置. 最终的位置由top, right, bottom, left决定, 通常会创建一个新的堆叠层. 当祖先元素含有这些属性之一时: transform, perspective, filter, 那么相对位置的对象就不是视口而是这些祖先元素. In printed documents, the element is placed in the same position on every page.?

  • (absolute/fixed: 绝对定位属性, 元素top/left/bottom/right的值表明该元素相对其包含块的距离. 如果元素存在margin外边距, 其相对距离也要相应地变化.)

  • sticky: 粘性定位属性, 不脱离正常文档流, 相对于文档流根元素和包含块的位置, 包括表格相关的元素, 相关的距离不会影响任何其他元素的位置. 通常会创建一个新的堆叠层. 根据规范, sticky 属性不作用于含有overflow: hiddenauto的元素.

大部分情况下, 绝对定位元素heightwidth值为auto以适应元素内部内容的显示. 不过, non-replaced 绝对定位的元素可以通过声明topbottom的值, 保存height为默认值auto来补足垂直方向的空间. 水平方向通过改变leftright亦然.

Note:

  • 如果topbottom均声明了值, 以top为准;
  • 如果leftright均声明了值, 在有从左到右(LTR)阅读习惯的国家, 以left为准, 在有从右向左(RTL)阅读习惯的国家, 以right为准.

浮动块影响元素堆叠

浮动块的位置处于定位块和非定位块之间:

有浮动块的情况下, 各个元素在z轴从底部到顶部的顺序如下:

  1. 背景及根元素的border
  2. 后代没有定位属性的块级元素, 根据其在HTML中的顺序排列
  3. 浮动块
  4. 后代有定位属性的元素, 根据其在HTML中的顺序排列

浮动块不会影响没有定位属性的块级元素的层级, 但是会影响元素内部的内容. 因此更加确切的z轴顺序是:

  1. 背景及根元素的border
  2. 后代没有定位属性的块级元素, 根据其在HTML中的顺序排列
  3. 浮动块
  4. 后代没有定位属性的内联元素
  5. 后代有定位属性的元素, 根据其在HTML中的顺序排列

本例(点击子标题链接进入MDN文章查看)中, 除了未定位的所有块级元素都是半透明的, 以更好地说明层叠的顺序, 如果未定位块(DIV #4)的不透明值改变, 就会发生奇怪的现象: 背景和该块级元素会变成在浮动块和定位块的上层. 这是因为规范比较奇特: 给元素添加opacity值会创建一个新的堆叠层, 详见What No One Told You About Z-Index

理解z-index

我们可以在定位元素上添加z-index属性, 属性值可以是正整数, 零或负整数, 表明了元素在z轴上的层级.

z-index属性没有声明值时, 默认该元素在0层.

如果多个元素的z-index值相同, 元素堆叠层级规则遵循没有z-index属性的元素堆叠层级规则