理解相对定位
绝对定位
固定定位
。
css2.1中的定位方案
在css2.1中一共有3种定位方案:
normal-flow
文档流,分水平和垂直两个布局上下文float
浮动,让元素脱离normal-flow
里面的IFC
absolute position
绝对定位,position: aboslute
和position: fixed
都属于它
另外relative postion
是同时可应用于normal-flow
和float
的定位形式,所以没有单独作为一个分类。
position
property
position
这个属性,可用于设置元素的定位方式,它的定义如下:
Value: static | relative | absolute | fixed | inherit
初始值: static
可应用于: 所有元素
是否能被继承: no
Percentages: 不支持百分比
各个含义如下:
static
这是position
的默认值,元素按默认的normal-layout
进行布局。与position
相关的四个偏移属性:top left right bottom
在position:static
时无效。relative
这个可以开启相对定位。box
在normal layout
中的布局出来的位置,称为normal position
。relative
可以让box
,相对normal position
进行偏移,利用top left rigth bottom
这四个偏移属性。当一个box
开启relative
并且进行偏移之后,对其它在normal-layout
中的元素布局没有任何影响,其它元素就好像这个box
没有偏移过一样;所以relative
可能会导致box
与其它box
发生重叠。relative
对display
为table-row-group, table-header-group, table-footer-group, table-row, table-column-group, table-column, table-cell, and table-caption
的元素无效。absolute
这个可以开启绝对定位。它会让box
脱离normal layout
,注意这里它是完全脱离normal layout
,不像float
(不会完全脱离BFC
)。然后可以使用四个偏移属性top left rigth bottom
对box
偏移,偏移是相对于containing block
进行的。absolute
的box
不会与任何margin
发生合并。所以margin
可以用在absolute
的元素上实现一些特殊效果,为啥?因为margin能改变元素的位置,对元素实现拉扯定位。fixed
这个也是绝对定位,是一种特殊的绝对定位,它在偏移时是相对视口viewport
进行的,对网页来说,这个视口
一般指的的就是网页的可视区域。fixed
的box
的定位位置不会受网页滚动的影响。
box offset
relative absolute fixed
都可以对box
进行偏移(offset),偏移用到四个css属性:top left rigth bottom
。各个属性定义如下:
top
Value:
<length>
|<percentage>
| auto | inherit
初始值: auto
应用于: 所有元素
是否可被继承: 不
百分比: 支持百分比,相对于containing block
的height
计算
负值:允许
当元素是absolute | fixed
定位时,这个属性定义了box
的top margin edge
与containing block
上边的距离;当元素是relative
时,这个属性定义了box
的top margin edge
与它在normal flow
中或float
时的top margin edge
的距离。
bottom
Value:
<length>
|<percentage>
| auto | inherit
初始值: auto
应用于: 所有元素
是否可被继承: 不
百分比: 支持百分比,相对于containing block
的height
计算
负值:允许
当元素是absolute | fixed
定位时,这个属性定义了box
的bottom margin edge
与containing block
下边的距离;当元素是relative
时,这个属性定义了box
的bottom margin edge
与它在normal flow
中或float
时的bottom margin edge
的距离。
left
Value:
<length>
|<percentage>
| auto | inherit
初始值: auto
应用于: 所有元素
是否可被继承: 不
百分比: 支持百分比,相对于containing block
的width
计算
负值:允许
当元素是absolute | fixed
定位时,这个属性定义了box
的left margin edge
与containing block
左边的距离;当元素是relative
时,这个属性定义了box
的left margin edge
与它在normal flow
中或float
时的left margin edge
的距离。
right
Value:
<length>
|<percentage>
| auto | inherit
初始值: auto
应用于: 所有元素
是否可被继承: 不
百分比: 支持百分比,相对于containing block
的width
计算
负值:允许
当元素是absolute | fixed
定位时,这个属性定义了box
的right margin edge
与containing block
右边的距离;当元素是relative
时,这个属性定义了box
的right margin edge
与它在normal flow
中或float
时的right margin edge
的距离。
其它要点:
- 这四个属性都允许负值,好多网页布局都要利用它们的负值
- 百分比都是相对
containing block
的宽高计算,包括relative
。不要认为relative
的偏移百分比值是相对于自身计算。 auto
这个特殊值的逻辑,需要其它内容。
relative positioning
相对定位
要点。
relative
可以对normal layout
中的box
和float box
生效。box
可以利用四个偏移属性,对box
被relative
之前的位置进行偏移,被relative
的box
在发生偏移后,对其它box
的布局不会有任何影响,其它box
就好像这个box
没有移动过一样。所以relative
可能会造成box
的重叠。但是有一种情况,可能会因为relative
影响布局:当box
被relative
后可能会导致有设置overflow: scroll
或overflow:auto
的box
发生溢出,浏览器需要保证溢出后,还能与这些溢出的relative box
交互,就会通过创建滚动条的方式来满足这点要求,滚动条会影响布局,因为滚动条要占据空间。
relative box
偏移后,box
的尺寸大小不会受影响。
left
与right
属性,只是将box
水平移动,但是不会改变box
大小。正的left
让box
往右偏移,负的left
让box
往左偏移;反之,正的right
让box
往左偏移,负的right
让box
往右偏移;由于box
不会因为left
right
而分割或拉伸,所以它们始终要满足这个关系:left=-right
。
- 当
left
和right
都是auto
的时候,auto
是默认值,这两个属性最终被使用的值都是:0
。 - 如果一个是
auto
,另一个不是,则另一个根据left=-right
自动计算出一个值; - 如果两个都不是
auto
,则会发生冲突,其中一个会被忽略,然后用left=-right
计算一个新值。谁被舍弃,取决于containing block
的direction
这个属性。当direction:ltr
时,表示从从到右的布局方向,right
会被舍弃;当direction:rtl
,时,表示从右到左的布局方向,left
会被舍弃。
top
与bottom
属性,只是将box
垂直移动,但是不会改变box
大小。基本跟left right
大同小异,且满足:top=-bottom
。有一点不同的是:
- 当
top
和bottom
都不是auto
的时候,始终是bottom
被忽略,然后bottom = -top
来得到一个新的bottom
值。
absolute positioning
在绝对定位中,box
是相对于它的containing block
进行偏移的。它可以同时使用top right left bottom
四个属性来指定偏移量,top bottom
和left right
之间同时设定的话,会对box
进行拉伸,所以不存在类似relative
那样的牵制关系。
元素绝对定位后,会完全从normal flow
中脱离出来,并新建一个BFC
来布局子内容。绝对定位的box
会与其它box
发生重叠,他们的堆叠顺序,可以通过stack level
也就是z-index
属性来控制。
fixed positioning
固定定位就是一种特殊的绝对定位,只不过box
偏移的containing block
是viewport
本身。
什么是containing block
在css2.1里面,很多的box
位置和大小都是根据一个矩形区域的边缘来计算的,这个矩形区域称为containing block
。一般情况下,都是box
充当后代boxes
的containing block
,我们说它是一个box
为它的后代创建了containing block
。 一个box
的containing block
,是指它布局所在的那个块,不是指它生成的那个块。
每一个box
都会有一个相对于它所在的containing block
的position
值(x,y坐标),但是containing block
不会限制box
的显示,所以box
可能会溢出。
containing block
具体的定义是什么呢,分以下几种情况:
- 根元素
html
所在的containg block
称为initial containing block
,对网页来说这个containing block
与view port
大小一致,而且固定在canvas
的原点 - 对于
position: relative
或position: static
的box
,它所在的containing block
就是离它最近的一个block container
的content box
区域 - 对于
position: fixed
的box
,它的containing block
就可以看作是view port
- 对于
position: absoulte
的box
,需要先找离它最近的一个祖先元素,并且这个祖先元素的position
设置为了relative or absolute or fixed
,如果找到了则这个元素的padding box
就是这个box
的containing block
,如果没找到,这个box
的containing block
就是initial containing block
总结:containg block
不是一个box
,只是一个矩形区域,但它一般都是从某个box
上拆分出来的,它可能是一个box
的content box
,或者是一个box
的padding box
,或者是跟view port
相关的一个视觉区域。