环境
- 操作系统:Ubuntu 20.04
- 开发工具:VSCode 1.67.2
- 浏览器:Firefox 100.0.2
背景
CSS常见有三种布局方式:
- 标准流
- 浮动
- 定位
本文主要介绍浮动。
先来简单看一下标准流。标准流是基本的布局方式,说白了就是标签按照其默认方式排列。
- 块元素:独占一行
- 行内元素和行内块元素:一行可以有多个
要想打破默认的布局方式,一种办法是 display: block | inline | inline-block
,但是用浮动更加灵活方便。
浮动关键字: float: none | left | right
例1:左浮动
div {
float: left;
width: 200px;
height: 200px;
background-color: blue;
}
........
<div>1</div>
<div>2</div>
<div>3</div>
效果如下:
div
是块级元素,默认会独占一行,现在加了浮动,三个 div
就处于同一行了(并排靠左)。
注意,这三个盒子之间没有空隙,如果不用浮动而用 display: inline-block
,则也能使得这三个盒子处于同一行,但是盒子之间会有空隙。
注意,如果把浏览器宽度缩小,以至于三个盒子在一行排不开,则会自动转行。
例2:左右浮动
.left,
.right {
float: left;
width: 200px;
height: 200px;
background-color: blue;
}
.right {
float: right;
}
........
<div class="left">Left</div>
<div class="right">Right</div>
效果如下:
例3:浮动的盒子不再保留原位置
.box1 {
float: left;
width: 100px;
height: 100px;
background-color: blue;
}
.box2 {
width: 150px;
height: 150px;
background-color: black;
}
........
<div class="box1"></div>
<div class="box2"></div>
效果如下:
可见,box1因为浮动,不再保留原位置,所以box2处于原先box1的位置。
注意,box1是浮动的,所以处于上层,也就是说,浮动盒子会覆盖标准流盒子。
例4:浮动盒子具有行内块元素的特点
浮动的盒子具有行内块元素的特点:比如一行内可以有多个元素,可以设置宽高,默认宽度为内容所占宽度,等等。
span {
float: left;
width: 200px;
height: 200px;
background-color: blue;
}
div {
float: right;
height: 100px;
background-color: blue;
}
........
<span>span1</span>
<span>span2</span>
<div>div1</div>
效果如下:
span
本来是行内元素,因为浮动,就可以设置宽高。div
本来是块元素,不设置宽度的话,默认为其父元素的宽度,因为浮动,变成了默认为其内容所占的宽度了。
例5:浮动盒子只影响其后面的标准流
div {
width: 200px;
height: 100px;
background-color: blue;
}
.flt {
float: left;
width: 150px;
height: 80px;
background-color: green;
}
........
<div>div1</div>
<div class="flt">div2</div>
<div>div3</div>
<div class="flt">div4</div>
效果如下:
本例中, dev2
和 dev4
是浮动盒子。
- 因为
dev1
是标准盒子,所以dev2
会在它下面。 - 因为
dev2
浮动,所以dev3
也挨着dev1
的下面。 - 因为
dev3
是标准盒子,所以dev4
会在它下面。
本例中,浮动盒子的高度小于标准盒子高度,如果把浮动盒子的高度增大为 120px
,效果如下:
注意本例中的 div4
,它既受 div2
影响,也受 div3
影响。上例中因为 div2
高度小于 div3
,所以 div4
不受 div2
影响。
注:可以打开浏览器的 Web Developer Tools
,选中 div2
或者 div4
,然后直接修改其css的值:
清除浮动
浮动元素经常和标准流的父元素搭配。先用父元素确定位置和宽度,然后在里面采用浮动来排列子元素。现在问题来了,子元素的数量和高度可能会变化,那么该如何确定父元素的高度呢?
如果给父元素的高度设置一个定值,肯定不太好。但如果不设置高度,那也不行(默认是0)。这种情况下,解决办法是根据浮动的子元素自动确定父元素的高度,也就是清除浮动。
清除浮动有以下几种方法:
overflow
属性after
伪元素- 双伪元素
- 额外标签法
注:额外标签法是W3C推荐做法,但是因为要改变结构(平白添加网页标签),所以不太常用。
添加 overflow
属性
关键字: overflow: hidden | auto | scroll
.box {
overflow: hidden;
width: 800px;
border: 1px solid blue;
margin: 0 auto;
}
.child {
float: left;
width: 200px;
height: 100px;
background-color: blue;
}
........
<div class="box">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
<div class="child">4</div>
<div class="child">5</div>
</div>
<p></p>
<div>end</div>
效果如下:
注意: overflow
属性设置要加在父盒子上,其值可设置为 hidden
、 auto
或 scroll
。
添加 :after
伪元素
关键字:
.clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix {
/* for IE6 & 7 */
*zoom: 1;
}
将其添加在父盒子上即可。
.box {
width: 800px;
border: 1px solid blue;
margin: 0 auto;
}
.child {
float: left;
width: 200px;
height: 100px;
background-color: blue;
}
.clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix {
/* for IE6 & 7 */
*zoom: 1;
}
........
<div class="box clearfix">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
<div class="child">4</div>
<div class="child">5</div>
</div>
<p></p>
<div>end</div>
效果如下:
注意 <div class="box clearfix">
的写法。
添加双伪元素
关键字:
.clearfix:before,
.clearfix:after {
content: "";
display: table;
}
.clearfix:after {
clear: both;
}
.clearfix {
*zoom: 1;
}
将其添加在父盒子上即可。
.box {
width: 800px;
border: 1px solid blue;
margin: 0 auto;
}
.child {
float: left;
width: 200px;
height: 100px;
background-color: blue;
}
.clearfix:before,
.clearfix:after {
content: "";
display: table;
}
.clearfix:after {
clear: both;
}
.clearfix {
*zoom: 1;
}
........
<div class="box clearfix">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
<div class="child">4</div>
<div class="child">5</div>
</div>
<p></p>
<div>end</div>
效果如下:
注意 <div class="box clearfix">
的写法。
额外标签法
关键字: clear: both | left | right
(一般只用 both
)
.box {
width: 800px;
border: 1px solid blue;
margin: 0 auto;
}
.child {
float: left;
width: 200px;
height: 100px;
background-color: blue;
}
.clear {
clear: both;
}
........
<div class="box">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
<div class="child">4</div>
<div class="child">5</div>
<div class="clear"></div>
</div>
<p></p>
<div>end</div>
效果如下:
<div class="clear"></div>
是额外添加的空标签,纯粹是为了清除浮动。
注意:该标签必须是块元素。