我可以使用哪些“ clearfix”方法?


864

我有一个div包装两栏式布局的古老问题。我的侧边栏div处于浮动状态,因此我的容器无法包装内容和侧边栏。

<div id="container">
  <div id="content"></div>
  <div id="sidebar"></div>
</div>

似乎有许多方法可以解决Firefox中的明显错误:

  • <br clear="all"/>
  • overflow:auto
  • overflow:hidden

在我的情况下,似乎唯一可以正常工作的<br clear="all"/>解决方案是解决方案,这有点麻烦。overflow:auto给我带来讨厌的滚动条,并且overflow:hidden肯定有副作用。而且,IE7显然不应该由于其不正确的行为而遭受此问题的困扰,但就我而言,它与Firefox一样遭受痛苦。

我们目前可以使用的哪种方法最可靠?


1
我使用jqui.net/tips-tricks/css-clearfix它可以帮助我隐藏点:)
Val

1
IE 6和IE 7呢?他们永远不会遵循清除事物的正确方法。
Praveen Kumar Purushothaman 2012年

现在已经过去了一年,是否有可能修改此处概述的现代三行clearfix的正确答案,就像在大名鼎鼎的框架Bourbon和Inuit.css中使用的那样?请参阅下面的答案
iono

Answers:


1039

根据所产生的设计,以下每个clearfix CSS解决方案都有其自己的优点。

该clearfix确实具有有用的应用程序,但它也已被用作hack。在使用clearfix之前,也许这些现代的CSS解决方案可能会有用:


现代Clearfix解决方案


容器用 overflow: auto;

清除浮动元素的最简单方法是使用overflow: auto包含元素上的样式。该解决方案适用于所有现代浏览器。

<div style="overflow: auto;">
  <img
    style="float: right;"
    src="path/to/floated-element.png"
    width="500"
    height="500"
  > 
  <p>Your content here…</p>
</div>

缺点是,在外部元素上使用margin和padding的某些组合会导致出现滚动条,但这可以通过将margin和padding放在另一个包含父元素的元素上来解决。

使用'overflow:hidden'也是一个clearfix解决方案,但是不会有滚动条,但是使用using hidden会裁剪位于包含元素之外的所有内容。

注意: floated元素img在此示例中是一个标记,但可以是任何html元素。


已清除Clearfix

Thierry Koblentz在CSSMojo上写道:重新加载了最新的clearfix。他指出,通过放弃对oldIE的支持,该解决方案可以简化为一个CSS语句。此外,使用display: block(而不是display: table)可以使带有clearfix的元素成为同级元素时,页边距可以正确折叠。

.container::after {
  content: "";
  display: block;
  clear: both;
}

这是最新的clearfix版本。


较旧的Clearfix解决方案

以下解决方案对于现代浏览器不是必需的,但对于定位较旧的浏览器可能很有用。

请注意,这些解决方案依赖于浏览器错误,因此,仅在上述解决方案都不适合您时才应使用。

它们按时间顺序大致列出。


“ Beat That ClearFix”,现代浏览器的clearfix

CSS Mojo的 Thierry Koblentz 指出,当定位现代浏览器时,我们现在可以删除zoom::before属性/值,而只需使用:

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

该解决方案不支持IE 6/7……故意!

Thierry还提供:“ 提醒您:如果您从头开始一个新项目,请继续做下去,但是不要将此技术与您现有的技术互换,因为即使您不支持oldIE,您现有的规则也会阻止您利润下降。”


微型Clearfix

Nicolas Gallagher的最新的Clearfix解决方案,即Micro Clearfix解决方案。

已知支持:Firefox 3.5 +,Safari 4 +,Chrome,Opera 9 +,IE 6+

.container::before, .container::after {
  content: "";
  display: table;
}
.container::after {
  clear: both;
}
.container {
  zoom: 1;
}

溢流特性

对于通常的情况,当定位的内容不会在容器的边界之外显示时,这种基本方法是首选的。

http://www.quirksmode.org/css/clearing.html - 介绍如何解决与此相关的技术,即常见的问题,设置width: 100%在容器上。

.container {
  overflow: hidden;
  display: inline-block;
  display: block;
}

display可以使用其他属性来触发元素的“ hasLayout”,而不是使用该属性为IE设置“ hasLayout” 。

.container {
  overflow: hidden;
  zoom: 1;
  display: block;
}

使用该overflow属性清除浮点数的另一种方法是使用下划线hack。IE将应用带下划线前缀的值,其他浏览器则不会。该zoom属性触发IE中的hasLayout

.container {
  overflow: hidden;
  _overflow: visible; /* for IE */
  _zoom: 1; /* for IE */
}

虽然可行,但使用骇客并不理想。


PIE:轻松清除方法

这种较旧的“轻松清除”方法的优点是允许定位的元素悬挂在容器的边界之外,但以更复杂的CSS为代价。

该解决方案已经很老了,但是您可以了解有关“位置即一切”的轻松清算的全部信息:http : //www.positioniseverything.net/easyclearing.html


元素使用“清除”属性

快速而肮脏的解决方案(有一些缺点),当您快速将某物拍打在一起时:

<br style="clear: both" /> <!-- So dirty! -->

缺点

  • 如果布局样式基于媒体查询而更改,则它没有响应,因此可能无法提供所需的效果。纯CSS解决方案更为理想。
  • 它添加html标记,而不必添加任何语义值。
  • 它需要为每个实例提供内联定义和解决方案,而不是对CSS中“ clearfix”的单个解决方案的类引用以及html中对其的类引用。
  • 对于其他人而言,这使代码难以使用,因为其他人可能不得不编写更多hack来解决该问题。
  • 将来,当您需要/想要使用另一种clearfix解决方案时,您将不必返回并删除<br style="clear: both" />标记周围乱丢的每个标签。

25
@David Rivers::after方法不是黑客,因为它不利用浏览器中的解析错误,它使用css的功能作为解决方案。另外,与下划线不同,将来的浏览器将支持:after。理想情况下,将有一个CSS属性可以应用于元素,这将导致该元素包含所有内容。
Beau Smith,

7
感谢您的细分。我发现:after“轻松清除”方法优于“溢出:隐藏”,因为它不会裁剪CSS3框阴影或定位的元素。多余的代码行绝对值得。
Aneon 2011年

7
我不主张br clear:both解决方案,但是我不同意您对它的“肮脏”标签。“增加重量/加载速度较慢”的说法似乎很愚蠢,因为它是html代码的一小行,而不是几行CSS(您的浏览器也必须加载)。对于“语义价值”论点,一个带有clear:both的br远比试图找出一群愚蠢的射击小队css更容易理解。br clear:两者都简短而简单,恕我直言对“专业主义”没有影响。
Vigrond 2012年

16
与普遍的看法相反,overflow: hidden或者overflow: auto不清除浮动信息(将其归类为“ clearfix”是错误的用词);相反,它导致元素创建一个新的格式上下文,可以在其中包含浮点数。这导致容器伸展到浮子的高度以容纳它们。完全没有涉及任何间隙-话虽如此,您仍然可以根据布局选择清除或不清除容器内的浮子。
BoltClock

3
我们不应该再支持IE7。请使用此处介绍的三行方法更新此内容
iono 2013年

70

我们要解决什么问题?

浮动内容时有两个重要注意事项:

  1. 包含后代浮动。这意味着所讨论的元素本身足够高,可以包裹所有浮动后代。(他们不挂在外面。)

    漂浮物悬挂在容器外

  2. 从外部花车中隔离后代。这意味着元素内部的后代应该能够使用clear: both并且不与元素外部的浮点交互。

    <code> clear:两者</ code>与DOM中其他地方的float交互

块格式化上下文

这两种方法只有一种。那就是建立一个新的块格式化上下文。建立块格式上下文的元素是一个绝缘的矩形,其中的浮点数相互影响。块格式化上下文将始终足够高,以可视方式包装其浮动后代,并且块格式化上下文外部的浮点不能与内部元素交互。这种双向绝缘正是您想要的。在IE中,相同的概念称为hasLayout,可以通过进行设置zoom: 1

建立块格式化上下文有多种方法,但是我建议的解决方案是display: inline-block使用width: 100%。(当然,也有通常的告诫使用width: 100%,所以使用box-sizing: border-box或放paddingmarginborder不同的元件上。)

最强大的解决方案

浮点数最常见的应用可能是两列布局。(可以扩展为三列。)

首先是标记结构。

<div class="container">
  <div class="sidebar">
    sidebar<br/>sidebar<br/>sidebar
  </div>
  <div class="main">
    <div class="main-content">
      main content
      <span style="clear: both">
        main content that uses <code>clear: both</code>
      </span>
    </div>
  </div>
</div>

现在是CSS。

/* Should contain all floated and non-floated content, so it needs to
 * establish a new block formatting context without using overflow: hidden.
 */
.container {
  display: inline-block;
  width: 100%;
  zoom: 1; /* new block formatting context via hasLayout for IE 6/7 */
}

/* Fixed-width floated sidebar. */
.sidebar {
  float: left;
  width: 160px;
}

/* Needs to make space for the sidebar. */
.main {
  margin-left: 160px;
}

/* Establishes a new block formatting context to insulate descendants from
 * the floating sidebar. */
.main-content {
  display: inline-block;
  width: 100%;
  zoom: 1; /* new block formatting context via hasLayout for IE 6/7 */
}

自己尝试

转至JS Bin来处理代码,并从头开始了解此解决方案的构建方式。

传统的clearfix方法被认为是有害的

传统clearfix 解决方案的问题在于,它们使用两种不同的呈现概念来实现IE和其他所有人的相同目标。在IE中,他们使用hasLayout建立新的块格式化上下文,但是对于其他所有人,他们使用:after带有的生成框()来clear: both建立新的块格式化上下文。这意味着事情不会在所有情况下都一样。有关为什么这样做不好的解释,请参阅有关Clearfix的所有知识都是错误的


什么是“通常的使用注意事项width: 100%”?另外,您是否建议zoom: 1在§2的¶1中使用?
堡盟

有趣的答案,但是overflow: hidden,调用什么渲染概念呢?和它有什么不同hasLayout
堡盟

是的,但是如果避免使用position: absolute,那很好,并且将成为同一渲染概念的一部分吗?
堡盟

我知道了。通过渲染概念,我的意思是如果overflow: hidden强制执行与hasLayout有所不同的事情?
堡盟

2
hasLayoutstackoverflow.com/questions/1794350/what-is-haslayout上了解更多信息。我认为它与建立新的块格式化上下文同义。这样做的元素本质上负责所有后代元素的布局。这样的结果是,建立新块格式化上下文的元素包含浮动后代,并且浮动在元素外部的元素不会与clear: left|right|both内部元素进行交互。(这是上面的答案。)
克里斯·卡洛

54

Inuit.cssBourbon使用的新标准-两个使用非常广泛且维护良好的CSS / Sass框架:

.btcf:after {
    content:"";
    display:block;
    clear:both;
}

笔记

请记住,clearfix本质上是对flexbox布局现在可以以更智能的方式提供的东西的一种破解。CSS浮点数最初是设计用于使内联内容四处流淌(如长篇文章中的图像),而不是用于网格布局等。如果您的目标浏览器支持flexbox,那么值得研究。

这不支持IE7。您应该支持IE7。这样做继续使用户面临无法修复的安全漏洞,并使所有其他Web开发人员的生活更加艰难,因为这减轻了用户和组织切换到现代浏览器的压力。

该clearfix 由Thierry Koblentz于2012年7月宣布并解释。它摆脱了Nicolas Gallagher的2011年micro-clearfix的不必要的限制。在此过程中,它将释放一个伪元素供您自己使用。这已更新为使用,display: block而不是display: table(再次归功于Thierry Koblentz)。


3
我完全同意您的意见,希望您的回答能在此获得更多投票。同样,现在是2013年,我真的相信这是人们应该使用的解决方案。
rafaelbiten

2
同意 theie7countdown.com检查您自己的分析,并希望看到IE7不值得您花时间。
贾斯汀

1
@贾斯汀同意; 您的个人分析将对此进行布局。我不认为倒计时网站会在一段时间内更新-最好使用caniuse的统计数据,该数据使IE7在全球范围内的占比为0.39%。
iono 2013年

1
希望像clearfix这样的hack很快将通过使用flexbox而不是float来成为不必要的布局。
iono

您可以随意支持IE7,但是如果业务需求支持这些用户(出于各种原因-通常是金钱),无论您对问题的看法如何,都将做到这一点
Kris Selbekk 2015年

27

我建议使用以下内容,该内容取自http://html5boilerplate.com/

/* >> The Magnificent CLEARFIX << */
.clearfix:after { 
  content: "."; 
  display: block; 
  height: 0; 
  clear: both; 
  visibility: hidden; 
}
.clearfix { 
  display: inline-block;  
}
* html .clearfix {  
  height: 1%;  
} /* Hides from IE-mac \*/
.clearfix {  
  display: block;  
}

8
谁现在记得IE-mac?为什么由于不再相关的问题而使事情变得如此复杂?
Ilya Streltsyn

23

溢出属性可用于清除浮点数,而无需额外的标记:

.container { overflow: hidden; }

这适用于除IE6之外的所有浏览器,您需要做的就是启用hasLayout(缩放是我的首选方法):

.container { zoom: 1; }

http://www.quirksmode.org/css/clearing.html


3
溢出:隐藏在PS3浏览器中不起作用。并不是大多数人都需要它来工作,但这是在PS3中炸毁我的网站最重要的事情,出于业务原因,我们试图将其定位为目标。啊。
gtd

1
如果您确实希望某些内容挂在容器外部,则这是一个问题。
西蒙·伊斯特

溢出:隐藏具有剪切内容的不良副作用
克里斯·卡洛

9
overflow:hidden具有剪切内容的效果;它具有清除容器的副作用;-)
Tamlyn

overflow:auto还将触发块格式化上下文,并且不会剪切内容。
哈里·罗宾斯

17

我在官方的CLEARFIX方法中发现了一个错误:DOT没有字体大小。而且,如果您将设置为,height = 0并且DOM-Tree中的第一个Element具有类“ clearfix”,则您始终在页面底部有12px的空白:)

您必须像这样修复它:

/* float clearing for everyone else */
.clearfix:after{
  clear: both;
  content: ".";
  display: block;
  height: 0;
  visibility: hidden;
  font-size: 0;
}

现在,它已成为YAML布局的一部分...看看吧-非常有趣! http://www.yaml.de/en/home.html


15

这是一个很整洁的解决方案:

/* For modern browsers */
.cf:before,
.cf:after {
    content:"";
    display:table;
}

.cf:after {
    clear:both;
}

/* For IE 6/7 (trigger hasLayout) */
.cf {
    zoom:1;
}

已知可在Firefox 3.5 +,Safari 4 +,Chrome,Opera 9 +,IE 6+中运行

不必包括:before选择器来清除浮点数,但是它可以防止在现代浏览器中折叠上边距。这样可以确保在应用zoom:1时与IE 6/7保持视觉一致性。

来自http://nicolasgallagher.com/micro-clearfix-hack/


1
是的,截至2011年中,这是我最喜欢的解决方案。如有必要,它使您可以将对象放置在容纳箱之外(避免overflow: hidden)。
西蒙东

10

引导程序中的Clearfix:

.clearfix {
  *zoom: 1;
}

.clearfix:before,
.clearfix:after {
  display: table;
  line-height: 0;
  content: "";
}

.clearfix:after {
  clear: both;
}

这是哪个版本的引导程序?
埃里克

8

我只是用:-

.clear:after{
  clear: both;
  content: "";
  display: block;
}

效果最好,并且与IE8 +兼容:)


在IE7中无法使用,因为它不支持CSS伪元素。
superluminary

4
...这就是为什么他说“与IE8 +兼容”。大多数网站不再需要支持IE7,在全球范围内,其使用率不到1%。theie7countdown.com
贾斯汀

8

鉴于大量的回复,我不愿发表。但是,这种方法可能确实对我有所帮助。

尽可能远离花车

值得一提的是,我避免像埃博拉病毒这样的浮游生物。原因很多,我并不孤单。阅读Rikudo关于什么是 clearfix的答案,您会明白我的意思。用他自己的话说:...the use of floated elements for layout is getting more and more discouraged with the use of better alternatives...

除了浮动以外,还有其他好的(有时更好)的选择。随着技术的进步和改进,flexbox(和其他方法)将被广泛采用,并且浮动将成为不好的记忆。也许是CSS4?


浮动行为不当和清除失败

首先,有时候,您可能会认为自己是安全的,直到救生员被刺破并且html流开始下沉为止:

在下面的代码库http://codepen.io/omarjuvera/pen/jEXBya中,用<div classs="clear"></div>(或其他元素)清除浮点数的做法很常见,但却皱眉又反语义。

<div class="floated">1st</div>
<div class="floated">2nd</div>
<div class="floated">3nd</div>
<div classs="clear"></div> <!-- Acts as a wall -->
<section>Below</section>

的CSS

div {
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}

div.floated {
    float: left;
}

.clear {
    clear: both;
}
section {
    border: 1px solid #f0f;
}

但是,就在您以为您的浮子值得扬帆的时候……轰!随着屏幕尺寸越来越小,您会看到如下图所示的奇怪行为(相同的http://codepen.io/omarjuvera/pen/jEXBya):

浮动错误示例1

你为什么要在乎呢? 我不确定确切的数字,但大约80%(或更多)的设备是带有小屏幕的移动设备。台式机/笔记本电脑不再是国王。


它不止于此

这不是浮点数的唯一问题。有很多,但是在这个例子中,有些人可能会说all you have to do is to place your floats in a container。但是正如您在代码笔和图形中所看到的,情况并非如此。显然这使事情变得最糟:

的HTML

<div id="container" class="">
  <div class="floated">1st</div>
  <div class="floated">2nd</div>
  <div class="floated">3nd</div>
</div> <!-- /#conteiner -->
<div classs="clear"></div> <!-- Acts as a wall -->
<section>Below</section>

的CSS

#container {
  min-height: 100px; /* To prevent it from collapsing */
  border: 1px solid #0f0;
}
.floated {
    float: left;
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}

.clear {
    clear: both;
}
section {
    border: 1px solid #f0f;
}

至于结果呢?

一样的! 浮动错误示例2

至少您知道,您将开始一个CSS派对,邀请各种选择器和属性参加该派对。比起步时造成的CSS混乱更大。只是为了解决您的浮动问题。


CSS Clearfix可以解救

这个简单而又适应性强的CSS片段是一个美丽而“救世主”:

.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

而已!它确实可以在不破坏语义的情况下工作,我是否提到它可以工作?

来自同一示例... HTML

<div class="clearfix">
    <div class="floated">1st</div>
    <div class="floated">2nd</div>
    <div class="floated">3nd</div>
</div>
<section>Below</section>

的CSS

div.floated {
    float: left;
    border: 1px solid #f00;
    width: 200px;
    height: 100px;
}
section {
        border: 4px solid #00f;
}


.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

现在,我们不再需要<div classs="clear"></div> <!-- Acts as a wall -->让语义警察满意。这不是唯一的好处。该clearfix可以响应任何屏幕尺寸,而无需使用@media其最简单的形式。换句话说,它将使您的浮动容器处于检查状态并防止洪水泛滥。最后,它在一小手空手道中就为所有旧浏览器提供了支持=)

这又是clearfix

.clearfix:before, .clearfix:after { 
    content: "";
    display: table;
    clear: both;
    zoom: 1; /* ie 6/7 */
}

2
具有clear类名称的元素 不起作用的原因是您的属性class错误。你写的是classs,还有一个额外的s
栗子

即使更正了错误,您的示例也无法证明您的主张。
恢复莫妮卡– notmaynard

7

我总是浮动网格的主要部分并应用于clear: both;页脚。不需要额外的div或class。


尼尔,我想麻烦是当您想在两列之间都加边框(或背景色/图像)时,需要一个包装部分,该部分需要包含一些技巧。
西蒙·伊斯特

5

老实说 所有解决方案似乎都是修复渲染错误的技巧……我错了吗?

我发现<br clear="all" />这是最简单,最简单的。class="clearfix"到处都看不到有人反对多余的标记元素的感觉,是吗?您只是在另一个画布上绘制问题。

我也使用该display: hidden解决方案,它很棒,不需要任何额外的类声明或html标记...但有时您需要元素来使容器溢出,例如。漂亮的丝带和腰带


5
overflow: hidden我想你的意思是
ajbeaven 2011年

有人建议使用称为group的类,它使事情更具语义。坦率地说,我不确定为什么还没有流行
Damon

我完全收回了这个位置。我现在只使用clearfix。但是在非常普通的容器上,我将其“烘焙”到CSS中以减少类属性污染。另外,将其命名为“ group”似乎很好。输入的字符也要少一些
duggi,2011年

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

4

我已经尝试了所有这些解决方案,<html>当我使用以下代码时,将自动向元素中添加大的空白:

.clearfix:after {   
    visibility: hidden;   
    display: block;   
    content: ".";   
    clear: both;   
    height: 0;
}

最后,通过添加font-size: 0;上述CSS 解决了边距问题。


2
那是因为你添加一个符合.,只是使用content: ""
四十

4

使用SASS,clearfix是:

@mixin clearfix {
    &:before, &:after {
        content: '';
        display: table;
    }
    &:after {
        clear: both;
    }
    *zoom: 1;
}

它的用法如下:

.container {
    @include clearfix;
}

如果您想要新的clearfix:

@mixin newclearfix {
    &:after {
        content:"";
        display:table;
        clear:both;
    }
}

4

使用LESS(http://lesscss.org/),可以创建一个方便的clearfix帮助程序:

.clearfix() {
  zoom: 1;
  &:before { 
    content: ''; 
    display: block; 
  }
  &:after { 
    content: ''; 
    display: table; 
    clear: both; 
  }
}

然后将其用于有问题的容器,例如:

<!-- HTML -->
<div id="container">
  <div id="content"></div>
  <div id="sidebar"></div>
</div>
/* LESS */
div#container {
  .clearfix();
}

4

如果浮动容器具有父元素,则对ie6 使用overflow:hidden/ auto和height就足够了。

#test之一都可以使用,因为下面所述的HTML可以清除浮点数。

#test {
  overflow:hidden; // or auto;
  _height:1%; forces hasLayout in IE6
}

<div id="test">
  <div style="floatLeft"></div>
  <div style="random"></div>
</div>

如果它拒绝与ie6一起使用,则只需浮动父级以清除float。

#test {
  float: left; // using float to clear float
  width: 99%;
}

从未真正需要任何其他清除方式。也许这就是我编写HTML的方式。


1
我想研究您在不清除任何元素的情况下编写HTML的方式。你能发布一些链接吗?
Starx 2011年

4

一个新的显示值似乎在一行中。

display: flow-root;

根据W3规范:“元素生成一个块容器框,并使用流布局对它的内容进行布局。它始终为其内容建立一个新的块格式化上下文。”

信息:https//www.w3.org/TR/css-display-3/#valdef-display-flow-root https://www.chromestatus.com/feature/5769454877147136

※如上面的链接所示,目前支持有限,因此可能会使用如下所示的后备支持:https : //github.com/fliptheweb/postcss-flow-root



3

clearfix是元素自动清除的一种方式,因此您无需添加其他标记。

.clearfix:after {
   content: " "; /* Older browser do not support empty content */
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}
.cleaner {
  clear: both;
}

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

<div style="float: left;">Sidebar</div>
<div class="cleaner"></div> <!-- Clear the float -->

使用clearfix,您只需要

<div style="float: left;" class="clearfix">Sidebar</div>
<!-- No Clearing div! -->

2

为什么只想使用CSS hack来完成HTML的哪一行工作呢?而为什么不使用语义html tu put break返回行呢?

fo me真的更好用:

<br style="clear:both" />

而且,如果您不想在html中使用任何样式,则只需使用class进行休息,然后放入.clear { clear:both; }CSS中即可。

优点:

  • 语义使用html返回行
  • 如果没有CSS加载,它将正常工作
  • 无需额外的CSS代码和Hack
  • 无需使用CSS模拟br,它已经存在于HTML中

2

假设您正在使用以下HTML结构:

<div id="container">
  <div id="content">
  </div>
  <div id="sidebar">
  </div>
</div>

这是我要使用的CSS:

div#container {
    overflow: hidden;    /* makes element contain floated child elements */
}

div#content, div#sidebar {
    float: left;
    display: inline;    /* preemptively fixes IE6 dobule-margin bug */
}

我一直使用此设置,即使在IE6中,它也对我有效。


2

与其他clearfix不同,这是一个不带容器的开放式解决方案

其他clearfix要么要求float元素位于标记明确的容器中,要么需要一个额外的语义上为空的容器<div>。相反,内容和标记的清晰分隔要求对此问题使用严格的CSS解决方案

仅需要标记一个浮点数的结尾这一事实本身就不允许进行无人看管的CSS排版

如果后者是您的目标,则浮点数应保持打开状态,以便任何东西(段落,有序和无序列表等)环绕它,直到遇到“ clearfix”。例如,clearfix可能由新标题设置。

这就是为什么我将以下clearfix与新标题一起使用的原因:

h1 {
    clear: both;
    display: inline-block;
    width: 100%;
}

此解决方案在我的网站上得到了广泛使用,以解决该问题:浮动缩图旁边的文本很短,并且不考虑下一个清算对象的上边距。

从站点自动生成PDF时,它还可以防止任何手动干预。这是一个示例页面


2

我总是使用micro-clearfix

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

.cf:after {
    clear: both;
}

/**
 * For IE 6/7 only
 */
.cf {
    *zoom: 1;
}

Cascade Framework中,我甚至默认情况下将其应用于块级元素。IMO默认情况下将其应用于块级元素,使块级元素的行为比其传统行为更为直观。这对我来说,将对较旧的浏览器的支持添加到Cascade Framework(支持IE6-8以及现代浏览器)也变得容易得多。


0

您也可以将其放在CSS中:

.cb:after{
  visibility: hidden;
  display: block;
  content: ".";
  clear: both;
  height: 0;
}

*:first-child+html .cb{zoom: 1} /* for IE7 */

并将类“ cb”添加到您的父div:

<div id="container" class="cb">

您无需在原始代码中添加任何其他内容...


0

#content{float:left;}
#sidebar{float:left;}
.clear{clear:both; display:block; height:0px; width:0px; overflow:hidden;}
<div id="container">
  <div id="content">text 1 </div>
  <div id="sidebar">text 2</div>
  <div class="clear"></div>
</div>


-2

您是否尝试过:

<div style="clear:both;"/>

我没有这种方法的任何问题。


2
我认为关键是我们正在尝试通过此解决方案避免额外的标记和内联样式。我想这取决于您最幸福的妥协
Sam Murray-Sutton

1
这种方法的问题在于,在IE浏览器中,div的高度很高,因此您的间距将不可用。这就是为什么css方法设置height和font-size的原因。
zznq 2010年

您需要使用适当的结束标记说<div style =“ clear:both”> </ div>才能完全符合XHTML。我没有执行此操作时就遇到了jQuery问题
Simon_Weaver

1
具有讽刺意味的是,“本来应该是自动关闭的” <div/> X(HT)ML兼容的,但不兼容HTML,因此对于用作text/html所有浏览器的文档,它将视为未关闭的标签。不幸的是text/html无论文档类型如何,都没有像文件自动关闭标签这样的东西。
Ilya Streltsyn

-2

我最喜欢的方法是在css / scss文档中创建一个clearfix类,如下所示

.clearfix{
    clear:both
}

然后在我的html文档中调用它,如下所示

<html>
  <div class="div-number-one">
    Some Content before the clearfix
  </div>

  <!-- Let's say we need to clearfix Here between these two divs --->
  <div class="clearfix"></div>

  <div class="div-number-two">
    Some more content after the clearfix
  </div>
</html>

-2

如此简单,当我们使用div元素内部的float属性时,clearfix可以解决问题。如果我们使用两个div元素,其中一个作为float:left; 另一种为float:right; 我们可以将clearfix用于两个div元素的父元素。如果我们拒绝使用clearfix,则在下面的内容中填充不必要的空格,否则站点结构将被破坏。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.