消除浮动的两种思路

利用clear

在元素后面紧跟一个空div,如

<div class="p">
    <div class="c"></div>
    <div class="c"></div>
    <div class="c"></div>
    <div style="clear:left;"></div>
</div>

利用伪元素

<div class="p floatfix">
    <div class="c">1</div>
    <div class="c">2</div>
    <div class="c">3</div>
</div>
  • css样式分两种
.floatfix:after{
    content:"."; 
    display:block; 
    height:0; 
    visibility:hidden; 
    clear:left;
}

.floatfix:after{
    content:"";
    display:table;
    clear:both;
}

触发BFC

可以查看下这篇文章:BFC神奇背后的原理

BFC布局规则

  1. 内部的Box会在垂直方向,一个接一个地放置。
  2. Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
  3. 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  4. BFC的区域不会与float box重叠。
  5. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  6. 计算BFC的高度时,浮动元素也参与计算

哪些元素会生成BFC

  • 根元素
  • float属性不为none
  • position为absolute或fixed
  • display为inline-block, table-cell, table-caption, flex, inline-flex
  • overflow不为visible

消除浮动

  • 容器中只有浮动元素时:
//.c{float:left}
        <div class="p">
             <div class="c"></div>
             <div class="c"></div>
             <div class="c"></div>
        </div>

设容器的float属性为left/right

  • 实现自适应两栏布局:

        <div class="container">
             <div class="left"></div>
             <div class="right"></div>
        </div>
.container{}
.left{float:left}
.right{display:block;overflow:hidden;}//触发right生成BFC

设容器的float属性为left/right

hasLayout

在ie6、7中可以利用hasLayout设为true触发和BFC类似的效果,因为趋势发展基本不用去考虑了

results matching ""

    No results matching ""