28. 浮动 {ignore}

[toc]

在讲解常规流(Normal Flow)时,介绍过:视觉格式化模型,大体上将页面中盒子的排列分为三种方式:

  1. 常规流
  2. 浮动
  3. 定位

1. 应用场景

  1. 文字环绕
  2. 横向排列

使用浮动布局的很多效果都可以利用css3中的弹性盒模型来实现,但是,相对而言,浮动的兼容性会更好一些。所以有很多公司,他们在布局的时候,有时候还是会选择使用浮动来实现。

2. 浮动的基本特点

修改float属性值为:

  • left:左浮动,元素靠上靠左
  • right:右浮动,元素靠上靠右

默认值为none

  1. 当一个元素浮动后,元素必定为块盒。(display 属性会自动变为 block
  2. 浮动元素的包含块,和常规流一样,为父元素的内容盒。

3. 盒子尺寸

属性值为 auto

  • 宽度为auto时,适应内容的宽度;
  • 高度为auto时,适应内容的高度;(与常规流一致)
  • marginauto,相当于设置为 0

    • 设置为 auto 无论哪个方向,都是0;不过设置为其他值,还是会生效的。

属性值为百分比

  • 规则与常规流一样;

4. 盒子排列

  1. 左浮动的盒子靠上靠左排列
  2. 右浮动的盒子考上靠右排列
  3. 浮动盒子在包含块中排列时,会避开常规流块盒
  4. 常规流块盒在排列时,无视浮动盒子
  5. 行盒在排列时,会避开浮动盒子
  6. 相邻的外边距不会发生合并

总结:

  • 浮动盒子可以看到常规流的盒子(包括行盒和块盒);
  • 常规流块盒看不到浮动盒子,但是行盒可以;

匿名行盒

如果文字没有在行盒中,浏览器会自动生成一个行盒包裹文字,该行盒叫做匿名行盒。 —— 文字环绕环绕效果

即:纯文本 等价于 常规流行盒。

行盒 实际上可以看做是 内容。

5. 高度坍塌

高度坍塌的根源:常规流盒子的自动高度(适应内容),在计算时,不会考虑浮动盒子。

因为,浮动盒子脱离常规流,所以,常规流盒子在计算高度时(适应内容),不会考虑浮动盒子。

解决办法:清除浮动;

涉及css属性:clear。

  • 默认值:none
  • left:清除左浮动,该元素必须出现在前面所有左浮动盒子的下方
  • right:清除右浮动,该元素必须出现在前面所有右浮动盒子的下方
  • both:清除左右浮动,该元素必须出现在前面所有浮动盒子的下方

元素x 清除浮动并不是表示让 元素x 不浮动,而是让常规流的盒子在确认位置时,抬头看一下飘起来的浮动盒子 元素x 所在的位置,然后再排在这些浮动盒子的后面;

清除浮动三件套:

  1. .clearfix::after {
  2. content: '';
  3. display: block;
  4. clear: both;
  5. }

通常将 clearfix 设置在发生高度坍塌的元素身上,也就是浮动元素的父级身上。

思考:为什么需要设置 display: block;

因为:伪元素默认是行盒,而clear只有在块盒中才会生效。

小结

  • 浮动的应用场景

    • 文字环绕效果
    • 横排效果
  • 浮动元素的特点

    • 浮动元素必然是块盒
    • 浮动元素的包含块和常规流一样,都是父元素的内容盒
  • 浮动盒子尺寸设置

    • auto

      • width、height设置为auto,都是表示适应内容;
      • margin设置为auto,相当于设置为默认值0;
    • 百分比

      • 具体规则同常规流一致