CSS定位笔记(MDN)
阅读MDN - CSS定位学习笔记
元素没有z-index属性的情况下, 各个元素在z轴从底部到顶部的顺序如下:
- 背景及根元素的border
- 后代没有定位属性的block, 根据其在HTML中的顺序排列
- 后代有定位属性的元素, 根据其在HTML中的顺序排列
各个属性: (均为计算后属性)
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: hidden
或auto
的元素.
大部分情况下, 绝对定位元素height
和width
值为auto
以适应元素内部内容的显示. 不过, non-replaced 绝对定位的元素可以通过声明top
和bottom
的值, 保存height
为默认值auto
来补足垂直方向的空间. 水平方向通过改变left
和right
亦然.
Note:
- 如果
top
和bottom
均声明了值, 以top
为准; - 如果
left
和right
均声明了值, 在有从左到右(LTR)阅读习惯的国家, 以left
为准, 在有从右向左(RTL)阅读习惯的国家, 以right
为准.
浮动块的位置处于定位块和非定位块之间:
有浮动块的情况下, 各个元素在z轴从底部到顶部的顺序如下:
- 背景及根元素的border
- 后代没有定位属性的块级元素, 根据其在HTML中的顺序排列
- 浮动块
- 后代有定位属性的元素, 根据其在HTML中的顺序排列
浮动块不会影响没有定位属性的块级元素的层级, 但是会影响元素内部的内容. 因此更加确切的z轴顺序是:
- 背景及根元素的border
- 后代没有定位属性的块级元素, 根据其在HTML中的顺序排列
- 浮动块
- 后代没有定位属性的内联元素
- 后代有定位属性的元素, 根据其在HTML中的顺序排列
本例(点击子标题链接进入MDN文章查看)中, 除了未定位的所有块级元素都是半透明的, 以更好地说明层叠的顺序, 如果未定位块(DIV #4)的不透明值改变, 就会发生奇怪的现象: 背景和该块级元素会变成在浮动块和定位块的上层. 这是因为规范比较奇特: 给元素添加opacity值会创建一个新的堆叠层, 详见What No One Told You About Z-Index
我们可以在定位元素上添加z-index
属性, 属性值可以是正整数, 零或负整数, 表明了元素在z轴上的层级.
z-index
属性没有声明值时, 默认该元素在0层.
如果多个元素的z-index
值相同, 元素堆叠层级规则遵循没有z-index属性的元素堆叠层级规则