# 浮动

# 文档流(normal flow)布局

网页是一个多层的结构,一层叠着一层,通过CSS可以分别为每一层设置样式,作为用户来讲只能看到最顶上一层; 这些层中,最底下的一层称为文档流,文档流是网页的基础,我们创建的元素默认都是在文档流中进行排列; 对我们元素来说主要有两个状​

  • 在文档流中​
  • 脱离文档流

元素在文档流中有什么特点

块元素

  • 块元素在页面中独占一行,从上往下垂直排列

  • 默认宽度是父元素的100%

  • 默认高度是被内容撑开

行内元素

  • 行内元素不独占一行,在页面中自左向右水平排列,如果一行排列不下,则元素会换到第二行继续自左向右排列(水平)

  • 默认宽高由内容撑开

# 浮动:

是为了图片被文字环绕而出现的特性,通过浮动可以设置一个元素向其父元素的左侧和右侧移动。

可选值:

none默认值 , 元素不浮动

left 元素向左浮动

right 元素向右浮动

实际上游览器中的元素是三维的.,有不同的层级;

页面中的元素有高低顺序,渲染的过程,会将页面的元素分类,按照从高到底的顺序渲染,

层级:行内元素/行内块元素 = 浮动元素 > 块级元素

文本元素和浮动元素天然排斥,不会重合到一起

设置display: float后不用再设置 block 了,浮动后的元素就拥有块元素的属性了(除了不会占据一整行并且不具有父级元素的宽度)。

浮动元素的特性

  1. 文本环绕
  2. 有多个浮动元素的情况.多个盒子浮动,会从左往右依次排列,如果当前行排不下,会"换行排列";

# 清除浮动

容器的内容浮动,子元素浮动导致子元素和父元素不在同一层级,导致父元素的高度无法被支撑起,使得内容溢出到容器外面而影响(甚至破坏)布局的现象。这个现象叫浮动溢出或者父元素的高度塌陷,为了防止这个现象的出现而进行的CSS处理,就叫CSS清除浮动。

# 清除浮动方法

方法一:使用带clear属性的空元素

在浮动元素后使用一个空元素如<div class="clear"></div>,并在CSS中赋予.clear{clear:both;}属性即可清理浮动。亦可使用<br class="clear" />或<hr class="clear" />来进行清理。

<div class="news">
<img src="news-pic.jpg" />
<p>some text</p>
<div class="clear"></div>
</div>
1
2
3
4
5
.news {
  background-color: gray;
  border: solid 1px black;
}

.news img {
  float: left;
}

.news p {
  float: right;
}

.clear {
  clear: both;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

优点:简单,代码少,浏览器兼容性好。 缺点:需要添加大量无语义的html元素,代码不够优雅,后期不容易维护。

方法二:使用CSS的overflow属性

给浮动元素的容器添加overflow:hidden;overflow:auto;可以清除浮动,在添加overflow属性后,浮动元素又回到了容器层,把容器高度撑起,达到了清理浮动的效果。

<div class="news">
<img src="news-pic.jpg" />
<p>some text</p>
</div>
1
2
3
4
.news {
  background-color: gray;
  border: solid 1px black;
  overflow: hidden;
  *zoom: 1;
}

.news img {
  float: left;
}

.news p {
  float: right;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

方法三:给浮动的元素的容器添加浮动

给浮动元素的容器也添加上浮动属性即可清除内部浮动,但是这样会使其整体浮动,影响布局,不推荐使用。

方法四:使用邻接元素处理

什么都不做,给浮动元素后面的元素添加clear属性。

<div class="news">
<img src="news-pic.jpg" />
<p>some text</p>
<div class="content">***</div>
</div>
1
2
3
4
5
.news {
  background-color: gray;
  border: solid 1px black;
}

.news img {
  float: left;
}

.news p {
  float: right;
}

.content{
  clear:both;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

方法五:使用CSS的:after伪元素

结合 :after 伪元素,兼容性良好,并且不会为文档带来无意义的元素节点。 给浮动元素的容器添加一个 clearfix 的class,然后给这个class添加一个:after伪元素实现元素末尾添加一个看不见的块元素(Block element)清理浮动。

<div class="news clearfix">
<img src="news-pic.jpg" />
<p>some text</p>
</div>
1
2
3
4
.news {
  background-color: gray;
  border: solid 1px black;
}

.news img {
  float: left;
}

.news p {
  float: right;
}

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

.clearfix {
  /* 触发 hasLayout */ 
  zoom: 1; 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

通过 CSS 伪元素在容器的内部元素最后添加了一个看不见的空格"020"或点".",并且赋予clear属性来清除浮动。需要注意的是为了 IE6 和 IE7 浏览器,要给 clearfix 这个class添加一条 zoom: 1; 触发 haslayout

# 总结

  1. 是利用 clear 属性,包括在浮动元素末尾添加一个带有 clear: both(clear: left和clear: right的合并,清除左侧/右侧元素浮动的影响);
  2. 触发浮动元素父元素的 BFC (Block Formatting Contexts, 块级格式化上下文),使父元素与子元素在同一层级,再次包裹浮动元素;
  3. 如果本身就是浮动元素则可自动清除内部浮动,无需格外处理。
Last Updated: 9/22/2022, 2:18:13 PM
Bathroom Mirror / You're Coming Right?
Justin Hurwitz