关于html:什么是clearfix?

What is a clearfix?

最近我浏览了一些网站的代码,发现每个都有一个类clearfix

在一次快速的谷歌搜索之后,我了解到它有时适用于IE6,但什么是ClearFix?

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


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

值得注意的是,今天,使用浮动元素进行布局越来越不鼓励使用更好的替代方案。

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

flexbox支持Firefox 18、Chrome 21、Opera 12.10和Internet Explorer 10、Safari 6.1(包括Mobile Safari)以及Android的默认浏览器4.4。

有关详细的浏览器列表,请参阅:http://canius.com/flexbox。

(也许一旦它的位置完全确定,它可能是布局元素的绝对推荐方法。)

Clearfix Image

ClearFix是一种元素自动清除其子元素的方法,这样您就不需要添加额外的标记。它通常用于浮动布局,其中元素浮动以水平堆叠。

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

ClearFix执行如下:

1
2
3
4
5
6
7
.clearfix:after {
   content:""; /* Older browser do not support empty content */
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}

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

1
2
3
4
5
.clearfix:after {
  content:"";
  display: table;
  clear: both;
}

通常,您需要执行以下操作:

1
2
    Sidebar
     <!-- Clear the float -->

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

1
2
    Sidebar
    <!-- No Clearing div! -->

阅读本文-作者Chris Coyer@css tricks


如果您通过可视化学习,此图片可能会帮助您理解ClearFix的功能。

enter image description here


其他答案是正确的。但我想补充一点,这是人们第一次学习CSS,并滥用float进行所有布局时的遗留问题。float的目的是做一些类似于长文本旁边的浮动图像的事情,但是很多人将它作为他们的主要布局机制。因为这不是真正的目的,所以你需要像"clearfix"这样的黑客来让它工作。

如今,display: inline-block是一个可靠的替代方案(除了ie6和ie7),尽管更多的现代浏览器在flexbox、grid layout等名称下提供了更有用的布局机制。


clearfix允许容器包装其浮动子对象。如果没有clearfix或等效样式,容器就不会围绕其浮动子容器而折叠,就像其浮动子容器是绝对定位的一样。

有几个版本的ClearFix,其中NicolasGallagher和ThierryKoblentz是主要作者。

如果您希望支持较旧的浏览器,最好使用此ClearFix:

1
2
3
4
5
6
7
8
9
10
11
12
.clearfix:before, .clearfix:after {
    content:"";
    display: table;
}

.clearfix:after {
    clear: both;
}

.clearfix {
    *zoom: 1;
}

在SCSS中,可以使用以下技术:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
%clearfix {
    &:before, &:after {
        content:"";
        display:table;
    }

    &:after {
        clear:both;
    }

    & {
        *zoom:1;
    }
}

#clearfixedelement {
    @extend %clearfix;
}

如果您不关心支持旧的浏览器,有一个较短的版本:

1
2
3
4
5
.clearfix:after {
    content:"";
    display:table;
    clear:both;
}


对2017年第二季度的情况进行更新。

firefox 53、chrome 58和opera 45中提供了一个新的css3显示属性。

1
2
3
.clearfix {
   display: flow-root;
}

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

元素(其显示属性设置为Flow Root)生成一个块容器框,并使用流布局来布局其内容。它总是为其内容建立一个新的块格式上下文。

这意味着,如果使用包含一个或多个浮动子级的父DIV,则此属性将确保父级包含其所有子级。不需要任何ClearFix黑客。在任何子元素上,甚至不是最后一个虚拟元素上(如果在最后一个子元素上使用clearfix变量with:before)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
.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;
}
1
2
3
4
  This container box encloses all of its floating children.
  Floating box 1
  Floating box 2
  Floating box 3


简单地说,ClearFix是一个黑客。

这是我们所有人都必须忍受的丑陋的事情之一,因为它确实是确保浮动的儿童元素不会溢出父母的唯一合理方式。还有其他的布局方案,但是浮动在今天的Web设计/开发中太常见了,以至于不能忽略ClearFix黑客的价值。

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

10

参考


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

1
2
3
4
5
6
7
8
.clearfix:after {
    content:".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
    zoom: 1
}

这些组合行为的目的是创建一个容器:after,该活动元素包含一个标记为hidden的".",它将清除所有先前存在的浮动并有效地为下一个内容重置页面。


实现ClearFix的另一个(可能也是最简单的)选项是在包含元素上使用overflow:hidden;。例如

1
2
3
4
5
6
7
8
9
10
.parent {
  background: red;
  overflow: hidden;
}
.segment-a {
  float: left;
}
.segment-b {
  float: right;
}
1
2
3
4
    Float left
 
 
    Float right

当然,这只能在不希望内容溢出的情况下使用。


我试过了被接受的答案,但内容对齐仍然有问题。如下图所示,添加":before"选择器修复了问题:

1
2
3
4
5
6
7
8
9
10
11
// LESS HELPER
.clearfix()
{
    &:after, &:before{
       content:""; /* Older browser do not support empty content */
       visibility: hidden;
       display: block;
       height: 0;
       clear: both;
    }
}

上面的代码将编译为下面的CSS:

1
2
3
4
5
6
7
8
9
clearfix:after,
clearfix:before {
  content:"";
  /* Older browser do not support empty content */
  visibility: hidden;
  display: block;
  height: 0;
  clear: both;
}

这里有一个不同的方法,相同的东西,但有点不同

差异是内容点,用\00A0==whitespace替换。

有关更多信息,请访问http://www.jqui.net/tips-tricks/css-clearfix/

1
2
3
4
5
.clearfix:after { content:"\00A0"; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;}
.clearfix{ display: inline-block;}
html[xmlns] .clearfix { display: block;}
* html .clearfix{ height: 1%;}
.clearfix {display: block}

这是一个紧凑的版本…

1
.clearfix:after { content:"\00A0"; display: block; clear: both; visibility: hidden; line-height: 0; height: 0;width:0;font-size: 0px}.clearfix{ display: inline-block;}html[xmlns] .clearfix { display: block;}* html .clearfix{ height: 1%;}.clearfix {display: block}