什么是clearfix (一文搞清楚css清除浮动clearfix)


Posted in HTML / CSS onMay 21, 2023

 什么是 clearfix ?

clearfix 是一种 CSS 技巧,可以在不添加新的 html 标签的前提下,解决让父元素包含浮动的子元素的问题。这个技巧的版本是很多的,最流行的一个是 Micro Clearfix Hack 。这个也是 Bootstrap 采用的方案(可以 google 一下 “bootstrap clearfix” 来查看详情)。

Micro Clearfix Hack 的作者给出的原始方案,内容如下:

/**
 * For modern browsers
 * 1. The space content is one way to avoid an Opera bug when the
 *    contenteditable attribute is included anywhere else in the document.
 *    Otherwise it causes space to appear at the top and bottom of elements
 *    that are clearfixed.
 * 2. The use of `table` rather than `block` is only necessary if using
 *    `:before` to contain the top-margins of child elements.
 */
.cf:before,
.cf:after {
    content: " "; /* 1 */
    display: table; /* 2 */
}

.cf:after {
    clear: both;
}

/**
 * For IE 6/7 only
 * Include this rule to trigger hasLayout and contain floats.
 */
.cf {
    *zoom: 1;
}

但是我的习惯是支持到 IE9+ ,同时习惯了用 “ clearfix ” 作为 class 名,所有稍微修改后的版本如下:

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

.clearfix:after {
    clear: both;
}

百度用的代码

.clearfix:after{content:'\20';display:block;height:0;clear:both}
.clearfix{zoom:1}
.clear{clear:both;height:0;line-height:0;font-size:0;visibility:hidden;overflow:hidden}

三水点靠木用的

.clear{clear: both;overflow: hidden;line-height: 0;height: 0;zoom:1}
.clear:after {display: block; height: 0px; visibility: hidden; clear: both; content: ""}
.clearfix{ *zoom:1;}
.clearfix:before,	
.clearfix:after {content: ".";display: block;height: 0;overflow: hidden;visibility: hidden;}
.clearfix:after{clear: both}

用了这个方法很长时间之后,都觉得上面的代码就是天书,尤其是对 display: table 这一行不理解。其实,这些代码为的是解决两个实际中经常遇到,而且非常让人恼火的问题。问题搞清楚了,代码也就明白了。

自清除子元素浮动

  • 先说第一个问题和解决方案。

  • div 布局的一个非常让新手头疼的问题就是,如果一个父元素中包含若干个子元素,那么当给所有的子元素都设置了浮动( e.g float: left ),那么父元素的高度就会为0。

比如有这样的 html 代码:

<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
</div>

如果子元素没有浮动,那么显示是这样的:

什么是clearfix (一文搞清楚css清除浮动clearfix)

但是一旦所有子元素都浮动了,那么父元素的高度变为0,就成了这样的恶心效果:

什么是clearfix (一文搞清楚css清除浮动clearfix)

解决方法如下:

html 中添加 clearfix

<div class="container clearfix">
  <div class="item">1</div>
  <div class="item">2</div>
</div>

如果只是解决这个问题,那么下面的代码就够了。

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

但是注意,文章开始的代码中使用 display: table 而不是这里的 display: block ,可以同样解决这个问题。但是,下面这个问题中使用 display: table 就是必须的了。

Margin Collapse 外边距重叠问题

再来说第二个问题。

外边距重叠也是一个很让人讨厌的问题。来描述一下症状。

container 之中包含一个 item 子元素,代码如下

<div class="container">
  <div class="item">
    item
  </div>
</div>

比如默认显示成这样:

什么是clearfix (一文搞清楚css清除浮动clearfix)

这时,我给 item 加了 margin-top: 30px ,本来这时候我期待的结果是,item 块本身应该距离 container 青色区域的上边界 30px 。同时一个副作用是青色区域应该拉高 30px 。但是实际上得到的却是下面的效果:

什么是clearfix (一文搞清楚css清除浮动clearfix)

造成这个的原因是,父子元素的 margin-top 是会重叠的,即使是像上面的情况中,父元素 container 自身 margin-top 为 0 的情况下也一样。这样造成的一个现象就是父元素“包不住”子元素的 margin-top ,溢出了。类似的问题也会发生在 margin-bottom 身上。

要解决这个问题,就要给 container 添加 clearfix ,html 代码如下

<div class="container clearfix">
  <div class="item">
    item
  </div>
</div>

如果只是针对这一种问题,最简单的 clearfix 实现是这样:

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

注意,display: table 换成 dispaly: block 是不行的。

效果图

什么是clearfix (一文搞清楚css清除浮动clearfix)

完整测试代码脚本的家专门提供

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
<style>
.header{margin:0 auto;width:660px;color:white;font-size:18px;text-align:center;background-color:#fa1698;width:660px;height:70px;line-height:70px}
.container{margin:0 auto;width:660px;color:white;font-size:18px;text-align:center;background-color:#1a8081;}
.item{background-color:#fa653e;width:70px;height:70px;line-height:70px;margin-top: 30px}
.clearfix:before,
.clearfix:after
{
 content: " ";
 display: table;
}
.clearfix{zoom:1}
.clear{clear:both;height:0;line-height:0;font-size:0;visibility:hidden;overflow:hidden}
    </style>
</head>
<body style="text-align:center;">
<div class="header">
header
</div>
<div class="container clearfix">
  <div class="item">
    item
  </div>
</div>
</body>
</html>

当然,外边距重叠不局限于上面的父子元素之间,也会发生在兄弟元素之间,甚至是一个高度为 0 的元素,自己的上下边距也会重叠,这个就是 MDN Margin Collapse 文档上给出的全部三种情况,但是后两种在实际开发中不会带来很大麻烦,也不是咱们的 clearfix 方法所关心的。

结语

上面两个问题的解决代码合并到一起,就是文章最初 Peter 给出的 clearfix 代码了。 有了这个方法,当给子元素添加浮动或者是 margin 的时候,父元素的行为就非常符合正常的预期了,开发页面布局变得非常简单,所以 clearfix 方法对于按照 div 的 block 模型排版是非常有用的。

下面分享一段当前比较常用的代码

.clearfix:after{content:'\20';display:block;height:0;clear:both}
.clearfix{zoom:1}
.clear{clear:both;height:0;line-height:0;font-size:0;visibility:hidden;overflow:hidden}

但是,顺便提一下,未来 flexbox 会大行其道,flexbox 模型的特点是,不用 float ,并且子元素的 margin 也不会和父元素重叠。

到此这篇关于什么是clearfix (一文搞清楚css清除浮动clearfix)的文章就介绍到这了,更多相关什么是clearfix内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
CSS去掉A标签(链接)虚线框的方法
Apr 01 HTML / CSS
用css3写出气球样式的示例代码
Sep 11 HTML / CSS
html5+CSS3+JS实现七夕言情功能代码
Aug 28 HTML / CSS
HTML5新表单元素_动力节点Java学院整理
Jul 12 HTML / CSS
关于前端上传文件全面基础扫盲贴(入门)
Aug 01 HTML / CSS
使用html5+css3来实现slider切换效果告别javascript+css
Jan 08 HTML / CSS
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
Mar 25 HTML / CSS
HTML5移动端开发中的Viewport标签及相关CSS用法解析
Apr 15 HTML / CSS
使用数据结构给女朋友写个Html5走迷宫游戏
Nov 26 HTML / CSS
CSS3实现的水平标题菜单
Apr 14 HTML / CSS
html粘性页脚的具体使用
Jan 18 HTML / CSS
CSS font-variation 可变字体的魅力(实例详解)
Mar 03 HTML / CSS
css清除浮动clearfix:after的用法详解(附完整代码)
May 21 #HTML / CSS
浅谈css清除浮动(clearfix和clear)的用法
May 21 #HTML / CSS
clear 万能清除浮动(clearfix:after)
May 21 #HTML / CSS
css之clearfix的用法深入理解(必看篇)
May 21 #HTML / CSS
CSS中calc(100%-100px)不加空格不生效
May 07 #HTML / CSS
HTML中link标签属性的具体用法
May 07 #HTML / CSS
css弧边选项卡的项目实践
May 07 #HTML / CSS
You might like
ajax完美实现两个网页 分页功能的实例代码
2013/04/16 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
JS页面延迟执行一些方法(整理)
2013/11/11 Javascript
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
JavaScript中switch语句的用法详解
2015/06/03 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
jquery实现的淡入淡出下拉菜单效果
2015/08/25 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)
2018/07/26 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
解决vue项目获取dom元素宽高总是不准确问题
2020/07/29 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python difflib模块示例讲解
2017/09/13 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
浅谈matplotlib.pyplot与axes的关系
2020/03/06 Python
python实现简单坦克大战
2020/03/27 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
美国性感内衣店:Yandy
2018/06/12 全球购物
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
应届大专毕业生个人自荐信
2013/09/22 职场文书
培训专员岗位职责
2014/02/26 职场文书
元宵晚会主持词
2014/03/25 职场文书
珍惜时间演讲稿
2014/05/14 职场文书
保险专业求职信
2014/07/07 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书