什么是clearfix?

H B*_*amy 972 html css layout cross-browser clearfix

最近我查看了一些网站的代码,发现每个人<div> 都有一个班级clearfix.

经过快速谷歌搜索,我了解到它有时适用于IE6,但实际上是什么是一个clearfix?

与没有clearfix的布局相比,您能提供一些带有clearfix的布局示例吗?

Mad*_*iha 944

如果您不需要支持IE9或更低版本,则可以自由使用flexbox,而不需要使用浮动布局.

值得注意的是,今天,随着使用更好的替代品,使用浮动元素进行布局越来越不受欢迎.

  • display: inline-block - 更好
  • Flexbox - 最佳(但有限的浏览器支持)

Firefox 18,Chrome 21,Opera 12.10和Internet Explorer 10,Safari 6.1(包括Mobile Safari)和Android的默认浏览器4.4支持Flexbox.

有关详细的浏览器列表,请访问:http://caniuse.com/flexbox.

(也许一旦它的位置完全建立起来,它可能是绝对推荐的布局元素的方式.)


clearfix是元素自动清除其子元素的一种方式,因此您无需添加其他标记.它通常用于浮动布局,其中元素浮动以水平堆叠.

clearfix是一种解决浮动元素的零高度容器问题的方法

clearfix执行如下:

.clearfix:after {
   content: " "; /* Older browser do not support empty content */
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您不需要IE <8支持,以下情况也可以:

.clearfix:after {
  content: "";
  display: table;
  clear: both;
}
Run Code Online (Sandbox Code Playgroud)

通常你需要做如下的事情:

<div>
    <div style="float: left;">Sidebar</div>
    <div style="clear: both;"></div> <!-- Clear the float -->
</div>
Run Code Online (Sandbox Code Playgroud)

使用clearfix,您只需要以下内容:

<div class="clearfix">
    <div style="float: left;" class="clearfix">Sidebar</div>
    <!-- No Clearing div! -->
</div>
Run Code Online (Sandbox Code Playgroud)

本文中阅读- 由Chris Coyer @ CSS-Tricks撰写

  • @MadaraUchiha,为什么显示:内联块优于浮动元素?我唯一的问题是使用内联块显示会导致标签之间出现空白的问题,这些问题并不总是很容易控制. (14认同)
  • 不同意`display:inline-block`比基于块的布局更好.正如其名称所暗示的那样,内联块是*内联* - 大多数布局都是基于块的,并且这些块在内联格式化上下文中布局是没有意义的.您还必须处理与内联格式相关的各种问题,例如元素间空格,其他内联元素,大小调整,对齐等,正如许多其他人所指出的那样.当然,浮动布局也没有多大意义,但至少浮点数具有基于块的优点. (11认同)
  • 无论出于何种原因,空格都比点更好,我在某些浏览器上遇到点问题,因此我为什么提到它:) 一点点改进不会伤害:) (2认同)
  • `content: "\00A0";` \00A0 代表一个空格,一个简单的空格不能很好地工作:) 抱歉。:) (2认同)
  • @Kzqai:这就是为什么当Flexbox得到更广泛的支持时,它是首选的选择. (2认同)

kyo*_*kyo 448

如果您通过可视化学习,这张图片可能会帮助您了解clearfix的作用.

在此输入图像描述

  • @Cozzbie在某些情况下,是的.`overflow:auto`可能会产生一些不必要的副作用,clearfix是一个全局的解决方案,不会与任何其他属性发生碰撞或产生不必要的副作用. (11认同)
  • 所以基本上一个clearfix就像向父母添加`overflow:auto`一样好!?哎呀 (5认同)
  • 所以它在计算它自己的大小时强制容器包含浮动元素?因此,它正确地将容器背景填充的大小调整为其内容的高度和宽度? (3认同)

Dom*_*nic 66

其他答案都是正确的.但我想补充一点,它是人们第一次学习CSS并被滥用float来完成所有布局的时间遗留物.float意味着在长文本旁边做漂浮图像之类的东西,但很多人用它作为主要的布局机制.因为它不是真正的意思,你需要像"clearfix"这样的黑客才能使它工作.

这些天display: inline-block是一个可靠的选择(IE6和IE7除外),虽然更现代的浏览器在flexbox,网格布局等名称下具有更有用的布局机制.

  • 由于[块间距问题](http://css-tricks.com/fighting-the-space-between-inline-block-elements/),`inline-block`并不是对浮点数的严格改进. HTML中的空格转换为分隔块的空格字符.`inline-block`需要[自己的变通方法](http://css-tricks.com/fighting-the-space-between-inline-block-elements/),就像`float`需要clearfix一样. (49认同)

Joh*_*ers 39

clearfix允许的容器来包装它是浮动的孩子.没有clearfix或等效的造型,容器不会缠绕其浮动的儿童并且坍塌,就像它的浮动的孩子绝对定位一样.

clearfix有几个版本,Nicolas GallagherThierry Koblentz是主要作者.

如果您想要支持旧浏览器,最好使用此clearfix:

.clearfix:before, .clearfix:after {
    content: "";
    display: table;
}

.clearfix:after {
    clear: both;
}

.clearfix {
    *zoom: 1;
}
Run Code Online (Sandbox Code Playgroud)

在SCSS中,您应该使用以下技术:

%clearfix {
    &:before, &:after {
        content:" ";
        display:table;
    }

    &:after {
        clear:both;
    }

    & {
        *zoom:1;
    }
}

#clearfixedelement {
    @extend %clearfix;
}
Run Code Online (Sandbox Code Playgroud)

如果您不关心支持旧浏览器,那么版本较短:

.clearfix:after {
    content:"";
    display:table;
    clear:both;
}
Run Code Online (Sandbox Code Playgroud)


Kir*_*nos 14

提供2017年第二季度情况的最新情况.

Firefox 53,Chrome 58和Opera 45 提供了新的CSS3显示属性.

.clearfix {
   display: flow-root;
}
Run Code Online (Sandbox Code Playgroud)

在此处查看任何浏览器的可用性:http://caniuse.com/#feat=flow-root

元素(显示属性设置为flow-root)生成块容器框,并使用流布局布置其内容.它始终为其内容建立新的块格式化上下文.

这意味着如果您使用包含一个或多个浮动子节点的父div,则此属性将确保父节点包含其所有子节点.无需任何clearfix hack.在任何孩子,甚至是最后一个虚拟元素(如果你使用clearfix变体:在最后一个孩子之前).

.container {
  display: flow-root;
  background-color: Gainsboro;
}

.item {
  border: 1px solid Black;
  float: left;
}

.item1 {  
  height: 120px;
  width: 120px;
}

.item2 {  
  height: 80px;
  width: 140px;
  float: right;
}

.item3 {  
  height: 160px;
  width: 110px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  This container box encloses all of its floating children.
  <div class="item item1">Floating box 1</div>
  <div class="item item2">Floating box 2</div> 
  <div class="item item3">Floating box 3</div>  
</div>
Run Code Online (Sandbox Code Playgroud)


JRu*_*lle 11

简单地说,clearfix是一个黑客.

这是我们都必须忍受的丑陋事物之一,因为它确实是确保浮动的子元素不会溢出父母的唯一合理方式.还有其他布局方案,但浮动在今天的网页设计/开发中太普通了,忽略了clearfix黑客的价值.

我个人倾向于Micro Clearfix解决方案(Nicolas Gallagher)

.container:before,
.container:after {
  content:"";
  display:table;
}
.container:after {
  clear:both;
}
.container {
  zoom:1; /* For IE 6/7 (trigger hasLayout) */
}
Run Code Online (Sandbox Code Playgroud)

参考


Nat*_*lor 5

CSS基于浮动的布局中常用的一种技术是将少量CSS属性分配给您将包含浮动元素的元素。该技术通常使用称为的类定义clearfix来实现,(通常)实现以下CSS行为:

.clearfix:after {
    content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
    zoom: 1
}
Run Code Online (Sandbox Code Playgroud)

这些组合行为的目的是创建一个包含:after单个'。'的活动元素容器。标记为“隐藏”,这将清除所有先前存在的浮动内容,并有效地重置页面以显示下一个内容。