浮动的本质是为了实现文字环绕效果。
float 布局有时也能满足我们的需求,但是实际上这种布局i一碰就碎。缺少弹性,布局的容错率很糟糕。float 特性:
-
包裹性
- 包裹 : 假设浮动元素父元素宽度为200px,浮动元素子元素是一个128px宽度的图片, 则此时浮动元素宽度表现为“包裹”,也就是里面图片的宽度128px。
- 自适应性。如果浮动元素的子元素不只是一张 128px 宽度的图片,还有一大波普通的文字,则此时浮动元素宽度就自适应父元素的200px宽度,最终表现也为200px。
-
块状化并格式化上下文:
- 元素一旦float 的属性不是none,则其diaplay计算值就是block,或者table.
span{ diaplay: block; /* 多余*/ float:left; } span{ float: left; vertival-align: middle; /* 多余 */ }
-
破坏文档流
- float 属性有一个著名的特性表现,就是会让父元素的高度塌陷(如果父元素没有指明高度的话)。这是css的设计者设定的标准,以使得 float 一开始“只是为了实现文字环绕效果”的目标实现,也即 “破坏文档流”。当然,只是让高度塌陷还不够,这还需要另一个特性,那就是“行框盒子和浮动元素的不可重叠性”,也就是“行框盒子如果和浮动元素的垂直高度有重叠,则行框盒子在正常定位状态下只会跟随浮动元素,而不会发生重叠”。
- 没有任何margin合并
clear "己所不欲勿施于人"
官方解释 : “元素盒子的边不能和前面的浮动元素相邻”,就是设置了 clear 属性的元素自身如何如何。而不是让float元素如何如何。
clear属性只有块级元素才有效,通常可以利用伪元素来完成清除浮动 :
.clear:after{
content: '';
diaplay: table; /*也可以是'block',或者'list-item'*/
clear: both;
}
clear: both
的作用本质是让自己不和float 元素在一行显示,并不是真正意义上的清除浮动,因此 float 元素一些不好的特性依然存在。
- 如果
clear: both
元素前面元素就是 float 元素,则margin-top
负值即使设成 -9999px ,也不见任何效果。 clear: both
后面的元素依旧可能会发生文字环绕的现象。