1.浮动带来的影响
1.在文档流中内容的高度可以撑起父元素的高度
2.在浮动流中浮动的元素是不可以撑起文档流父元素的高度(如果父元素也是浮动的就可以)
<html lang="en"> <head> <meta charset="UTF-8"> <title>浮动元素高度问题</title> <style> *{ margin: 0; padding: 0; } div{ border: 1px solid #000; } p{ float: left; width: 50px; height: 50px; background-color: red; } </style> </head> <body> <div> <p>1111</p> </div> </body> </html>
可以看到将p元素设置浮动之后,并没有撑起父元素div
2.清除浮动
- 先看一看浮动带来的影响
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>清除浮动</title> <style> *{ margin: 0; padding: 0; } .box1{ background-color: red; } .box2{ background-color: green; } .box1 p{ width: 100px; background-color: blue; } .box2 p{ width: 100px; background-color: yellow; } p{ float: left; } </style> </head> <body> <div class="box1"> <p>我是文字1</p> <p>我是文字1</p> <p>我是文字1</p> </div> <div class="box2"> <p>我是文字2</p> <p>我是文字2</p> <p>我是文字2</p> </div> </body> </html>
根据浮动排列的规则和浮动不能撑起父元素的高度,得到下面的结果并不奇怪
针对上面那个例子,为了让文字1和文字2分两排显示,以下有几种清除浮动带来影响的方法
1.浮动清除一,给box1加一个高度
.box1{ height: 30px; background-color: red; }
给box1的设一个高度,浮动前,文字1是在文档流的第一行,所以文字1都是排列在第一行。此时box1有高度独占一行,所以box2就在文档流的第二行,文字2在浮动前也是在文档流的第二行,所以文字2最终浮动在第二行(这里的行是以父元素div来说的)
2.浮动清除二,给后面的div(box2)添加一个clear属性
clear属性取值: none: 默认取值, 按照浮动元素的排序规则来排序(左浮动找左浮动, 右浮动找右浮动) left: 不要找前面的左浮动元素 right: 不要找前面的右浮动元素 both: 不要找前面的左浮动元素和右浮动元素
注意点: 当我们给某个元素添加clear属性之后, 那么这个元素垂直方向上的margin属性就会失效
.box2{ background-color: green; clear: both; margin-top: 28px; }
结果如下
3.浮动清除三,隔墙法
3.1外墙法
具体操作:
在两个盒子中间添加一个额外的块级元素并给这个额外添加的块级元素设置clear: both属性
注意点:
外墙法它可以让第二个盒子使用margin-top属性
外墙法不可以让第一个盒子使用margin-bottom属性
在box1和box2中间加一个wall
.wall{ clear: both; }
<div class="box1"> <p>我是文字1</p> <p>我是文字1</p> <p>我是文字1</p> </div> <div class="wall"></div> <div class="box2"> <p>我是文字2</p> <p>我是文字2</p> <p>我是文字2</p> </div>
3.2内墙法
具体操作:
在第一个盒子中所有子元素最后添加一个额外的块级元素并给这个额外添加的块级元素设置clear: both属性 注意点: 内墙法它可以让第二个盒子使用margin-top属性 内墙法它可以让第一个盒子使用margin-bottom属性 在box1中的最后加一个wall .wall{ clear: both; } <div class="box1"> <p>我是文字1</p> <p>我是文字1</p> <p>我是文字1</p> <div class="wall"></div> </div> <div class="box2"> <p>我是文字2</p> <p>我是文字2</p> <p>我是文字2</p> </div>
在实际开发中,前端更推崇结构和样式分离,所以不常用隔墙法。
4.浮动清除四,伪元素清除法
利用伪元素选择器清除浮动 本质上就是内墙法, 只不过是直接通过CSS代码添加了内墙, 其它特性和内墙法都一样 注意点: IE6中不支持这种方式, 为了兼容IE6必须给前面的盒子添加*zoom:1属性 .box1::after{ /*设置添加的子元素的内容为空*/ content: ""; /*设置添加的子元素为块级元素*/ display: block; /*设置添加的子元素的高度为0*/ height: 0; /*设置添加的子元素看不见*/ visibility: hidden; /*给添加的子元素设置clear: both;*/ clear: both; } .box1{ /*兼容IE6*/ *zoom:1; }
此类方法通过css代码来修改样式,而不是通过html来修改,更符合规范
5.浮动清除五,设置box1的overflow属性为hidden或者auto
给box1中加overflow: auto;或hidden,加*zoom:1;同样是因为要兼容IE6
.box1{ background-color: red; overflow: auto; /*overflow: hidden;*/ *zoom:1; }