float深入分析

目录
  1. 导读
  2. float对布局的影响
    1. 对行框的影响
    2. 对父元素的影响
    3. 对兄弟元素的影响
    4. 对兄弟元素(浮动)的影响
    5. 对自身元素的影响
    6. 对子元素的影响
    7. 对父元素非浮动兄弟元素的影响
    8. 对父元素浮动兄弟元素的影响
  3. 清除浮动的2种方法
    1. overflow
    2. after伪类

导读

float即浮动, 使用float, 该浮动元素便会脱离正常的文档流, 使其浮动到父元素的行的一端(元素向左或向右移动, 直到碰到浮动元素, 或者达到父元素内容的边界, 不包括padding), 并且其他元素将忽略该浮动元素并填补其原先的空间.

这里需要捋清一个概念, 所谓文档流是什么?

文档流: 元素按照自上到下, 自左到右的顺序依次排放, 即文档流.

float特别适合这种图文混排, 文字环绕图片的效果, 布局上灵活多变. 但不太适合动画, 因其可能造成reflow性能问题, 此时宜用绝对定位(position:absolute)或者固定定位(position:fixed).

float对布局的影响

对行框的影响

浮动元素旁边的行框被缩短, 从而给浮动框留出空间, 行框围绕浮动框.

因此, 创建浮动框可以使文本围绕图像, 如下:

float01.gif

float02.gif

对父元素的影响

元素浮动后, 会脱离正常文档流, 原文档中, 该浮动元素似乎消失了, 因此它不能撑开父元素, 容易造成父元素的塌陷.

对兄弟元素的影响

若兄弟元素是 块级元素.

现代浏览器及IE8+下, 该兄弟元素会忽视浮动元素而占据它的位置, 并且该兄弟元素会处于浮动元素的下层(并且无法通过z-index属性改变他们的层叠关系), 然而它的内容文字和其他行内元将会环绕浮动元素.

对此, IE6,7分别有不同的表现. IE6,7中, 该兄弟元素会紧跟在浮动元素的右侧, 并且IE6中会保留3px的空隙; IE7中则没有空隙.

若兄弟元素是 内联元素

则内联元素将环绕浮动元素排列.

对兄弟元素(浮动)的影响

若兄弟元素是 同一方向浮动.

则兄弟元素相对该浮动元素按照从左到右(float:left)或者从右到左(float:right)的顺序依次排列.

若兄弟元素是 反方向浮动.

则兄弟元素和浮动元素将组成两个向左或向右的浮动队列, 分别相对浮动方向同时向行中间浮动. 他们尽可能处于同一行, 如果行的宽度不足以容纳这两个队列, 两个队列将错开成两行, DOM结构中处于之前的浮动队列将优先排在上面一行, 另一个浮动队列将排在下一行或者部分排在下一行.

对自身元素的影响

浮动元素默认被视作块级对象(block-level).

对子元素的影响

浮动元素, 其高度或宽度取浮动子元素和非浮动子元素高度或宽度的最大值.

对父元素非浮动兄弟元素的影响

父元素之外的非浮动元素将会无视该浮动元素, 他们只会相对父元素按照正常文档流去排列.

对父元素浮动兄弟元素的影响

父元素之外的浮动兄弟元素, 会本能的找到该浮动元素, 现象参照 “对兄弟元素(浮动)的影响”.

清除浮动的2种方法

如上, float会带来父元素的塌陷, 下面提供两种解决方案, 以弥补float的缺陷.

如下DOM, 由于子元素设置为float:left, 此时父元素并不会被撑大, 高度为0, 背景将无法展示.

<style>
    .outer{
        background:#ccc;
    }
    .inner{
        float:left;
        width:150px;
        height:100px;
        margin:10px;
        border:1px solid red;
    }
</style>
<div class="outer">
    <div class="inner"></div>
    <div class="inner"></div>
    <div class="inner"></div>
</div>

IE6~7下可通过设置父元素的样式为zoom:1来清除浮动, 其他浏览器请参考如下两种方法清除浮动.

overflow

父元素使用overflow:auto|hidden, 切记不可使用overflow:visible.

.outer{
    overflow:auto|hidden;
}

after伪类

利用clear:both属性, 同时为避免加入dom元素, 使用after伪元素设置如下属性即可:

.outer::after{
    content:'';
    display:block;
    clear:both;
}

本文就讨论这么多内容,大家有什么问题或好的想法欢迎在下方参与留言和评论.

本文作者: louis

本文链接: http://louiszhai.github.io/2016/03/12/css-float/

参考文章

Fork me on GitHub