CSS 浮动
请看下图,当把框 1 向右浮动时,它脱离文档流并且向右移动,直到它的右边缘碰到包含框的右边缘:

再请看下图,当框 1 向左浮动时,它脱离文档流并且向左移动,直到它的左边缘碰到包含框的左边缘。因为它不再处于文档流中,所以它不占据空间,实际上覆盖住了框 2,使框 2 从视图中消失。
如果把所有三个框都向左移动,那么框 1 向左浮动直到碰到包含框,另外两个框向左浮动直到碰到前一个浮动框。

如下图所示,如果包含框太窄,无法容纳水平排列的三个浮动元素,那么其它浮动块向下移动,直到有足够的空间。如果浮动元素的高度不同,那么当它们向下移动时可能被其它浮动元素“卡住”:

行框和清理
浮动框旁边的行框被缩短,从而给浮动框留出空间,行框围绕浮动框。
因此,创建浮动框可以使文本围绕图像:

要想阻止行框围绕浮动框,需要对该框应用 clear 属性。clear 属性的值可以是 left、right、both 或 none,它表示框的哪些边不应该挨着浮动框。
为了实现这种效果,在被清理的元素的上外边距上添加足够的空间,使元素的顶边缘垂直下降到浮动框下面:

这是一个有用的工具,它让周围的元素为浮动元素留出空间。
让我们更详细地看看浮动和清理。假设希望让一个图片浮动到文本块的左边,并且希望这幅图片和文本包含在另一个具有背景颜色和边框的元素中。您可能编写下面的代码:
.news {
& x% x9 r$ |5 ^7 u/ F* @ background-color: gray;
( X+ d! M$ Z8 h$ G" b* p$ s8 [! F- f border: solid 1px black;5 v4 F6 h$ u; [) K( l; X
}
+ L# v1 }- p6 D2 g, ]. ]* G1 b
8 M2 {4 b7 H8 s( V.news img {& N M. f" f9 m" B) ?4 s, A
float: left;8 }4 |( K" H, X3 J8 k
}9 i. x6 U& V+ @& j- k# j
6 ~* Y( F6 D3 k' W2 z
.news p {5 k3 r6 `8 Z( C; }+ N
float: right;3 {7 ]( _0 n& [' C1 q9 x/ \# ^
}
; p2 S& W/ E' W! Z/ g6 t& L- V. c
0 H; M! x; u8 x/ Z<div class="news">
: p3 G5 I. o7 q! @; V0 V6 j<img src="news-pic.jpg" />
" E: D1 x# c* r; Q0 j<p>some text</p>3 R0 n+ Q" e N9 e5 H* W
</div>
6 E3 K% E Z- y4 J) B4 f这种情况下,出现了一个问题。因为浮动元素脱离了文档流,所以包围图片和文本的 div 不占据空间。
如何让包围元素在视觉上包围浮动元素呢?需要在这个元素中的某个地方应用 clear:

不幸的是出现了一个新的问题,由于没有现有的元素可以应用清理,所以我们只能添加一个空元素并且清理它。
.news {5 I- a6 }% f- A: P
background-color: gray;2 l0 m$ _! [, n3 N P
border: solid 1px black;
* Z+ J" N! e7 ]" f# A }
) U$ `! | N9 C1 G
; R1 y/ n8 i' P6 V: E% q.news img {0 C5 o5 b9 r! o: u9 }3 C9 {6 h3 V$ |
float: left;
, K$ N3 T9 C" u t+ D }; L5 J9 g0 O9 g% r0 L; t
8 O; W) A! X& S7 ^( K( A! C e5 F
.news p {9 ~* w$ t4 n; G2 H! h2 |# w
float: right;
0 q( ~# I2 j) } }& K/ S2 m: q4 [9 |' W A" i
6 R- r! m; k5 Q/ C0 I( Y7 A3 _
.clear {
5 K( |6 K& k: z' P( a; y clear: both;- A: n h3 k7 v" @" m( I
}
8 |7 C, y0 M2 M r/ |
1 b# E9 B0 O* [$ Y<div class="news">1 f, G |4 Y0 d: x
<img src="news-pic.jpg" />
2 \( j( G3 E; M! X) x<p>some text</p>
. c$ ^% D1 Q7 }<div class="clear"></div>. K* g* K& h; I, b: X
</div>
W" l" G2 P" { Q ?' O这样可以实现我们希望的效果,但是需要添加多余的代码。常常有元素可以应用 clear,但是有时候不得不为了进行布局而添加无意义的标记。
不过我们还有另一种办法,那就是对容器 div 进行浮动:
.news {: M. T. i l. M9 d
background-color: gray;
+ H, [/ T8 ?' T4 u1 n border: solid 1px black;
7 V5 M1 l [, b/ [ float: left;2 b. t# ? x6 q# S8 @
}
! ~- R! A. K/ B* }- L7 Y" l8 R1 M
.news img {
( F% p: C/ g; b$ A! I) j$ v float: left;
+ `2 [; b& V' _, g( M9 b$ P4 g }
2 C& D9 F4 ~! U8 O8 _( j r( ]# ^6 h$ y: e* _) Z
.news p {
! s- V B, L6 D& ]" M2 Z; U' y float: right;
9 L( ?! }( i2 C# P }& s; y) A& c1 |+ r1 h j
5 K$ Y# E) z0 u P5 L<div class="news">
% Y+ |9 f$ U1 w) |% z3 A<img src="news-pic.jpg" />
" e, t- q1 ~% l0 i: R<p>some text</p>! [2 ?# r% C! S2 T" B
</div>
2 P7 Q5 I+ o' W. z2 K这样会得到我们希望的效果。不幸的是,下一个元素会受到这个浮动元素的影响。为了解决这个问题,有些人选择对布局中的所有东西进行浮动,然后使用适当的有意义的元素(常常是站点的页脚)对这些浮动进行清理。这有助于减少或消除不必要的标记。
事实上,W3School 站点上的所有页面都采用了这种技术,如果您打开我们使用 CSS 文件,您会看到我们对页脚的 div 进行了清理,而页脚上面的三个 div 都向左浮动。