浮动 定位 BFC 包含块

2018-12-23  本文已影响0人  fb941c99409d

文档流

文档流处在网页的最底层,它表示的是一个页面中的位置, 我们所创建的元素默认都处在文档流中

元素在文档流中的特点:

块元素

       1.块元素在文档流中会独占一行,块元素会自上向下排列

       2.块元素在文档流中默认宽度是父元素的100%

       3.块元素在文档流中的高度默认被内容撑开

内联元素

       1.内联元素在文档流中只占自身的大小默认从左向右排列, 如果一行中不足以容纳所有的内联元素,则换到下一行, 继续自左向右。

       2.在文档流中,内联元素的宽度和高度默认都被内容撑开


浮动

浮动时才考虑的层级问题: 1个元素 分两层 文字层和 标签层  浮动后提升半级, 提升标签层, 所以后面的元素会上来标签层, 文字层却不会上来这就是文字环绕的原理

1. 块元素在文档流中默认垂直排列,如果希望块元素在页面中水平排列,使用float来使元素浮动,从而脱离文档流,它下边的元素会立即向上移动

2. 元素浮动以后,会尽量向页面的左上或这是右上漂浮,直到遇到父元素的边框或者其他的浮动元素

3. 如果浮动元素上边是一个没有浮动的块元素,则浮动元素不会超过块元素

4. 浮动的元素不会超过他上边的兄弟元素,最多最多一边齐

5. 浮动的元素不会盖住文字,文字会自动环绕在浮动元素的周围,所以我们可以通过浮动来设置文字环绕图片的效果

6. 块元素脱离文档流以后,高度和宽度都被内容撑开

7. 元素 开启浮动 脱离文档流以后会变成块元素

清除浮动

.clearfix{*zoom:1;(开启ie6 7 hasLayout 清除浮动)}

.clearfix:before,.clearfix:after{content: ".";height:0;visibility:hidden;display: block;clear: both;}

BFC

开辟BFC容器的方法

1.根元素

2. 浮动元素:float 除 none 以外的值

3. 绝对定位元素:position (absolute、fixed)

4. display 为 inline-block、table-cells、flex

5. overflow 除了 visible 以外的值 (hidden、auto、scroll)

6.IE6以下没有BFC概念 但是有类似hasLayout, 开启方法 *zoom:1  (zoom是放大的意思 1代表不放大,但却触发了hasLayout机制)

BFC的约束规则

1. 内部的block box会在垂直方向上一个接一个的放置

2. 垂直方向的距离由margin决定,属于同一个BFC的两个相邻或嵌套(只要他们之间没有阻挡,例如边框,非空内容,padding等)block box的margin会发生重叠

3. 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此

4. BFC的区域不会与float的元素区域重叠 因为两个BFC区域之间互不影响

5. 计算BFC的高度时,浮动子元素也参与计算

6. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素

高度塌陷

父元素没有设置高度 靠子元素撑开高度 此时子元素 开启浮动后 脱离了文档流 无法撑开父元素 就会导致父元素塌陷  父元素下面的所有元素就会上来  (根据BFC第五条规则可解决)

外边距合并(重叠)

外边距合并的4个条件: 1. 同属于1个BFC内    2. 块级元素 3. 相邻/嵌套(子父级也算) 4.之间没有阻碍(边框,非空内容,padding)

按照BFC的定义,只有同属于一个BFC时,两个块级元素才可能发生Margin的重叠,这个包括(相邻元素,嵌套元素),只要他们之间没有阻挡(例如边框,非空内容,padding等)就会发生margin重叠。因此要解决margin重叠问题,消除4个条件其一就行了 ,对于两个相邻元素来说,意义不大,没有必要给它们加个外壳,但是对于嵌套元素来说就很有必要了,只要把父元素设为BFC就可以了。这样子元素的margin就不会和父元素的margin发生重叠了。

浮动元素覆盖块级元素

同一个BFC下 ,浮动元素会覆盖后面的块级元素。

1.为后面的块级元素创建一个BFC。如overflow:hidden

2. clear: both;

定位position       偏移量默认值auto

relative

    不脱离文档流,提升层级 ,不改变元素display

absolute

    脱离文档流,提升层级,使元素变成块级元素,不设置偏移量则元素位置不会发生变化, 参照最近开启定位的祖先元素没有则参照初始包含块进行定位, 偏移边界是 内容区     margin:auto = margin : auto auto

fixed

    根据浏览器窗口定位,ie6不支持

static默认值

          没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)

sticky 

    粘性定位 具备 relative和fixed的特性 兼容性不好 了解即可

层级

文档流中的普通元素默认最低 定位的元素会提升层级 , 手动设置了z-index层级比不设置的都高

包含块

元素的尺寸及位置 width height padding margin和absolute fixed的偏移值百分比是通过元素的包含块计算得来

元素如何确定包含块:

1.当元素在祖先元素上找不到包含块时 包含块是一个被称为初始包含块的视口大小的矩形  

2.根元素(<html>)所在的包含块是初始包含块

3. static或relative,包含块就是由它的最近的祖先(块|行内块)元素的内容区。

4. absolute,包含块就是由它的最近的定位祖先元素的(包括内填充以内的)区域组成。如果没有祖先定位元素则是初始包含块

5. fixed,包含块就是由 viewport (in the case of continuous media) 组成。

根据百分比计算值

块级元素的包含块的width height=内容区    绝对定位元素 width height = padding+内容区

1. 计算height top及bottom中的百分值,是通过包含块的height的值。

     1.1如果包含块的height值会根据它的内容变化,非absolute的元素计算值为0 

     1.2包含块的position属性的值被赋予relative或static, absolute定位元素会计算包含块的padding值

2. 计算 width, left, right, padding, margin 这些属性由包含块的 width 属性的值来计算它的百分值。

上一篇 下一篇

猜你喜欢

热点阅读