我见过div标记使用clearfix类,而它的子级divs使用float属性。ClearFix类如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13
| .clearfix:after {
clear: both;
content:".";
display: block;
height: 0;
visibility: hidden;
}
.clearfix {
display: inline-block;
}
.clearfix {
display: block;
} |
我发现,如果我使用bottom-border财产时不使用clearfix,边界将显示在子divs的上方。有人能解释一下ClearFix类的作用吗?另外,为什么有两个display属性?我觉得这很奇怪。我特别想知道content:'.'是什么意思。
谢谢,G
浮子如何工作
当页面上存在浮动元素时,非浮动元素围绕浮动元素,类似于报纸上文本围绕图片的方式。从文档的角度(HTML的原始目的),这就是浮动工作的方式。
float对
display:inline的比较
在display:inline-block发明之前,网站使用float将元素设置在一起。与display:inline相比,float更受欢迎,因为后者不能设置元素的尺寸(宽度和高度)以及垂直填充(顶部和底部),浮动元素可以这样做,因为它们被视为块元素。
浮点问题
主要问题是,我们使用的float违背了它的预期目的。
另一个问题是,虽然float允许并行块级别的元素,但浮动不会赋予容器形状。就像position:absolute中的元素"从布局中取出"。例如,当空容器包含浮动的100px x 100px 时,不会将100px的高度赋予容器。
与position:absolute不同,它会影响围绕它的内容。浮动元素之后的内容将"环绕"元素。它首先在它旁边渲染,然后在它下面渲染,就像报纸文本围绕图像流动一样。
Clearfix救援
ClearFix所做的是强制在浮动之后或包含浮动的容器在其下方呈现内容。clear fix有很多版本,但它的名字来自于常用的版本——使用css属性clear的版本。
实例
根据浏览器和用例的不同,这里有几种执行ClearFix的方法。我们只需要知道如何使用CSS中的clear属性,以及如何在每个浏览器中呈现浮动,以实现完美的跨浏览器清除修复。
你有什么
您提供的样式是一种具有向后兼容性的ClearFix形式。我找到一篇关于这个ClearFix的文章。事实证明,这是一个旧的ClearFix——仍然迎合旧的浏览器。文章中还有一个更新、更清晰的版本。下面是细目:
第一个clearfix在目标元素和下一个元素之间附加了一个不可见的伪元素,它被命名为clear:both。这将强制伪元素在目标之下呈现,并强制伪元素之下的下一个元素呈现。
第二个附加了早期浏览器不支持的样式display:inline-block。inline块与inline类似,但提供了一些阻止元素的属性,如宽度、高度和垂直填充。这是针对IE-Mac的。
这是由于上述ie-mac规则而重新应用display:block。这条规则对IE-Mac是"隐藏"的。
总而言之,这3条规则使.clearfix能够跨浏览器工作,同时考虑到旧的浏览器。
- 最终的display:block是否会覆盖所有浏览器上的display:inline-block,包括那些支持inline-block的浏览器?
- 编辑了我的答案。这不是最后一个元素。后面是一个空元素。有时您会看到其他人在最后一个浮动元素之后添加</div>,以模拟:after的"空白内容"。这是针对旧浏览器的。
- 你的解释很详细,但为什么点代表空白?
- 它只是一个虚拟的内容,因此是"空白"。你不会真的看到它是因为height:0和visibility:hidden。它不会在设计中传递除清理以外的任何东西。
- @约瑟夫,我同意你的回答,但我想知道上面(clearfix)类应用的结构(html)。你能详细解释一下吗?这样以后读过这个问题的人都能容易理解。请提前谢谢。
- 更新了我的答案。查看小提琴和文章了解更多详细信息。
- 我必须在你的回答之外加上同样的效果(使父对象和它的内容一样大,即使内容是浮动的),也可以通过向父对象添加overflow: hidden,而不添加任何HTML(甚至不添加clearfix)。
- 雅罗努。如果内容有阴影,您将遇到问题(请参阅更新的演示)。如果试图溢出容器,overflow:hidden将剪切阴影。这里,:after或附加元素clearfix解决方案更好。
- @约瑟夫德雷默说得对:),我刚才提到它是为了让人们在可能的时候使用它——在大多数情况下。不管怎样,谢谢你的澄清
- 主要是,如果我使用"inline block",并且我知道我的目标浏览器都支持它——我不需要"clearfix",对吧?
- 你的第一句话有误导性。"非浮动元素环绕浮动元素"——只有文本环绕浮动元素,而不是任何非浮动元素。由于看不到浮动元素(超出文档流),因此div将像往常一样从页面左侧开始。
当一个元素,如div是floated时,它的父容器不再考虑它的高度,即。
默认情况下,父容器的高度将不为40像素。如果您使用这些容器来构造布局,这会导致许多奇怪的小怪癖。
因此,各种框架使用的clearfix类通过使父容器"承认"所包含的元素来解决这个问题。
每天,我通常只使用960GS、Twitter引导等框架来进行布局,而不必费心于具体的机制。
可以在这里阅读更多信息
http://www.webtoolkit.info/css-clearfix.html
clearfix与overflow:hidden相同。两个元素都是父元素的清晰浮动子元素,但clearfix不会切断溢出到其parent的元素。它也适用于上面的IE8&;中。
不需要在content&;clearfix中定义"."。就这样写:
1 2 3 4 5
| .clr:after {
clear: both;
content:"";
display: block;
} |
HTML
阅读这些链接了解更多信息
http://css-tricks.com/snippets/css/clear-fix/,
"clearfix"的方法有哪些?