【问题标题】:What methods of ‘clearfix’ can I use?我可以使用哪些“clearfix”方法?
【发布时间】:2010-09-17 16:54:21
【问题描述】:

我有一个古老的问题,即 div 包装两列布局。我的侧边栏是浮动的,所以我的容器 div 无法包装内容和侧边栏。

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

似乎有很多方法可以修复 Firefox 中的明显错误:

  • &lt;br clear="all"/&gt;
  • overflow:auto
  • overflow:hidden

在我的情况下,唯一似乎可以正常工作的是&lt;br clear="all"/&gt; 解决方案,它有点邋遢。 overflow:auto 给了我讨厌的滚动条,overflow:hidden 肯定有副作用。 此外,由于其不正确的行为,IE7 显然不应该遇到这个问题,但在我的情况下,它与 Firefox 一样。

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

【问题讨论】:

  • 我使用jqui.net/tips-tricks/css-clearfix 它可以帮助我隐藏点:)
  • IE 6 和 IE 7 怎么样?他们从不遵循正确的清理方式。
  • 现在我们已经过去了一年,是否有机会修改在大牌框架 Bourbon 和 Inuit.css 中使用的现代三行 clearfix 概述 here 的正确答案?见my answer below

标签: css clearfix


【解决方案1】:

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

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

注意事项

请记住,clearfixes 本质上是对 flexbox 布局现在可以在 much easier and smarter way 中提供的内容的一种破解。 CSS 浮动最初是为内联内容的流动而设计的 - 就像长篇文章中的图像 - 而不是网格布局等。除非您专门针对旧的(不是 Edge)Internet Explorer,您的 target browsers support flexbox,否则值得花时间学习。

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

这个 clearfix 是 2012 年 7 月的 announced and explained by Thierry Koblentz。它减轻了 Nicolas Gallagher's 2011 micro-clearfix 的不必要的重量。在此过程中,它释放了一个伪元素供您自己使用。这已更新为使用 display: block 而不是 display: table(再次感谢 Thierry Koblentz)。

【讨论】:

  • 我希望你的回答能得到更多的支持,因为我完全同意你的看法。再说一次,现在是 2013 年,我真的相信这是人们应该使用的解决方案。
  • 同意。 theie7countdown.com 检查您自己的分析,希望看到 IE7 不值得您花时间。
  • @Justin 同意;您的个人分析将对此进行说明。不过,我认为倒计时网站已经有一段时间没有更新了 - 最好使用 caniuse's stats,它使 IE7 的全球使用率为 0.39%。
  • 希望通过使用 flexbox 而不是浮动来进行布局,像 clearfix 这样的 hack 很快就会变得不必要。
  • 您可以尽可能多地反对支持 IE7,但如果业务端需要支持这些用户(出于不同的原因 - 通常是钱),您将不会这样做不管你对这个问题的感受如何
【解决方案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>

【讨论】:

    【解决方案3】:

    鉴于大量的回复,我不会发布。但是,这种方法可能对某人有所帮助,因为它确实对我有所帮助。

    尽可能远离花车

    值得一提的是,我避免像埃博拉这样的漂浮物。有很多原因,我并不孤单;阅读有关what is a clearfix 的 Rikudo 答案,您就会明白我的意思。用他自己的话说:...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 中,使用 &lt;div classs="clear"&gt;&lt;/div&gt;(或其他元素)清除浮点数的做法很常见,但不受欢迎且反语义。

    <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):

    您为什么要关心? 大约 80%(或更多)使用的设备是带有小屏幕的移动设备。台式电脑/笔记本电脑不再是王道。


    不止于此

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

    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;
    }
    

    结果呢?

    这是***一样的!

    至少你知道,你将开始一个 CSS 派对,邀请各种选择器和属性参加派对;使你的 CSS 比你开始的更混乱。只是为了修复你的浮动。


    CSS Clearfix 救援

    这个简单且适应性极强的 CSS 是一个美丽和“救世主”:

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

    就是这样!它确实可以在不破坏语义的情况下工作,我有没有提到it works?

    来自同一个示例...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 */
    }
    

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

    这里又是clearfix

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

    【讨论】:

    • 类名clear的元素不起作用的原因是你的属性class是错误的。你写的是classs,还有一个s
    • 您的示例并未证明您声称的内容,即使在更正错误之后也是如此。
    【解决方案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

    【讨论】:

      【解决方案5】:

      我总是使用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 以及现代浏览器)添加对旧浏览器的支持。

      【讨论】:

        【解决方案6】:

        当我们在 div 元素内部使用 float 属性时,clearfix 就这么简单了。如果我们使用两个 div 元素,一个作为 float:left;另一个作为浮动:对;我们可以对两个 div 元素的父级使用 clearfix。如果我们拒绝使用 clearfix 不必要的空格填充下面的内容,网站结构将被破坏。

        【讨论】:

          【解决方案7】:
          .clearFix:after { 
              content: "";
              display: table;  
              clear: both;  
          }
          

          【讨论】:

            【解决方案8】:

            根据所产生的设计,以下每个 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>
            

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

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

            注意:在这个例子中,浮动元素是一个img标签,但可以是任何html元素。


            Clearfix 重新加载

            CSSMojo 上的 Thierry Koblentz 写道:The very latest clearfix reloaded。他指出,通过放弃对 oldIE 的支持,解决方案可以简化为一个 css 语句。此外,使用 display: block(而不是 display: table)可以在具有 clearfix 的元素是兄弟元素时正确折叠边距。

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

            这是最现代的 clearfix 版本。


            旧的 Clearfix 解决方案

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

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

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


            “Beat That ClearFix”,现代浏览器的清除修复

            CSS Mojo 的 Thierry Koblentz' 指出,在针对现代浏览器时,我们现在可以删除 zoom::before 属性/值并简单地使用:

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

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

            Thierry 还提供:“A word of caution:如果你从头开始一个新项目,那就去做吧,但不要用你现在拥有的技术来交换这种技术,因为即使你不支持 oldIE,你现有的规则防止折叠边距。”


            Micro Clearfix

            最新和全球采用的 clearfix 解决方案,Micro Clearfix by Nicolas Gallagher

            已知支持: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属性为IE设置“hasLayout”,triggering "hasLayout" for an element可以使用其他属性。

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

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

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

            虽然这可行……但使用 hack 并不理想。


            PIE:简单的清算方法

            这种较旧的“Easy Clearing”方法的优点是允许定位元素挂在容器边界之外,但代价是更复杂的 CSS。

            这个解决方案已经很老了,但你可以了解所有关于轻松清算头寸就是一切的知识:http://www.positioniseverything.net/easyclearing.html


            使用“清除”属性的元素

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

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

            缺点

            • 它不响应,因此如果布局样式根据媒体查询发生变化,则可能无法提供所需的效果。纯 CSS 的解决方案更理想。
            • 它添加了 html 标记,而不必添加任何语义值。
            • 它需要每个实例的内联定义和解决方案,而不是对 css 中“clearfix”的单个解决方案的类引用和 html 中对它的类引用。
            • 这使得其他人难以使用代码,因为他们可能不得不编写更多的技巧来解决它。
            • 将来当您需要/想要使用其他 clearfix 解决方案时,您不必返回并删除标记周围散落的每个 &lt;br style="clear: both" /&gt; 标记。

            【讨论】:

            • @David Rivers: :after 方法不是黑客,因为它不会利用浏览器中的解析错误,它使用 css 的特性作为解决方案。此外 :after 将在未来的浏览器中得到支持,这与下划线 hack 不同。理想情况下,将有一个 css 属性可以应用于一个元素,这将使它包含它的所有内容。
            • 感谢您的分解。我发现 :after "easy clearing" 方法优于 "overflow: hidden",因为它不会裁剪 CSS3 框阴影或定位元素。额外的代码行绝对值得。
            • 我不提倡 br clear:both 解决方案,但我不同意你对它的“肮脏”标签。与几行 CSS(浏览器也必须加载)相比,“增加重量/加载速度变慢”参数似乎很愚蠢,因为它是 1 行短的 html 代码。对于“语义价值”论点,带有 clear:both 的 br 比试图找出一堆愚蠢的行刑队 css 更容易理解。 br clear:两者都简短而简单,恕我直言,对“专业”没有影响。
            • 与流行的看法相反,overflow: hiddenoverflow: auto 不会清除浮动(将其归类为“clearfix”是用词不当);相反,它会导致一个元素创建一个新的formatting context,其中可以包含浮点数。这会导致容器拉伸到浮动的高度以包含它们。不涉及任何清除 - 话虽如此,您仍然可以根据您的布局选择清除或不清除容器内的浮动。
            • 我们不应该再支持 IE7 了。请使用here 描述的 三行 方法更新此内容
            【解决方案9】:

            我们要解决什么问题?

            浮动的东西有两个重要的考虑:

            1. 包含后代浮动。这意味着有问题的元素使其自身足够高以包裹所有浮动后代。 (他们不挂在外面。)

            2. 将后代与外部浮动隔离。这意味着元素内部的后代应该能够使用clear: both,并且不会与元素外部的浮动交互。

            块格式化上下文

            只有一种方法可以做到这两个。那就是建立一个新的block formatting context。建立块格式化上下文的元素是一个绝缘的矩形,其中浮动相互交互。块格式化上下文总是足够高以可视地包装其浮动后代,并且块格式化上下文之外的任何浮动都不能与内部元素交互。这种双向绝缘正是您想要的。在IE中,同样的概念叫做hasLayout,可以通过zoom: 1来设置。

            有几种方法可以建立块格式化上下文,但我推荐的解决方案是display: inline-blockwidth: 100%。 (当然,usual caveatswidth: 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 方法被认为是有害的

            传统的clearfixsolutions 的问题在于,它们使用两种不同的渲染概念来实现 IE 和其他所有人的相同目标。在 IE 中,他们使用 hasLayout 建立新的块格式化上下文,但对于其他所有人,他们使用生成的框 (:after) 和 clear: both,这不会建立新的块格式化上下文。这意味着事情不会在所有情况下都表现相同。有关这不好的原因的解释,请参阅Everything you Know about Clearfix is Wrong

            【讨论】:

            • 什么是“使用width: 100% 的常见注意事项”?另外,您是否建议在 §2 的 ¶1 中使用 zoom: 1
            • 有趣的答案,但是overflow: hidden 呢,它调用了什么渲染概念?和hasLayout有什么不同?
            • 没错,但如果避免使用position: absolute,那也没关系,并且会成为同一个渲染概念的一部分?
            • 我明白了。我所说的渲染概念是指overflow: hidden 是否强制执行与 hasLayout 不同的操作?
            • stackoverflow.com/questions/1794350/what-is-haslayout 上阅读更多关于hasLayout 的信息。我认为它是建立新的块格式化上下文的同义词。这样做的元素基本上负责其所有后代元素的布局。这样做的一个结果是,建立新块格式化上下文的元素包含浮动后代,并且元素外部的浮动不与内部的 clear: left|right|both 元素交互。 (这在上面的答案中。)
            【解决方案10】:

            与其他 clearfixes 不同,这是一个没有容器的开放式修复

            其他 clearfixes 要么要求浮动元素位于标记良好的容器中,要么需要一个额外的、语义上为空的 &lt;div&gt;。相反,内容和标记的明确分离需要严格的 CSS 解决方案来解决这个问题。

            仅仅需要标记浮点数的结尾这一事实,不允许unattended CSS typesetting

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

            这就是我使用以下带有新标题的 clearfix 的原因:

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

            此解决方案在my website 上广泛使用以解决问题:浮动缩影旁边的文本很短,并且不考虑下一个清除对象的上边距。

            当从站点自动生成PDFs 时,它还可以防止任何人工干预。 这是example page

            【讨论】:

              【解决方案11】:

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

              #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 一起工作,只需浮动父级以清除浮动。

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

              从来没有真正需要任何其他类型的清理。也许这就是我编写 HTML 的方式。

              【讨论】:

              • 我想研究一下您在不清除任何元素的情况下编写 HTML 的方式。可以发一些链接吗?
              【解决方案12】:

              使用 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();
              }
              

              【讨论】:

                【解决方案13】:

                #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>

                【讨论】:

                  【解决方案14】:

                  使用 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;
                      }
                  }
                  

                  【讨论】:

                    【解决方案15】:

                    假设您使用的是这种 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 中也是如此。

                    【讨论】:

                      【解决方案16】:

                      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! -->
                      

                      【讨论】:

                        【解决方案17】:

                        overflow 属性可用于清除浮动,无需额外标记:

                        .container { overflow: hidden; }
                        

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

                        .container { zoom: 1; }
                        

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

                        【讨论】:

                        • 溢出:隐藏在 PS3 浏览器中不起作用。并不是说大多数人都需要它来工作,但这是在 PS3 中炸毁我的网站的最重要的事情,我们出于商业原因试图瞄准它。呃。
                        • 如果你真的想让某些内容挂在容器外面,那就是个问题了。
                        • 溢出:隐藏对剪切内容有不好的副作用
                        • overflow:hidden具有剪辑内容的效果;它具有清除容器的副作用 ;-)
                        • overflow:auto 也会触发块格式化上下文,它不会剪切内容。
                        【解决方案18】:

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

                        /* 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/

                        【讨论】:

                        • 是的,截至 2011 年年中,这是我最喜欢的解决方案。它允许您在必要时将对象放置在包含框之外(避免overflow: hidden)。
                        【解决方案19】:

                        从引导程序清除修复:

                        .clearfix {
                          *zoom: 1;
                        }
                        
                        .clearfix:before,
                        .clearfix:after {
                          display: table;
                          line-height: 0;
                          content: "";
                        }
                        
                        .clearfix:after {
                          clear: both;
                        }
                        

                        【讨论】:

                        • 这是哪个版本的引导程序?
                        【解决方案20】:

                        我在官方的 CLEARFIX-Method 中发现了一个错误: DOT 没有字体大小。 如果你设置 height = 0 并且你的 DOM 树中的第一个元素有“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

                        【讨论】:

                          【解决方案21】:

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

                          【讨论】:

                          • 尼尔,我想当你想要两个列(或背景颜色/图像)周围的边框时,麻烦就来了,你需要一个需要包含 hack 的包装部分。
                          【解决方案22】:

                          我也会浮动#content,这样两列都包含浮动。也因为它可以让你在不清除侧边栏的情况下清除#content 中的元素。

                          与包装器相同,您需要将其设为块格式化上下文来包装两列。

                          本文提到了一些您可以使用的触发器: block formatting contexts.

                          【讨论】:

                            【解决方案23】:

                            我推荐使用以下,取自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;  
                            }
                            

                            【讨论】:

                            • 现在谁还记得IE-mac?为什么会因为无关紧要的问题而让事情变得如此复杂?
                            【解决方案24】:

                            我已经尝试了所有这些解决方案,当我使用下面的代码时,&lt;html&gt; 元素会自动添加一个大边距:

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

                            最后,我通过在上面的 CSS 中添加font-size: 0; 解决了边距问题。

                            【讨论】:

                            • 那是因为你加了一行.,就用content: ""
                            【解决方案25】:

                            你也可以把它放在你的 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">
                            

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

                            【讨论】:

                              【解决方案26】:

                              为什么只是尝试使用 css hack 来完成 1 行 HTML 的工作。还有为什么不用语义化的html tu put break 来返回行呢?

                              我真的更好用:

                              <br style="clear:both" />
                              

                              如果你不想在你的 html 中使用任何样式,你只需要使用 class 来休息 并将 .clear { clear:both; } 放入你的 CSS 中。

                              这样做的好处:

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

                              【讨论】:

                                【解决方案27】:

                                我只是使用:-

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

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

                                【讨论】:

                                • 在 IE7 中无法使用,因为它不支持 CSS 伪元素。
                                • ...这就是他说“兼容IE8+”的原因。大多数网站不再需要支持 IE7,全球使用率不到 1%。 theie7countdown.com
                                【解决方案28】:

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

                                我发现&lt;br clear="all" /&gt; 是最简单、最简单的。到处看到class="clearfix" 无法触动那些反对无关标记元素的人的感受,不是吗?您只是在不同的画布上绘制问题。

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

                                【讨论】:

                                • overflow: hidden 我想你的意思是
                                • 有些人建议使用名为 group 的类,这会使事情变得更加语义化。坦率地说,我不确定为什么这还没有流行
                                • 我完全撤回了这个职位。我现在只使用clearfix。但是在非常常见的容器上,我将其“烘焙”到 css 中以减少类属性污染。此外,将其命名为“组”似乎不错。输入的字符也更少
                                【解决方案29】:

                                你试过这个吗:

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

                                我对这个方法没有任何问题。

                                【讨论】:

                                • 我认为关键是我们试图通过这个解决方案避免额外的标记和内联样式。我想这取决于你最满意的妥协
                                • 这种方法的问题是在 IE 浏览器中 div 有一个高度,所以你的间距会被关闭。这就是 css 方法设置高度和字体大小的原因。
                                • 你需要说
                                  并带有适当的结束标签才能正确兼容 XHTML。不这样做时我遇到了 jQuery 问题
                                • 具有讽刺意味的是,“应该是自闭的”&lt;div/&gt; X(HT)ML兼容,但不兼容HTML i>,因此对于作为text/html 的文档,所有浏览器都会将其视为未闭合标签。不幸的是,无论文档类型如何,都没有像 text/html 文档的自动关闭标签这样的东西。
                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 2020-11-02
                                • 2020-01-21
                                • 1970-01-01
                                • 1970-01-01
                                • 2019-04-12
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多