position
什么元素可以设置
position答: 常见的元素都可以设置position,除position:relative对display为table-开头的元素无效。
position取值:
- static (默认值)
- relative
- absolute
- fixed
- sticky
static
此时设置top, right, bottom, left 和 z-index 属性无效。
relative
保留元素在标准流的位置,相当于标准流的位置进行定位
top与bottom,相当于标准流的位置进行y轴定位
left与right,相当于标准流的位置进行x轴定位
absolute
元素会被移出正常文档流,
- 元素变成块级元素,可以设置
width与height - 相对于最近的非
static定位祖先元素的偏移,默认为document,不受滚动条影响 - 绝对定位的元素可以设置外边距(
margin),且不会与其他边距合并。
直接设置position: absolute;,而不设置top, right, bottom, left,则会贴在标准流后面
设置top, right, bottom, left后恢复正常,相当于最近的非 static 定位祖先元素进行偏移
Attention
元素设置的width,height,margin与padding的值,都相对于最近的非 static 定位祖先元素,而不再是父元素
fixed
元素会被移出正常文档流
- 元素变成块级元素,可以设置
width与height - 相对于屏幕视口 的位置来指定元素位置,不受滚动条影响
- 当元素祖先的
transform,perspective或filter属性非none时,容器由视口改为该祖先。 直接设置position: fixed;,而不设置top,right,bottom,left,则会贴在标准流后面
元素设置的width,height,margin与padding的值,默认都相对于屏幕视口
sticky
保留元素在标准流的位置,相当于标准流的位置进行定位
- 相对它的最近滚动祖先与最近块级祖先基于
top,right,bottom, 和left的值进行偏移。偏移值不会影响任何其他元素的位置。 - sticky元素会“固定”在离它最近的一个拥有“滚动机制”的祖先上,(当该祖先的
overflow是hidden,scroll,auto或overlay时)
必须设置top, right, bottom, 和 left的其中一个,否则无效
必须在自己的块级祖先内才可以显示
其他注意点
- 设置定位元素会出现层叠上下文,后定位的会遮挡住先定位的,设置
z-index解决
2. 使用
position设置width与height
- 在没有设置
width的定位元素时,如果同时设置right和left,会被当做width处理
- 在没有设置
height的定位元素时,如果同时设置top和bottom,会被当做height处理
- 在
flex布局中,项目如果设置成position:absolute/fixed中的一个,则会脱离flex布局
4. 设置
position:fixed或absolute后,margin:auto失效
5. 使用
position快速水平垂直居中
默认块级元素可以水平居中,因为块级元素默认占满一行
使用
position占满空间后,使用margin:auto,只占满上下可以垂直居中