ChatGPT解决这个技术问题 Extra ChatGPT

什么是清除修复?

最近我在查看某个网站的代码,发现每个<div> 都有一个类clearfix

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

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

它不适用于 IE 6。clearfix 确保 div 将完全展开到适当的高度以包含其浮动子项。 webtoolkit.info/css-clearfix.html
这个 6 分钟的 YouTube 视频比 IMO 的这些答案更能说明问题youtube.com/…

n
nCardot

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

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

显示:inline-block - 更好

Flexbox - 最好的(但有限的浏览器支持)

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

有关详细的浏览器列表,请参阅:https://caniuse.com/flexbox

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

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

clearfix 是一种对抗浮动元素的 zero-height container problem 的方法

clearfix 执行如下:

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

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

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

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

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

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

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

this article - by Chris Coyer @ CSS-Tricks 中了解它


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

其他答案都是正确的。但我想补充一点,这是人们第一次学习 CSS 并滥用 float 来完成所有布局的时代的遗迹。 float 旨在在长文本旁边执行浮动图像之类的操作,但很多人将其用作主要布局机制。由于它并不是真正的意思,因此您需要像“clearfix”这样的黑客来使其工作。

如今,display: inline-block 是一个可靠的替代方案 (except for IE6 and IE7),尽管更现代的浏览器正在提供更有用的布局机制,例如 flexbox、网格布局等。


我的实践已经证明没有理由使用浮点数。每当你使用它时,一半的东西都会坏掉。我只会在我需要在 div 中变出东西时使用它。内联块很棒。新的盒子模型很棒。所以没有更多的黑客去垂直对齐。
inline-block 不是对浮点数的严格改进,因为 the inter-block spacing problem 在 HTML 中的空白转换为分隔块的空格字符。 inline-block 需要 workarounds of its own,就像 float 需要 clearfix。
J
John Slegers

clearfix 允许容器包装其浮动子级。如果没有 clearfix 或等效样式,容器不会环绕其浮动子项并折叠,就像它的浮动子项被绝对定位一样。

clearfix 有多个版本,主要作者为 Nicolas GallagherThierry Koblentz

如果你想支持旧浏览器,最好使用这个 clearfix :

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

.clearfix:after {
    clear: both;
}

.clearfix {
    *zoom: 1;
}

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

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

    &:after {
        clear:both;
    }

    & {
        *zoom:1;
    }
}

#clearfixedelement {
    @extend %clearfix;
}

如果您不关心支持旧版浏览器,可以使用更短的版本:

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

很好的回答约翰!我想知道的是为什么 clear 使 div 包装浮动元素?你能帮我想象一下吗?
@AlexanderSuraphel:这个答案详细解释了它-> stackoverflow.com/questions/12871710/…
K
Kir Kanos

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

Firefox 53、Chrome 58 和 Opera 45 中提供了新的 CSS3 显示属性。

.clearfix {
   display: flow-root;
}

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

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

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

.container { 显示:流根;背景颜色:盖恩斯伯勒; } .item { 边框:1px 纯黑色;向左飘浮; } .item1 { 高度:120px;宽度:120px; } .item2 { 高度:80px;宽度:140px;浮动:对; } .item3 { 高度:160px;宽度:110px; }

这个容器框包含了它所有的浮动子元素。
浮动框1
浮动框2
浮动框3


你能描述一下这与这个问题有关吗?
Clearfix 通过使用聪明的 hack 来改变浮动的子级而不影响父级流,flow-root 是真正的解决方案。
C
Community

简单地说,clearfix 是一个 hack。

这是我们所有人都必须忍受的那些丑陋的事情之一,因为它确实是确保浮动子元素不会溢出其父母的唯一合理方法。还有其他布局方案,但浮动在当今的网页设计/开发中太常见了,无法忽视 clearfix hack 的价值。

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

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

reference


N
Nathan Taylor

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

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

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


A
Antoine

我尝试了接受的答案,但内容对齐仍然存在问题。添加如下所示的“:before”选择器解决了这个问题:

// LESS HELPER
.clearfix()
{
    &:after, &:before{
       content: " "; /* Older browser do not support empty content */
       visibility: hidden;
       display: block;
       height: 0;
       clear: both;
    }
}

上面的 LESS 将编译为下面的 CSS:

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

D
Dan W

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

.parent { 背景:红色;溢出:隐藏; } .segment-a { 浮动:左; } .segment-b { 浮动:对; }

向左浮动
向右浮动

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


V
Val

这是一种不同的方法,相同的东西,但有点不同

不同之处在于内容点被替换为 \00A0 == whitespace

有关此http://www.jqui.net/tips-tricks/css-clearfix/的更多信息

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

这是它的精简版...

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

您至少在 3 次情况下在这里超越了自己。 .clearfix {...}html[xmlns] .clearfix {...}* html .clearfix {...}.clearfix {...} 都选择相同的事物并相互覆盖。这有点hacky,并不是真正需要的。
这是旧版本的 CSS clearfix 方法,取自 css-tricks.com/snippets/css/clear-fix,我后来发现,“.”[dot] 太烦人了,用空格代替了它,所以为什么是 \00A0,我想它是因为跨浏览器的兼容性和时间的知识。