HTML的布局机制基于文档流模型
只有**float定位和绝对定位(固定定位)**会脱离文档流。
当元素开启了定位以后,可以通过偏移量(top bottom left right 仅对开启定位的元素有用)来设置元素的位置。
属性值 | 定位基点 | 是否会脱离文档流 | 描述 |
---|---|---|---|
static | 默认值,出现在正常文档流中 | × | |
relative | 相对于该元素在文档中的初始位置进行定位 | × | 相对定位会提升元素的层次,会盖在别人上面 |
absolute | 相对于距该元素最近的已定位的祖先元素 | √ | 绝对定位的元素会提升层级 脱离文档流,元素性质发生变化,可以设置宽高,不独占一行,默认会被内容撑开(行内块元素性质) |
fixed | 相对于浏览器窗口(可视窗口)进行定位 | √ 相对定位的一种 | 存在固定定位偏移问题 |
sticky | 相对于最近的滚动元素进行定位的,如果没有可滚动元素,则表示浏览器视窗 | × | 当粘性约束矩形在可视范围内为relative ,反之为fixed |
z-index
只对有定位属性的元素有效,用于改变元素的层级
水平布局等式margin-left + border-left + padding-left + width + padding-right + border-right + margin-right = 其父元素内容的宽度
当开启了绝对定位之后的水平布局等式增加了left+right变成了
left + margin-left + border-left + padding-left + width + padding-right + border-right + margin-right + right = 包含块的宽度
可以利用这个特性进行垂直据中布局。
//垂直居中的元素
width:xxx;
height:xxx;
position:absolute; //父相子绝,在谁中间就给谁相对定位
margin:auto
left:0;
right:0;
top:0;
bottom:0;
固定定位类似于相对定位,只是永远相对于浏览器的可视区域进行定位
固定定位偏移问题
当父级元素设置transform
后,fixed元素变成了相对父元素进行定位。
问题产生的原因
对于布局受 CSS 盒模型控制的元素,拥有 transform 属性的元素,其值除 none 以外的任何值为其所有后代建立一个包含块(containing block),用于 absolute 定位后代、fixed 定位后代的包含块。
如果祖先元素拥有下列属性,会被作为 absolute
和 fixed
的包含块。
transform/perspective
属性值不为 nonewill-change
属性值为 transform/perspectivefilter
属性值不为 noneabsolute和fixed 本质都是相对于包含块定位,只不过默认情况absolute的包含块为最近的已定位的祖先元素,fixed为窗口可视区域(viewport)定位
两个概念
特点
relative
,反之,则为fixed
overflow
属性设置了scroll
,auto
,hidden
值,粘性定位将会失效案例
红色部分为流盒,蓝色部分粘性约束矩阵,黄色部分为粘性定位元素
<style type="text/css">
body{
height: 2000px;
width: 100%;
background-color: red;
}
div {
height: 400px;
margin-top: 50px;
border: solid deepskyblue;
width: 400px;
background-color: deepskyblue;
}
nav {
position: sticky;
top: 30px;
background: yellow;
height: 60px;
line-height: 60px;
}
style>
<body>
<div>
<nav>导航nav>
div>
body>