clearfix为什么用display:table,而不用display:block

我们都知道clearfix一般这么写:

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

但是为嘛用 display:table哪? 我用display:block好像也是显示很正常,也能清除浮动。

曾经也搜索过这个问题,感觉都讲得糊里糊涂的还是我水平太低了,反正我是看不懂他们想要表达啥意思,也不给例子,好了,废话不多说, 看结果吧:

https://fiddle.jshell.net/mtc6wb43/

网上讲得一堆什么使父容器形成BFC,什么防止margin塌陷。但是不给例子,我怎么搞都不会塌陷。 我本来是这样测试的:

https://fiddle.jshell.net/mtc6wb43/1/

看到没,我用:block,margin很正常并没有塌陷啊? 后来才发现,其实margin要在一个 没有浮动的标签上,才会发生塌陷。所以 display:table就是为了解决这个 问题的。

两个都浮动的时候,并不会发生塌陷,不管你怎么测都测不出来 用block代替table有何问题。

还有为什么 要写:before呢?我去掉也是正常清除浮动啊, 一样的,也是防止margin-top的塌陷。也是要在没有浮动的标签上的时候才能测到。

其实这个对于塌陷这个词 我是存在疑问的。它并没有塌陷,它的margin还是确确实实存在的啊,只是针对外面的容器的margin了。 塌陷的意思 不就是不存在或者变小了吗?

最新浏览器(我用的是FF54测试),已经可以直接用  display: flow-root;  来清除浮动了,其效果 跟我们用的 display:table一致:

https://fiddle.jshell.net/mtc6wb43/3/

。。。。。

backup所有的测试代码:

<div class="clearfix">
<div class="fl">
TABLE
</div>
<div class="nf">
NOT FLOAT
</div>
</div>

<div class="clearfix block">
<div class="fl">
BLOCK
</div>
<div class="nf">
NOT FLOAT
</div>
</div>

<div class="flow-root">
<div class="fl">
Flow root
</div>
<div class="nf">
NOT FLOAT
</div>
</div>

  

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

.clearfix.block:before,.clearfix.block:after {
  display: block;
}

.clearfix {
  background: red;
}
.clearfix.block {
  margin-top: 20px;
  background: green;
}

.fl {
  float:left;
}
.nf {
  margin:100px;
}

.flow-root {
  display: flow-root;
  background: orange;
}

  

时间: 2025-01-16 23:55:06

clearfix为什么用display:table,而不用display:block的相关文章

基于display:table的CSS布局

当IE8发布时,它将支持很多新的CSS display属性值,包括与表格相关的属性值:table.table-row和table-cell,它也是最后一款支持这些属性值的主流浏览器.它标志着复杂CSS布局技术的结束,同时也给了HTML表格布局致命一击.最终,使用CSS布局来制作出类似于table布局的栅格将会变得十分迅速和简单.网页元素应用上那些与表格相关的display属性值后,能够模仿出与表格相同的特性.我将会在该文中给大家演示这种方法给CSS布局带来的巨大影响. 使用CSS表格 CSS表格

CSS display:table属性用法- 轻松实现了三栏等高布局

display:table:此元素会作为块级表格来显示(类似 <table>); display:table-cell属性指让标签元素以表格单元格的形式呈现,类似于td标签.目前IE8+以及其他现代浏览器都是支持此属性的,但是IE6/7只能对你说sorry了,这一事实也是大大制约了display:table-cell属性在实际项目中的应用,但是现在是移动端的天下了,ie 说拜拜吧~ 与其他一些display属性类似,table-cell同样会被其他一些CSS属性破坏,例如float, posi

基于CSS属性display:table的表格布局的使用

项目改造中遇到DIV+CSS实现的table,新需求需要在表格使用单元格合并,网上调查返现CSS display:table实现的table表格,没有单元格的属性和样式,经过一番思考,曲折现实了单元格的合并,即采用正行嵌套一个单独的display:table的DIV,然后在嵌套的表格DIV内部通过控制行列数和行列的高度,实现单元格合并.个人建议全新实现使用<table> HTML标签即可 一.CSS display属性的表格布局相关属性的解释: table    此元素会作为块级表格来显示(类

安卓下H5弹窗display:table的bug

表单以弹窗的形式弹出时,若设置了表单的div:display:table下,安卓打开页面输入法的时候,表单顶到屏幕顶部之后,再也无法上滑,键盘遮住了下面的输入框.在ios下,一切显示正常,因为iOS会自动将输入框居中到显示的区域,那么这种情况下怎么办呢? 解决方案:将display:table改成display:block,然后再将表单居中即可

css Table布局-display:table

使用表格布局一直是一个敏感的主题.一般情况下,Web开发人员考虑基于表格布局是禁忌.尽管反对的理由看起来证据很充分,但是大多数开发者除了谴责基于表格的布局,都无法提供完善的使用场景."表格不好." 从早期反对HTML Table(<table>标签)开始这种势头就非常强劲.几代开发者被成功洗脑,根深蒂固的认为:任何使用表格都是邪恶的. 诚然,我也是避免使用表格布局的开发者之一,即使是显示表格数据. 我甚至曾经斥责我的下属开发者同事,当他们使用 display:table 用

display:table、box和width百分比来均分盒子的比较

box box适合均分内部子盒子没有边框的父盒子,否则内部盒子的边框重叠问题不太好处理,另外如果自盒子间有margin值,中间的margin会是两侧的double,这时可通过nth-child(index)来进行个别调整. box-flex是对除开子盒子内容区.定宽子盒子之外的剩余部分进行划分,而不是把父盒子的整个宽度进行划分,因此就会造成所有子盒子都设置为box-flex:1,但因为子盒子内容多少不一而造成不能均分. box的特点 1.当父元素设置为display:box后,内部的自盒子无论是

使用display:table使两栏布局高度相等

两栏布局大家应该经常用了,但是遇到坑爹的要两栏的高度对齐的话要怎么办呢? 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 6 <title>Examples</titl

display: table; 100%的宽度

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style> * { margin: 0; padding: 0; } .box1 { display: table; } .box2 { display: table-cell; border: 1px solid #000; } .box3 { width: 1

display:table表格合并单元格

直接上代码: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@include file="/commons/include/html_doctype.html" %> <html> <head> <title>补贴项目属性管理</t