简介
float CSS
属性指定一个元素应沿其容器的左侧或右侧放置,允许文本和内联元素**环绕**它
。该元素从网页的正常流动(文档流)中移除,尽管仍然保持部分的流动性(与绝对定位相反)。
浮动元素是 float 的计算值非 none 的元素。
基本上可以认为:“让 block 元素无视 float 元素,让 inline 元素像流水一样围绕着 float 元素实现浮动布局。”
float 特性
float
有三种特性:
包裹性
高度破坏性
没有任何margin合并
包裹性
包裹性: 包裹性指的是元素尺寸刚好容纳内容,并且不会超越父级元素的宽度。
具有包裹性的其他属性:
display:inline-block/table-cell/...
position:absolute/fixed/sticky
overflow:hidden/scroll
通过一个实例来看一下什么是包裹性:
html
1 | <div class="container"> |
css
1 | * { |
效果图如下:
可以看到下面的元素的宽度就是它内部文本信息的宽度,而上面的元素是占了整个一行的元素。
包裹性的原理
浮动之所以会产生包裹性这样的效果是因为 float 属性会改变元素 display 属性最终的计算值。
float
属性对display
属性的影响如下:
- inline ——》 block
- inline-block ——》 block
- inline-table ——》 table
- table-row ——》 block
- table-row-group ——》 block
- table-column ——》 block
- table-column-group ——》 block
- table-caption ——》 block
- table-header-group ——》 block
- table-footer-group ——》 blcok
- flex ——》 flex
- inline-flex ——》 inline-flex【inline-flex 在 chrome 下测试,float 后 display:flex】
- other ——》unchanged
可以自己自行测试在不同浏览其中的表现,chrome测试方法如下:
修改 css 如下
1 | .fl { |
然后通过chrome的控制台首先查看Styles面板,可以看到display: inline-block;float: left;
属性生效,如下:
然后再查看Computed面板查看真正生效到元素上的所有属性,如下:
可以看到display: flex;
属性,得以验证上面的结论。
高度破坏性
破坏性是指元素浮动后可能导致父元素高度塌陷。
修改html代码如下:
1 | <div class="container"> |
效果图如下:
在div.container
元素没有设置高度时,div.nofl
不设置float: left;
时元素的高度会撑开父元素的高度。而div.fl
元素设置了float: left;
元素的高度不会包含在父元素的高度内。
其他破坏性的属性:
- display:none
- position:absolute/fixed/sticky
浮动破坏性原理:
因为浮动元素被从文档正常流中移除了,父元素当然还处在正常流中,所以父元素不能被浮动元素撑大。
没有任何 margin 合并
修改html代码如下:
1 | <div class="container"> |
修改css如下:
1 | .container { |
根据效果图可以看到div.one
和div.two
都是有margin: 10px;
的属性,但是它们之间的margin
并没有重合。如果没有float: left
属性的话,div.one
的下边距和div.two
的上边距会发生合并,也就是说它们合并后的外间距就会是10px
。
清除浮动
在上面的实例中就用到了clear
清除浮动属性,它可以解决float
带来一些副作用比如说高度破坏性
。
1 | clear: none | left | right | both; |
- none:默认值,允许两边都有浮动对象;
- left:不允许左侧有浮动对象;
- right:不允许右侧有浮动对象;
- both:两侧不允许有浮动对象。
具体原理:在元素上外边距之上增加清除空间,比如清除左浮动会让元素的上外边距刚好在左边浮动元素的下外边距之下。
清除浮动课两大类方法:
- 在兄弟元素最后一个设置 clear:both
- 父元素生成 BFC(IE8+)或者 hashlayout(IE6/IE7)
兄弟元素清除
修改html代码如下:
1 | <div class="container"> |
css
1 | /* 注释掉 */ |
可以看到在没有添加.clearfix { clear: both; }
时显示如图一,在添加.clearfix
后显示为图二。
图一
图二
这种方式也是有很多不好的地方,比如增加了一个无用标签、结构更复杂、比较难复用。
父元素添加 after 伪元素
为了解决上面兄弟元素的问题,引出父元素的 after 伪元素。
html
1 | <div class="container clearfix"> |
css
1 | .clearfix::after { |
这样可以实现与上面想同的效果并且不会产生兄弟元素产生的问题。
父元素生成 BFC(IE8+) 或 haslayout(IE6/IE7)
html
1 | <div class="container clearfix"> |
css
1 | .clearfix::after { |
常用布局
一列自适应一列固定布局
html
1 | <div class="container clearfix"> |
css
1 | .container { |
显示效果如下:
还有圣杯和双飞翼布局,这里就不一一列举,可在本在中查找。
float 布局和 inline-block 布局对比
float
和inline-block
都能让元素排成一排,那么应该如何抉择?下面对比一下。
- 文档流:浮动元素脱离正常流,让文字环绕。
inline-block
仍然在正常流中。 - 水平位置:不能通过给父元素设置
text-align:center
让浮动元素无法水平居中【因为脱离文档流】,而inline-block
可以。 - 垂直对齐:浮动元素紧贴顶部,
inline-block
默认基线对齐,可通过vertical-align
调整。 - 空白:浮动忽略空白元素彼此紧靠,
inline-block
保留空白。
其实float
和inline-block
看个人喜好和具体的场景。
总结
float
即使到现在还没有淘汰,虽然现在有很多更方便的布局如flex
、colmun
、grid
等等,现在还有很多场景在应用,所以还是要仔细学习。