clearfix
在很多开发过程中,常常会用到浮动流来弥补标准流布局所难以实现或者不合适的缺陷。但如果一味地使用浮动流进行布局,其产生的副作用足够大之时,就难免会遇到一些“尴尬”和棘手的问题。
什么是清除浮动?
在非 IE 浏览器(如 Chrome)下,当容器的高度为auto
,且容器的内容中有浮动(即css配置有float:left
或right
)的元素,在这种情况下,容器的高度不会自动伸长以适应内容的高度,所以里面的内容溢出到容器外面而影响(甚至破坏)布局,这个现象称为浮动溢出。
为了避免这个现象的发生,消除其带来的负面影响而进行的一些CSS处理,称为清除浮动。
为什么要清除浮动?
可以很简洁地说,清除浮动就是为了清除浮动元素产生的不良影响。
浮动带来的负面影响
1、背景无法显示
由于浮动的设置,如果对父级设置了CSS 背景 background
、CSS背景颜色或CSS背景图片,则父级元素将不能被撑开,所以导致CSS背景不能显示。
2、边框无法撑开
如果父级设置了CSS边框 border
属性,由于子级里使用了float属性,产生浮动,父级不能被撑开,导致边框不能随内容而被撑开。
3、margin
、padding
设置值无法正确显示
由于浮动的设置,导致父级子级之间设置了 margin
或 padding
属性的值不能正确表达。特别是上下边的padding和margin不能正确显示。
举些例子:
1. 块状元素钻到浮动元素底面,被其所覆盖:
2. 浮动元素的父元素坍缩:
上面说的不够详细,这里再举个实际的例子:
有2个p,各个p
里都有3个写有文字的p
标签,完成初始化配置后是这个样子的:
代码:
<style>
.box1{
background-color:green;
}
.box2{
background-color:yellow;
}
.box1>p{
background-color:red;
}
.box2>p{
background-color:blue;
}
</style>
<p class="box1">
<p>hello world!</p>
<p>Hello world!</p>
<p>Hello world!</p>
</p>
<p class="box2">
<p>Hello world!</p>
<p>Hello world!</p>
<p>Hello world!</p>
</p>
效果如图:
还没完,这只是开始。现在,要求将2个p
里的p
都左浮动显示。
p{
float: left;
}
本以为应是这样:
结果却是这样的:
Whhhhat the … ?
像产生这种难看的效果全因布局没做对,之前使用了左浮动float:left
产生的负面影响没有消除。还好,我们有以下几种不错的方法可以解决这个问题。
清除浮动的方法
给父元素设置一定的高度
height
<style> .box1{ height: 100px; } .box2{ height: 100px; }
效果如下:
将背景颜色除去,效果就正如我们想要的那样。
但是,这种方法太过僵硬,一般在开发过程中不建议自设高度。
使用CSS的
clear
属性clear 属性规定元素的哪一侧不允许其他浮动元素。
clear可能的值:
left
在左侧不允许浮动元素。right
在右侧不允许浮动元素。both
在左右两侧均不允许浮动元素。none
默认值。允许浮动元素出现在两侧。inherit
规定应该从父元素继承 clear 属性的值。使用“隔墙法”
所谓“隔墙法”是指在元素里面或外面添加一堵“墙”,即块元素,通过对其配置一定的CSS属性,以达到清除浮动的目的。
隔墙法又分为两种:
A. 外墙法:在元素与元素之间新增一个块元素,并设置clear属性。
<style> .clearfix{ clear: both; } </style> <p class="box1"> ... </p> <p class="clearfix"> </p> <p class="box2"> ... </p>
然而需要注意的是,位于新增的块元素(“墙”)前面的元素无法使用
margin-bottom
,而后面的元素却可使用margin-top
。这里不作演示,留给大家自己尝试吧!B. 内墙法:在父元素里的所有子元素之后新增一个块元素(即父元素的last-child),并设置clear属性。
<style> .clearfix{ clear: both; } </style> <p class="box1"> <p>Hello world!</p> <p>Hello world!</p> <p>Hello world!</p> <p class="clearfix"></p> </p> <p class="box2"> ... </p>
幸运的是,这个方法可以使位于新增的块元素(“墙”)前面的元素使用
margin-bottom
,后面的元素也可使用margin-top
。这里也不作演示,留给大家自己尝试吧!虽然隔墙法可以很好的实现清除浮动,但也带来不好的一点:增加了额外多余的标签。
使用
:after
伪元素对使用了浮动流的元素进行
:after
配置,常见的典型的代码段如下:<style> .box1{ ... } .box1:after{ content: ""; /*内容设置为空!!!*/ display: block; /*显示为块级元素!!!*/ height: 0; visibility: hidden; clear: both; /*清除浮动!!!*/ } </style>
p.s. 以上注释部分的代码为必须,一般情况下,通过3行代码
content: ""; display: block; clear: both;
便可实现。效果也正如上面的内墙法一样:
需要注意的是,如果在IE6和IE7浏览器上使用,则需给clearfix添加一条属性以触发
haslayout
。<style> .box1:after{ ... zoom: 1; } </style>
这个方法所能体现的优点:1. 避免了多余标签的使用; 2. 可以兼容大部分浏览器。
使用
overflow
属性通过给浮动元素添加
overflow
属性并设置为hidden
或者auto
即可清除浮动。<style> .box1{ ... overflow: hidden; } </style>
Or
<style> .box1{ ... overflow: auto; } </style>
效果也如上面一样:
另外,在 IE6 中还需要触发 hasLayout ,需要为父元素设置容器宽高或添加
zoom:1
。给父元素设置
display: table
虽然也可以解决浮动问题,但缺点亦随之而来:盒模型属性已经改变,由此产生一系列烦人的问题,得不偿失,不推荐使用。
扩展 & 延伸
以上几种方法并没有按照比较严谨的技术规范进行分类。只是为了方便大家使用,根据方法的优越度和优先度来阐述,这样大可便于在不同的场合采用比较合适的方法去解决实际的问题。因此没有多做复杂的说明。
其实,所谓的清除浮动的方法可以分为两类:
- 清除浮动:清除对应的单词是 clear,对应CSS中的属性是 clear:left | right | both | none;
- 闭合浮动:更确切的含义是使浮动元素闭合,从而减少浮动带来的影响。其中涉及的原理有:hasLayout 和 Block formatting contexts 。
详情请点击这里进行跳转查阅。
相关阅读
从上自下 background: -webkit-linear-gradient(red, blue); /* Safari 5.1 - 6.0 */ background: -o-linear-gradient(red
说到精灵图(雪碧图),大家肯定和我一样觉得这个很新鲜。在学习了有关精灵图(雪碧图)的一些知识后,就来和大家讨论一下,我个人对精灵图(雪
html代码 <p class="inner"> <p class="innerbox"> <p style="height:200px;">这是内容111</p> <p style="
Qt基础——获取QGraphicsScene的缩略图即导出到图片
是应用了他的render函数,render的作用是: [cpp] view plain copy Renders the source rect from scene into target, u
哈,前一阵子一个比较要好的朋友过生日,就给她做了一个网站作为生日祝福。也花了挺多的时间去复习了抛弃了有一段时间的HTML和CSS,