博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
闲聊CSS之关于clearfix--清除浮动[转]
阅读量:4516 次
发布时间:2019-06-08

本文共 2985 字,大约阅读时间需要 9 分钟。

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

转载地址:http://www.imooc.com/wenda/detail/11605

闲聊CSS之关于clearfix--清除浮动

一,什么是.clearfix

你只要到Google或者Baidu随便一搜"css清除浮动",就会发现很多网站都讲到"盒子清除内部浮动时可以用到.clearfix"。

.clearfix:after {

 content: " ";
 display: block;
 clear: both;
 height: 0;
}
.clearfix {
 zoom: 1;
}
<div class="clearfix">
 <div class="floated"></div>
</div>

上面的代码就是.clearfix的定义和应用,简单的说下.clearfix的原理:

1、在IE6, 7下zoom: 1会触发hasLayout,从而使元素闭合内部的浮动。

2、在标准浏览器下,.clearfix:after这个伪类会在应用到.clearfix的元素后面插入一个clear: both的块级元素,从而达到清除浮动的作用。

<div>

 <div class="floated"></div>
</div>
<div style="clear: both"></div>

二,.clearfix的弊端

在上面的代码中可以看到,抛开IE6, 7不谈,.clearfix在标准浏览器下插入了一个clear: both的元素,这样很可能清除掉不必要的浮动。举例来说明:

<!DOCTYPE html>

<html>
<head>
 <title>Demo</title>
 <style type="text/css">
   html, body { padding: 0; margin: 0; }
   ul { margin: 0; padding: 0; } 
 
   .clearfix:after {
     content: " ";
     display: block;
     clear: both;
     height: 0;
   }
   .clearfix {
     zoom: 1;
   }
 
   .left-col {
     background: red;
     float: left;
     width: 100px;
     height: 300px;
   }
   .right-col {
     margin-left: 100px;
   }
   .menu {
     border: 1px solid #000;
   }
   .menu li {
     float: left;
     display: block;
     padding: 0 1em;
     margin: 0 1em 0 0;
     background: #ccc;
   }
   .placeholder {
     background: yellow;
     height: 400px;
   }
 </style>
</head>
<body>
 <div class="left-col">
 </div>
 <div class="right-col">
   <ul class="menu">
     <li>Menu Item</li>
     <li>Menu Item</li>
     <li>Menu Item</li>
     <li>Menu Item</li>
     <li>Menu Item</li>
     <li>Menu Item</li>
   </ul>
   <div class="placeholder"></div>
 </div>
</body>
</html>

上面的代码构成一个两列布局的页面。注意.menu这个菜单设置了边框,但是由于.menu的li元素是左浮动的,导致.menu没有高度,于是可以用.clearfix来清除.menu内部的浮动。代码如下:

<ul class="menu clearfix">

 <li>Menu Item</li>
 <li>Menu Item</li>
 <li>Menu Item</li>
 <li>Menu Item</li>
 <li>Menu Item</li>
 <li>Menu Item</li>
</ul>

但是应用完.clearfix后,在标准浏览器下页面变得很乱,这是因为.clearfix:after把.left-col的浮动也给清除掉了。

三,重构.clearfix

在遭遇到上面的错误之后,分析一下除了.clearfix:after这种方式之外还有没有别的方法清除元素内部的浮动。答案是有的,在白话Block Formatting Contexts这篇文章中提到过构成Block Formatting Context的元素可以清除内部元素的浮动。那么只要使.clearfix形成Block Formatting Context就好了。构成Block Formatting Context的方法有下面几种:

float的值不为none。overflow的值不为visible。display的值为table-cell, table-caption, inline-block中的任何一个。position的值不为relative和static。

很明显,float和position不合适我们的需求。那只能从overflow或者display中选取一个。因为是应用了.clearfix和.menu的菜单极有可能是多级的,所以overflow: hidden或overflow: auto也不满足需求(会把下拉的菜单隐藏掉或者出滚动条),那么只能从display下手。

我们可以将.clearfix的display值设为table-cell, table-caption, inline-block中的任何一个,但是display: inline-block会产生多余空白,所以也排除掉。剩下的只有table-cell, table-caption,为了保证兼容可以用display: table来使.clearfix形成一个Block Formatting Context,因为display: table会产生一些匿名盒子,这些匿名盒子的其中一个(display值为table-cell)会形成Block Formatting Context。这样我们新的.clearfix就会闭合内部元素的浮动。下面是重构之后的.clearfix。

.clearfix {

 zoom: 1;
 display: table;
}

四,总结

在IE6, 7下面只要是触发了hasLayout的元素就可以清除内部浮动了。而在标准浏览器下面清除元素内部浮动的方法有很多,除了.clearfix:after这种方式,其余的方法无非就是产生新的Block Formatting Context以达到目的。如果可以做到在什么条件下用哪种方法,我认为这样就足够了......

转载于:https://www.cnblogs.com/lixiangyong/p/4783670.html

你可能感兴趣的文章
Jenkins 主题分享
查看>>
算法系列15天速成——第八天 线性表【下】
查看>>
N个小时学MM IMG设定_存货管理和盘点 <四>
查看>>
物料类型AM11没有任务清单类型N定义
查看>>
【MySQL高级特性】高性能MySQL第七章
查看>>
C++与C#交互
查看>>
【BZOJ 1018】线段树 **
查看>>
【BZOJ 4170】 4170: 极光 (CDQ分治)
查看>>
Jquery分享插件
查看>>
用 Github 建个人博客
查看>>
透明度滤镜的用法
查看>>
求次小生成树(洛谷P4180&bzoj1977)
查看>>
通过SQL语句提取存储过程中的内容
查看>>
Manacher HDOJ 3068 最长回文
查看>>
8VC Venture Cup 2016 - Elimination Round
查看>>
Mysql模糊查询like效率,以及更高效的写法(转)
查看>>
JQuery怎样返回前一页
查看>>
百度的框计算,是科幻片还是生活片?
查看>>
SQL server 2008数据库的备份与还原(转)
查看>>
用OPencv配置vs2010
查看>>