**
css清除浮动方法学习笔记总结(超详细,简单易懂)
**
问题:
上图中,由于container(父级元素)未设置高度,其内部子元素设置了float浮动,导致与container同级(也就是container下面的元素)位置发生错乱,出现在了container父元素的设置了浮动的子元素背面。
原因:
父级元素的高度为0,设置了浮动的子元素,不会像未设置浮动的子元素那样会自动撑开父元素
1.为什么需要浮动?
布局的需要:让多个盒子(div)水平排列成一行;实现盒子的左右对齐
虽然我们行内块元素(inline-block)可以帮助我们实现多个元素一行显示,但是他却有自己的缺陷:
1). 它可以实现多个元素一行显示,但是中间会有空白缝隙
2). 它不能实现盒子左右对齐
2.什么是浮动(float)?
漂浮在普通流的上面。 脱离标准流。 俗称 “脱标”
1)概念:元素的浮动是指设置了浮动属性的元素会
- 脱离标准普通流的控制
- 移动到指定位置。
2)作用:
- 让多个盒子(div)水平排列成一行,使得浮动成为布局的重要手段。
- 可以实现盒子的左右对齐
- 浮动最早是用来控制图片,实现文字环绕图片的效果。
3)语法:
在 CSS 中,通过 float
中文,属性定义浮动,语法如下:
选择器 { float: 属性值; }
属性值 | 描述 |
---|---|
none | 元素不浮动(默认值) |
left | 元素向左浮动 |
right | 元素向右浮动 |
一、父级元素设置了高度的情况下:
在给父级元素设置了高度,子元素设置了float浮动的情况下,不需要清除浮动。因为,父级元素有高度,所有浮动的子元素只是在父级元素内部进行了浮动,这并不会对父级后面的其他元素在文档流中的位置产生影响。
二、父级元素没有设置高度的情况下:
有些实际情况中,可能不能够给父级元素设置高度,但是子盒子浮动就不占有位置,最后父级盒子高度为0,就影响了下面的标准流盒子。但我们实际想要达到一种子元素有多高,父级元素就自动有多高,也就是父元素被子元素所撑开的效果。
在这种不设置高度的情况下,就必须清除浮动!
下面介绍四种不设置父级高度情况下的清除浮动的方法:
1)在CSS中,clear属性用于清除浮动
- 语法:
选择器{clear:属性值;} clear 清除浮动
属性值 | 描述 |
---|---|
left | 不允许左侧有浮动元素(清除左侧浮动的影响) |
right | 不允许右侧有浮动元素(清除右侧浮动的影响) |
both | 同时清除左右两侧浮动的影响 |
但是我们实际工作中, 几乎只用 clear: both;
1).额外标签法(隔墙法)
是W3C推荐的做法是通过在浮动元素末尾添加一个空的标签
例如
<div style=”clear:both”></div>
,或则其他标签br等亦可。
注意:这个浮动元素末尾新增的必须是块元素,不能是行内元素,否则清除浮动失效!
- 优点: 通俗易懂,书写方便
- 缺点: 添加许多无意义的标签,结构化较差。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>清除浮动的方法总结</title>
<style type="text/css">
.container {
width: 400px;
/* 父元素container不设置高度的情况下,子元素设置float浮动,会出现父元素container的高度为0的情况 */
background-color: #00BFFF;
margin: 0 auto;
}
.box1 {
float: left;
width: 100px;
height: 100px;
background-color: #98FB98;
}
.box2 {
float: left;
width: 200px;
height: 200px;
background-color: bisque;
}
.footer {
height: 300px;
background-color: lightcoral;
text-align: end;
}
.clear {
clear: both; /* 清除浮动 */
}
</style>
</head>
<body>
<div class="container">
<div class="box1">浮动的box1</div>
<div class="box2">浮动的box2</div>
<div class="clear"></div>
</div>
<div class="footer">container下面的footer</div>
</body>
</html>
2).父级添加overflow属性方法
可以给父级添加:
overflow为 hidden| auto| scroll
都可以实现。
- 优点: 代码简洁
- 缺点: 内容增多时候容易造成不会自动换行导致内容被隐藏掉,无法显示需要溢出的元素。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>清除浮动的方法总结</title>
<style type="text/css">
.container {
width: 400px;
/* 父元素container不设置高度的情况下,子元素设置float浮动,会出现父元素container的高度为0的情况 */
background-color: #00BFFF;
margin: 0 auto;
overflow: hidden;/* 给设置了浮动的子元素的父元素添加overflow:hidden 来清除浮动 */
}
.box1 {
float: left;
width: 100px;
height: 100px;
background-color: #98FB98;
}
.box2 {
float: left;
width: 200px;
height: 200px;
background-color: bisque;
}
.footer {
height: 300px;
background-color: lightcoral;
text-align: end;
}
/* .clear {
clear: both;
} */
</style>
</head>
<body>
<div class="container">
<div class="box1">浮动的box1</div>
<div class="box2">浮动的box2</div>
<!-- <div class="clear"></div> -->
</div>
<div class="footer">container下面的footer</div>
</body>
</html>
3).使用after伪元素清除浮动
注意:这也是设置在父元素上面
:after 方式为空元素额外标签法的升级版,好处是不用单独加标签了
使用方法:
.clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix {
*zoom: 1;
} /* IE6、7 专有 */
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>清除浮动的方法总结</title>
<style type="text/css">
.container {
width: 400px;
/* 父元素container不设置高度的情况下,子元素设置float浮动,会出现父元素container的高度为0的情况 */
background-color: #00BFFF;
margin: 0 auto;
/* overflow: hidden; */
/* 给设置了浮动的子元素的父元素添加overflow:hidden 来清除浮动*/
}
.box1 {
float: left;
width: 100px;
height: 100px;
background-color: #98FB98;
}
.box2 {
float: left;
width: 200px;
height: 200px;
background-color: bisque;
}
.footer {
height: 300px;
background-color: lightcoral;
text-align: end;
}
.clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix {
*zoom: 1;
}
/* IE6、7 专有 */
/* .clear {
clear: both;
} */
</style>
</head>
<body>
<div class="container clearfix">
<div class="box1">浮动的box1</div>
<div class="box2">浮动的box2</div>
<!-- <div class="clear"></div> -->
</div>
<div class="footer">container下面的footer</div>
</body>
</html>
- 优点: 符合闭合浮动思想 结构语义化正确
- 缺点: 由于IE6-7不支持:after,使用 zoom:1触发 hasLayout。
- 代表网站: 百度、淘宝网、网易等
4).使用双伪元素清除浮动
注意:这也是设置在父元素上面
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>清除浮动的方法总结</title>
<style type="text/css">
.container {
width: 400px;
/* 父元素container不设置高度的情况下,子元素设置float浮动,会出现父元素container的高度为0的情况 */
background-color: #00BFFF;
margin: 0 auto;
/* overflow: hidden; */
/* 给设置了浮动的子元素的父元素添加overflow:hidden 来清除浮动*/
}
.box1 {
float: left;
width: 100px;
height: 100px;
background-color: #98FB98;
}
.box2 {
float: left;
width: 200px;
height: 200px;
background-color: bisque;
}
.footer {
height: 300px;
background-color: lightcoral;
text-align: end;
}
/* .clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
} */
.clearfix:before,
.clearfix:after {
content: "";
display: table;
}
.clearfix:after {
clear: both;
}
.clearfix {
*zoom: 1;
}
/* IE6、7 专有 */
/* .clear {
clear: both;
} */
</style>
</head>
<body>
<div class="container clearfix">
<div class="box1">浮动的box1</div>
<div class="box2">浮动的box2</div>
<!-- <div class="clear"></div> -->
</div>
<div class="footer">container下面的footer</div>
</body>
</html>
使用方法:
.clearfix:before,.clearfix:after {
content:"";
display:table;
}
.clearfix:after {
clear:both;
}
.clearfix {
*zoom:1;
}
- 优点: 代码更简洁
- 缺点: 由于IE6-7不支持:after,使用 zoom:1触发 hasLayout。
- 代表网站: 小米、腾讯等
清除浮动总结
一、什么时候用清除浮动呢?
- 父级没高度
- 子盒子浮动了
- 影响下面布局了,我们就应该清除浮动了。
清除浮动的方式 | 优点 | 缺点 |
---|---|---|
额外标签法(隔墙法) | 通俗易懂,书写方便 | 添加许多无意义的标签,结构化较差。 |
父级overflow:hidden; | 书写简单 | 溢出隐藏 |
父级after伪元素 | 结构语义化正确 | 由于IE6-7不支持:after,兼容性问题 |
父级双伪元素 | 结构语义化正确 | 由于IE6-7不支持:after,兼容性问题 |
二、清除浮动的本质:
清除浮动主要为了解决父级元素因为子级浮动引起内部高度为0 的问题。清除浮动之后, 父级就会根据浮动的子盒子自动检测高度。父级有了高度,就不会影响下面的标准流了。
由于浮动元素不再占用原文档流的位置,所以它会对后面的元素排版产生影响。准确地说,并不是清除浮动,而是清除浮动后造成的影响。
三、清除浮动的策略:
闭合浮动.只让浮动在父盒子内部影响,不影响父盒子外面的其他盒子。