定位方案
三种定位方案及其优先级
css2.1中,一个盒可能会根据三种定位方案来布局:
- 常规流:包括块级盒的块格式化、行内级盒的行内格式化和块级与行内级盒的相对定位。
- 浮动:在浮动模型中,盒先根据常规流来放置,然后从常规流中取出来并尽可能远地向左或向右移动。其他内容可能沿着浮动(盒)的一侧排列。
- 绝对定位:在绝对定位模型中,一个盒会从常规流中全部移除(它不会影响后面的兄弟元素),并根据包含块确定位置。
根据实验,三种定位方案的优先级为:绝对定位>浮动>常规流。比如一个元素中同时出现了position:absolute和float:left(不管在css类中出现的顺序如何),那么这个元素会被认为是position:absolute,而忽略float:left,
流内元素和流外元素
如果一个元素是浮动的、绝对定位的或者是根元素,它就叫流外(out of flow)元素。如果一个元素不是流外的,就叫流内(in-flow)元素。
元素的流
(流外)元素A的流是由A和所有最近的流外祖先(这里的“流外”是个定语,即这个祖先必须是“最近的”且是“流外的”)为A的流内元素组成的集合。
换句话说,流内元素的流只包含该元素自己,流外元素的流包含自身及所有的后代元素(除了被包进其他流外元素的)。
选择定位方案(position属性)
position和float属性决定了用哪种CSS2.1定位算法来计算盒的位置。
position属性值的含义如下:
- static:盒是一个常规盒,根据常规流布局。top、right、bottom、left属性失效。
- relative:盒的位置根据常规流计算,然后盒相对于其常规位置偏移。当盒B为相对定位时,后面的位置按照B没有偏移量来计算。display取值前缀为table-的元素上使用position: relative的效果是未定义的。
- absolute:盒位置由top、right、bottom、left属性指定,这些属性指定了相对包含块的偏移量。绝对定位的盒脱离了常规流,意味着它们不会影响后面兄弟元素的布局。
- fixed:除了盒相对于某些参照是固定的之外,盒的位置根据absolute模型来计算。
盒偏移
top、right、bottom、left这四个属性的值含义如下:
- <length>:固定偏移。
- <percentage>:包含块宽度(对于left和right)和高度(对于top和bottom)的百分比值。
- auto:对于非替换元素,该值的效果取决于哪些相关的元素的值也是auto的数学。非替换元素的详细情况,见“绝对定位的width和height章节”。对于替换元素,该值的影响只取决于替换内容的固有尺寸,见“绝对定位的width和height章节”。
display、position与float之间的关系
display |
position |
float |
元素 |
结果 |
none |
不生效 |
不生效 |
|
元素不生成盒 |
非none |
非(absolute或fixed) |
none |
非根元素 |
display计算值使用指定值 |
非none |
非(absolute或fixed) |
none |
根元素 |
display计算值根据下表来设置 |
非none |
非(absolute或fixed) |
left或right |
|
display计算值根据下表来设置 |
非none |
absolute或fixed |
计算值为none |
|
display计算值根据下表来设置 |
(也就是说,浮动和绝对定位时,display会重新计算)
Specified value |
Computed value |
inline-table |
table |
inline, inline-block, table-row-group, table-row, table-column-group, table-column, table-caption, table-header-group, table-footer-group, table-cell |
block |
其他 |
与指定值相同 |
list-item |
应该变成list-tiem或是block在css2.1中未定义 |
(可以看出,就是把行内元素转为对应的块级元素)
此时元素呈现收缩性,但行内级的display全部转变成了块级display,因此可以通过width和height来设置高度和宽度了。