# 浮动
# 文档流(normal flow)布局
网页是一个多层的结构,一层叠着一层,通过CSS可以分别为每一层设置样式,作为用户来讲只能看到最顶上一层; 这些层中,最底下的一层称为文档流,文档流是网页的基础,我们创建的元素默认都是在文档流中进行排列; 对我们元素来说主要有两个状
- 在文档流中
- 脱离文档流
元素在文档流中有什么特点
块元素
块元素在页面中独占一行,从上往下垂直排列
默认宽度是父元素的100%
默认高度是被内容撑开
行内元素
行内元素不独占一行,在页面中自左向右水平排列,如果一行排列不下,则元素会换到第二行继续自左向右排列(水平)
默认宽高由内容撑开
# 浮动:
是为了图片被文字环绕而出现的特性,通过浮动可以设置一个元素向其父元素的左侧和右侧移动。
可选值:
none默认值 , 元素不浮动
left 元素向左浮动
right 元素向右浮动
实际上游览器中的元素是三维的.,有不同的层级;
页面中的元素有高低顺序,渲染的过程,会将页面的元素分类,按照从高到底的顺序渲染,
层级:行内元素/行内块元素 = 浮动元素 > 块级元素
文本元素和浮动元素天然排斥,不会重合到一起
设置display: float
后不用再设置 block 了,浮动后的元素就拥有块元素的属性了(除了不会占据一整行并且不具有父级元素的宽度)。
浮动元素的特性
- 文本环绕
- 有多个浮动元素的情况.多个盒子浮动,会从左往右依次排列,如果当前行排不下,会"换行排列";
# 清除浮动
容器的内容浮动,子元素浮动导致子元素和父元素不在同一层级,导致父元素的高度无法被支撑起,使得内容溢出到容器外面而影响(甚至破坏)布局的现象。这个现象叫浮动溢出或者父元素的高度塌陷,为了防止这个现象的出现而进行的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>
2
3
4
5
.news {
background-color: gray;
border: solid 1px black;
}
.news img {
float: left;
}
.news p {
float: right;
}
.clear {
clear: both;
}
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>
2
3
4
.news {
background-color: gray;
border: solid 1px black;
overflow: hidden;
*zoom: 1;
}
.news img {
float: left;
}
.news p {
float: right;
}
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>
2
3
4
5
.news {
background-color: gray;
border: solid 1px black;
}
.news img {
float: left;
}
.news p {
float: right;
}
.content{
clear:both;
}
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>
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;
}
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
。
# 总结
- 是利用 clear 属性,包括在浮动元素末尾添加一个带有 clear: both(clear: left和clear: right的合并,清除左侧/右侧元素浮动的影响);
- 触发浮动元素父元素的 BFC (Block Formatting Contexts, 块级格式化上下文),使父元素与子元素在同一层级,再次包裹浮动元素;
- 如果本身就是浮动元素则可自动清除内部浮动,无需格外处理。