定位可以准确地定义元素框相对于其正常位置,或相对于其父元素、另一个元素,甚至是浏览器窗口本身(视口,viewport)的位置,应该出现在哪里。
1 | Value: static|relative|sticky|absolute|fixed |
static
: 元素框正常生成。块级元素生成一个矩形框,作为文档流的一部分。行内元素创建一个或多个在其父元素中流动的行框。relative
: 元素框偏移一段距离(相对于其自身偏移)。元素仍保持其为定位前的形状,并且它原本所占的空间仍保留。absolute
: 元素框从文档流完全删除,并相对于其包含块
定位。元素原先在正常文档流中占据的空间会关闭,就好像元素不存在一样。定位元素生成块级框,而不论原来它在正常流中生成的框的类型fixed
: 元素框的表现类似于将position
设置为absolute
,但是其保护块是视口本身(viewport)。sticky
: 元素留在正常流中,直到处罚它的粘贴的条件出现,这时它从正常流中移除,其行为同absolate
相同,但它在正常流中的原始空间被保留下来。一旦不在满足粘贴条件,元素将回到其原始空间中的正常流。stick元素
是根据滚动位置在relative
和fixed
之间切换。它的位置是relative
,直到一个给定的偏移位置在视口
被满足,然后切换至fixed
,就好像它“粘”在那个位置。
包含块
一般来讲,包含块就是包含另一个元素的方框。在正常流中,html
根元素是body
元素的包含块。当涉及到定位时,包含块完全取决去定位的类型。
- “根元素”的的包含块,也称初始包含块,,在大多数浏览器中,是一个视口大小的矩形。
- 对于一个非根元素,如果其
position
值是relative
或static
,包含块有最近的块级框、表单元格或行内块祖先框的内容边界构成。 - 对于一个非根元素,如果其
position
值是absolute
,包含块设置为最近的position
值不是static
的祖先元素(可以是任何类型)。具体如下:- 如果祖先是块级元素,包含块设置为该元素的填充边界,即有其边框界定的区域。
- 如果这个祖先是行内元素,包含块设置为该元素的内容边界。
- 如果没有祖先,则元素包含块定义为初始包含块。
定位元素的宽、高
relative
,absolute
,fixed
使用了 4 个属性(top,bottom,right,left)来描述定位元素个各边相对于其包含块的偏移,那么元素的宽、高将由这些偏移隐含确定。- 可以是使用
max-width
,min-height
来为定位元素设置最小/最大 宽/高。
内容溢出
1 | Value: visible|hidden|scroll|auto |
visible
,默认值,元素内容在元素框之外也可见,但不会改变元素框的形状。scroll
,元素内容在元素框的边界处剪裁,会提供滚动机条。hidden
,元素内容在元素框的边界处剪裁,也不会提供滚条,使用户访问超出剪裁区的内容auto
,只在必要时提供滚动条。
元素可见性(visibility)
1 | Value: visible|hidden|collapse |
visible
,默认值,元素设置为可见hidden
, 元素设置为“不可见”.但元素还会影响文档的布局,就好像声明opacity: 0;
。换句话说,元素还在那里,只不过你看不到它。这与display: none
有区别,对于后者,元素不仅不显示,还会从文档中删除,且对文档布局没有任何影响collapse
,用于表格元素。
绝对定位
包含块和绝对定位元素
元素绝对定位时,会从文档流中完全删除。相对于其包含块定位,其边距的边界根据偏移属性放置。定位元素不会围绕其他元素内容流动,反之亦然。这就意味着,一个绝对定位元素可能与其他元素重叠或被它们重叠。
绝对定位的元素的包含块是最近的position
值不为static
的祖先元素。
元素绝对定位时,也会为其后代元素建立一个包含块
(自动偏移)Auto-edges
非替换元素
水平方向:left + margin-left + border-left-width + +padding-left+ width + padding-rgiht + border-right-width + margin-right + right = 包含块的width
- 如果
left
,width
,right
都设置auto
。结果:左边界置于静态位置(元素在正常流中的原本位置,即在从左向右读的语言中,要把auto替换为静态位置
),元素的width
设置为“刚好只能包含其内容”,right
的计算值就是从元素的右边界到包含块的右边界之间的距离。 - 如果
left
,width
,right
不是auto
,左右外边距(margin: 0 auto;)都设置为 auto。这实际上回让元素居中。 - 如果定位元素个宽度相加还小于包含块的宽度,在这种情况下,浏览器会忽略
right
的值,并重置right
的值 - 一般来讲,如果只有一个属性设置
auto
,就会修改这个属性来满足等式。元素会延伸到必要的宽度,而不是“收缩”内容
- 如果
替换元素
- 如果
width
设置为auto
,width
的实际值有由元素内容的固有宽度决定。如果声明了width
则使用该值 - 在从左向右读的语言中,如果
left
值为auto
,要把auto
替换为静态位置。 - 如果
left
或right
仍为auto
,则将margin-left
或margin-right
的auto
值替换为 0. - 如果此时
margin-left
和margin-right
的值还定义为auto
,则把它们设置为相等的值,从而将元素在其包含块中居中 - 在此之后,如果只剩一个
auto
,则将其修改为等于等式的余下部分 - 如果值过度受限,则浏览器会忽略 right 的值,并被新计算值覆盖。
- 如果
Z 轴上的放置
- 利用
z-index
可以改变元素相互的覆盖顺序,较高z-index
值覆盖较低z-index
值的元素。 - 一旦给一个元素指定了
z-index
值(不是auto
),该元素就会建立自己的局部叠放上下文,这意味着,相对于该祖先元素,所以元素的后代都有自己的堆叠顺序。 - 如果一个元素为其后代建立了叠放上下文,并且该元素位于此上下文 z 轴的 0 位置上。
1 | p {border: 1px solid; background: #DDD; margin: 0;} |
上述元素的叠放顺序:
1 | p#one 3 |
固定定位
- 固定定位与绝对定位很类似,只不过固定定位元素的包含块是视窗。固定定位时,元素会完全从文档流中移除,不会有任何相对于文档中任何部分的位置。
- 固定定位的用途在屏幕上放置一个“永久性”元素,例如,购买链接、版权信息
相对定位
- 使用偏移属性移动定位元素,不过,原来所占据的空间不会从文档流中移除
- 如果相对定位一个元素,它会立即为其所有子元素建立一个姓的包含块,这个包含块对应于该元素原本所在的位置,元素偏移是相对于其自身位置
- 如果遇到过度受限的相对定位,一个值会重置为另一个值的相反数。例如:因此:
1
2
3
4
5strong {
position: relative;
top: 10px;
bottom: 20px;
}bottom
的值总等于-top
,即bottom: -10px;
粘性定位
- 偏移量用于定义与包含块相关的粘性定位矩形(sticky-positioning retangle)
- 粘性地位元素在正常流中,直到它的“粘性边缘”接触到矩形的粘性边缘,它就会脱离文档流,固定在那个位置。
- 使用
overflow: scroll
也可以为元素创建包含块,这中情况下,包含块不是有定位创建的。 - 如果定义多个偏移量属性,且都是
auto
以外的值,那么所以这些属性都成为“粘性边缘”。 - 显示的指定
z-index
的值,来决定粘性元素的叠放顺序