前言

float 布局综合整理


1. CSS 布局的三种机制

css 提供了 3 种机制 来设置盒子的摆放位置,分别是普通流,浮动和定位

  1. 普通流(标准流)
    • 块级元素会独占一行,从上向下顺序排列;
      • 常用元素:div、hr、p、h1~h6、ul、ol、dl、form、table
    • 行内元素会按照顺序,从左到右顺序排列,碰到父元素边缘则自动换行;
      • 常用元素:span、a、i、em等
  2. 浮动
    • 让盒子从普通流中起来,主要作用让多个块级盒子一行显示。
  3. 定位
    • 将盒子在浏览器的某一个置——CSS 离不开定位,特别是后面的 js 特效。

2. float布局的作用

  1. 让多个盒子(div)水平排列成一行,使得浮动成为布局的重要手段。(核心目的)
  2. 可以实现盒子的左右对齐等等…
  3. 浮动最早是用来控制图片,实现文字环绕图片的效果

脱离文档流,但不脱离文本流

代码举例:

下面这两个并列的div1div2,默认是在标准流中的:
在这里插入图片描述

在此基础之上,如果给div1增加float: left属性后,效果如下:

在这里插入图片描述
上图中,可以看到,div1设置为浮动后,会脱离文档流,不会对div2的布局造成影响;但是div1不会脱离文本流,它会影响div2中文字的排列。

其实,这正是 float 属性的作用。float 本身是用来做图文混排、文字环绕的效果。


3. 浮动布局的三个特性

首先在最上面直接说明 float 的特性

  1. 漂浮在普通流的上面。float 属性会让盒子漂浮在标准流的上面
  2. 浮动的盒子,把自己原来的位置漏给下面标准流的盒子,就是不占有原来位置
  3. 任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身是何种元素。 生成的块级框和我们前面的行内块极其相似。但是元素之间没有空白缝隙
  4. 浮动元素位置尽量靠上

先统一页面的布局

<body>
	<div class="one">one</div>
	<div class="two">two</div>
	<div class="three">three</div>
	<div class="four">four</div>
</body>

首先要知道,div 是块级元素,在页面中独占一行,自上而下排列
在这里插入图片描述

<style>
    div {
      width: 100px;
      height: 100px;
      text-align: center;
      line-height: 100px;
    }
    .one {
      background-color: gainsboro;
    }
    .two {
      background-color: aquamarine;
    }
    .three {
      background-color: cornflowerblue;
    }
    .four {
      background-color: gray;
    }
  </style>

此时的情况就是我们常说的标准流, 可以看出, 即使在宽度足够的情况下, 各个 div 块级元素独占一行

但是如果我们修改 css 样式, 使得 其中一个 div 发生左浮动

.two {
      background-color: aquamarine;
      float: left;
    }

在这里插入图片描述
我们再修改 css 样式, 使得其发生右浮动
在这里插入图片描述
在这里,我们就可以解释上面前两条特性了

添加了float属性的元素会漂浮在普通流的上面。float 属性会让盒子漂浮在标准流的上面

从第一次让 div 开始左浮动时, two 已经脱离了标准文档流, 它以经不占用空间了, three 会上去占用它失去的的空间,重新组成一个流

所有 two 就覆盖了 three

浮动的盒子,把自己原来的位置漏给下面标准流的盒子,就是不占有原来位置

接下来, 我们将前三个 div 使用 float 进行测试

.one {
      float: left;
      background-color: gainsboro;
    }
    .two {
      background-color: aquamarine;
      float: left;
    }
    .three {
      background-color: cornflowerblue;
      float: left;
    }
    .four {
      background-color: gray;
    }

结果正如前两条理论一样
在这里插入图片描述

假如某个div元素A是浮动的,如果A元素上一个元素也是浮动的,那么A元素会跟随在上一个元素的后边(如果一行放不下这两个元素,那么A元素会被挤到下一行);
如果A元素上一个元素是标准流中的元素,那么A的相对垂直位置不会改变,也就是说A的顶部总是和上一个元素的底部对齐。

4. 浮动的应用

浮动是脱标的,会影响下面的标准流元素

此时,我们需要给浮动的元素添加一个标准流的父亲,这样,最大化的减小了对其他标准流的影响。

因为父级盒子很多情况下,不方便给高度,但是子盒子浮动就不占有位置,最后父级盒子高度为0,就影响了下面的标准流盒子。(主要原因)

准确地说,并不是清除浮动,而是清除浮动后造成的影响

5. 清除浮动

清除浮动主要为了解决父级元素因为子级浮动引起内部高度为0 的问题。清除浮动之后, 父级就会根据浮动的子盒子自动检测高度。
父级有了高度,就不会影响下面的标准流了

语法:

选择器{clear: 属性值;}  

对于CSS的清除浮动(clear),一定要牢记:这个规则只能影响使用清除的元素本身,不能影响其他元素。

属性值描述
left不允许左侧有浮动元素(清除左侧浮动的影响)
right不允许右侧有浮动元素(清除右侧浮动的影响)
both同时清除左右两侧浮动的影响

1).额外标签法(隔墙法)

是W3C推荐的做法是通过在浮动元素末尾添加一个空的标签例如
 <div style=”clear:both”></div>
 或则其他标签br等亦可。
  • 优点: 通俗易懂,书写方便
  • 缺点: 添加许多无意义的标签,结构化较差。

2).父级添加overflow属性方法

可以给父级添加: 
overflow为 hidden| auto| scroll  
都可以实现。

优点: 代码简洁

缺点: 内容增多时候容易造成不会自动换行导致内容被隐藏掉,无法显示需要溢出的元素。

3).使用after伪元素清除浮动

:after 方式为空元素额外标签法的升级版,好处是不用单独加标签了

使用方法:

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

 .clearfix {*zoom: 1;}   /* IE6、7 专有 */
  • 优点: 符合闭合浮动思想 结构语义化正确
  • 缺点: 由于IE6-7不支持:after,使用 zoom:1触发 hasLayout。
  • 代表网站: 百度、淘宝网、网易等
4).使用双伪元素清除浮动

使用方法:

.clearfix:before,.clearfix:after { 
  content:"";
  display:table; 
}
.clearfix:after {
 clear:both;
}
.clearfix {
  *zoom:1;
}
  • 优点: 代码更简洁

  • 缺点: 由于IE6-7不支持:after,使用 zoom:1触发 hasLayout。

  • 代表网站: 小米、腾讯等

6. @拓展

做页面的主导航栏, 建议使用 ulli 里面嵌套 a标签, 让 a 标签变为块级元素,有利于 seo 优化, 不推荐直接使用大量的 a 标签

可通过京东官网验证

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐