始于清除浮动、追溯到源头

  如果你喜欢用浮动来进行布局,我深信,你肯定受过浮动带来的虐心。尽管我记得在张鑫旭大哥的某篇博文里看到过,浮动,其实并不是作为一种布局的手段,然后balabala,确实言之很有理。我也曾经这么认为,我现在也是这么认为的。不过,原则上,我们应该可以有这么个底线,好用并且有完美解决问题的方法,就有存在的理由。浮动是我们在写css不可避免的。

  一、我们为什么要清除浮动

  因为一个元素浮动之后就会脱离文档流,这样使得包含它的父元素并不会因为这个浮动元素的存在而自动撑起高度,此曰”高度塌陷“。

  与此同时,一个元素设置了浮动后,会影响它的兄弟元素,具体的影响还要看兄弟元素是块级元素还是内联级元素。若块级元素辉无视这个浮动元素,导致浮动元素被覆盖,除非这些div设置了宽度,并且父元素的宽度足以包含它们,这样兄弟元素才会被强制换行;若为内联级元素,则尽可能围绕浮动元素。

  二、清除浮动的方法

  1.clear:both ---在此不再展开

  2.空div方法

<div class="box">
    <div class="main left">设置左浮动 float: left</div>
    <div style="clear: both;"></div>
    <div class="aside">我是用来看效果的</div>
</div>

  3.overflow方法

  在浮动元素的夫元素上设置了overflow的值为hidden或auto,可以闭合浮动。而在ie6中还需要触发haslayout,例如为父元素设置容器宽度或者设置zoom:1

<div class="box" style="overflow: hidden; *zoom: 1;">
    <div class="main left">设置左浮动 float: left</div>
    <div class="aside left">也设置了左浮动。</div>
</div>

  4.使用after伪元素

  注意是伪元素,不是伪类,伪元素代表一个元素之后最近的元素。这种方法可以完美兼容当前主流的各大浏览器。但是在IE下,我们需要IEhack,这里用到的IEhack就是触发haslayout。

<style>
    .clearfix {/* 触发 hasLayout */ zoom: 1; }
    .clearfix:after {content: &quot;.&quot;; display: block; height: 0; clear: both; visibility: hidden; }
</style>
<div class="box clearfix">
    <div class="main left">设置左浮动 float: left</div>
    <div class="aside left">也设置了左浮动。</div>
</div>

  三、清除浮动方法的实质----css的clear与BFC特性

  通过上面的例子,我们不难发现清除浮动的方法可以分成两类:

  一是利用 clear 属性,包括在浮动元素末尾添加一个带有 clear: both 属性的空 div 来闭合元素,其实利用 :after 伪元素的方法也是在元素末尾添加一个内容为一个点并带有 clear: both 属性的元素实现的。

  二是触发浮动元素父元素的 BFC (Block Formatting Contexts, 块级格式化上下文),使到该父元素可以包含浮动元素,关于这一点,下面 Kayo 为大家进行详细的介绍。

  BFC 在 CSS 的可视化格式模型 (Visual Formatting Model) 中具有非常重要的地位,很多开发者因为不了解 BFC 的特性而在实际开发中产生很多让人感到莫名其妙的问题。尽管如此,因为 BFC 涉及 CSS 中很少接触的部分,因此国内的相关介绍很少,这里 Kayo 展开说明一下。

  1.BFC 是什么?

  BFC (Block Formatting Contexts) 即块级格式化上下文,从样式上看,它与普通的容器没有什么区别,但是从功能上,BFC 可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素,并且 BFC 具有普通容器没有的一些特性,例如可以包含浮动元素,上面的第二类方法(如 overflow 方法)就是触发了父元素的 BFC ,使到它可以包含浮动元素,从而防止出现高度塌陷的问题。

  2.如何触发 BFC

  触发 BFC 的条件如下:

  • 浮动元素,float 除 none 以外的值
  • 绝对定位元素,position(absolute,fixed)
  • display 为以下其中之一的值 inline-blocks,table-cells,table-captions
  • overflow 除了 visible 以外的值(hidden,auto,scroll)

  在 CSS3 中,BFC 叫做 Flow Root,并增加了一些触发条件:

  • display 的 table-caption 值
  • position 的 fixed 值,其实 fixed 是 absolute 的一个子类,因此在 CSS2.1 中使用这个值也会触发 BFC ,只是在 CSS3 中更加明确了这一点。

  3.BFC 的特性

  BFC 主要有三个特性:

  (1) BFC 会阻止外边距折叠

  两个相连的 div 在垂直上的外边距会发生叠加,有些书籍会把这个情况列作 bug ,这里 Kayo 并不同意,这种折叠虽然会给不熟悉 CSS 布局的开发者带来一些不便,但实际上它具有完整且具体的折叠规则,并且在主流浏览器中都存在,因此 Kayo 更认为这应该是 CSS 的特性。当然,在实际开发中,或许我们有时会不需要这种折叠,这时可以利用 BFC 的其中一个特性——阻止外边距叠加。

  (2) BFC 可以包含浮动的元素

  这也正是上面使用 overflow: hidden 与 overflow: auto 方法闭合浮动的原理,使用 overflow: hidden 或 overflow: auto 触发浮动元素父元素的 BFC 特性,从而可以包含浮动元素,闭合浮动。

  W3C 的原文是“‘Auto‘ heights for block formatting context roots”,也就是 BFC 会根据子元素的情况自动适应高度,即使其子元素中包括浮动元素。

但是 IE6-7 并不支持 W3C 的 BFC ,而是使用自产的 hasLayout 。从表现上来说,它跟 BFC 很相似,只是 hasLayout 自身存在很多问题,导致了 IE6-7 中一系列的 bug 。触发 hasLayout 的条件与触发 BFC 有些相似,具体情况 Kayo 会另写文章介绍。这里 Kayo 推荐为元素设置 IE 特有的 CSS 属性 zoom: 1 触发 hasLayout ,zoom 用于设置或检索元素的缩放比例,值为“1”即使用元素的实际尺寸,使用 zoom: 1 既可以触发 hasLayout 又不会对元素造成其他影响,相对来说会更为方便。

  (3) BFC 可以阻止元素被浮动元素覆盖

  如上面所说,浮动元素的块状兄弟元素会无视浮动元素的位置,尽量占满一整行,这样就会被浮动元素覆盖,为该兄弟元素触发 BFC 后可以阻止这种情况的发生。

为了说明 BFC 对于清除浮动的本质,Kayo 在这里使用了较大的篇幅介绍了 BFC ,但 BFC 并不是本文要说明的中心,并且 BFC 的机制也相当复杂,因此 Kayo 会基于以上 BFC 的内容另写一篇更详细的文章介绍 BFC ,并制作 Demo 说明实际情况。

  三.清除浮动的更多方法  

  在了解了清除浮动的实际原理后,我们不难想象,清除浮动的方法并不只上面提到的三种,例如,利用 BFC 特性,还可以使用以下的方法触发 BFC 并清除浮动。

  给浮动元素的父元素添加浮动,但是这样需要一直浮动到 body ,不建议采取该方法。

  给浮动元素的父元素添加 display: table-cells ,但是这样无疑改变了盒子模型,也不建议使用。

  可以看出,以上这些方法虽然也比较方便,但同时也有很明显的缺点,这也导致了上面三种方法会更加适合实际项目中使用。

  结合语义化的要求,在实际的项目中,Kayo 建议可以使用 overflow 方法或 :after 伪元素方法。使用 overflow 方法,较为方便,在如内部元素全部为浮动元素,并且内容不会超出父元素框等情况可以直接采用 overflow 方法,但该方法毕竟会触发 BFC ,上面已经提到,BFC 的特性是有多个的,为了避免不必要的影响,如果实际需要清除浮动元素的布局比较复杂,可以直接采用 :after 伪元素方法。

   本文转自:http://kayosite.com/remove-floating-style-in-detail.html (自清除浮动的方法直接转载,头部被我加工) 如有转载,请尊重原作者,注明文章出处,thx

   

  

始于清除浮动、追溯到源头,布布扣,bubuko.com

时间: 2024-11-14 17:30:45

始于清除浮动、追溯到源头的相关文章

学习笔记:清除浮动的原理(BFC与hasLayout)

利用元素浮动来布局相信大家已经不再陌生了,但浮动会带来高度塌陷的问题(这里就不详诉了,有兴趣的朋友可以自行搜索).既然浮动会带来不好的影响,那我们就需要去解决这个问题.其实清除浮动带来的影响也就是我们常说的”清除浮动”的方法非常简单,网上随便一搜就知道了,但大部分像我这样的菜鸟都不知道背后的原理是什么.所以今天我主要是谈谈清除浮动背后的原理. 要了解清除浮动的原理,首先我们要了解BFC这个名词. BFC(Block Fomatting Context) BFC,翻译过来就是”块级格式化上下文”.

关于浮动与清除浮动

页面布局方式,主要包含:文档流.浮动层.float属性. ?html页面的标准文档流(默认布局)是:从上到下,从左到右,遇块(块级元素)换行. ?浮动层:给元素的float属性赋值后,就是脱离文档流,进行左右浮动,紧贴着父元素(默认为body文本区域)的左右边框.而此浮动元素在文档流空出的位置,由后续的(非浮动)元素填充上去:块级元素直接填充上去,若跟浮动元素的范围发生重叠,浮动元素覆盖块级元素.内联元素:有空隙就插入. ?float属性包括left(元素向左浮动).right(元素向右浮动).

关于清除浮动

晚上本来想去苹果官网看看新产品,顺便看看高大上的视频,进入之后,习惯性的打开了审查元素,然后就开始研究起了苹果的代码 看到图片列表,有这样一段: 就是下面这三行代码: .promos ul:after {  clear: both; } .promos ul:before, .promos ul:after { content: ' '; display: table; } bootstrap也是这种写法. 很显然,是用来清除浮动的,和小伙伴聊了一下,说到几个有意思的地方. 说的最多的就是dis

css 清除浮动

功能: 实现图文混排效果 原理: 绝对定位的元素脱离了文档流,而浮动元素依旧在文档流中: 清除浮动:(高度塌陷) 1. 额外标签法,<div style="clear:both;"></div>(缺点:不过这个办法会增加额外的标签使HTML结构看起来不够简洁.) 2. 使用after伪元素(该方法中必须为需要清除浮动元素的伪对象中设置 height:0,否则该元素会比实际高出若干像素) #parent{zoom: 1} #parent:after{ conten

.clearfix 清除浮动,@import

我们知道,在网页的DIV+CSS布局中,很多时候要用到浮动. 既然有浮动,那就有清除浮动. 清除浮动有很多种方式,而在实际项目中,比较常用的是这一种. .clearfix:after { content: ""; display: block; clear: both; } .clearfix { zoom: 1; } 我们可以把这部分代码复制到项目中的CSS文件中,也可以保存为一个CSS文件,然后引入. 那么怎么引入呢?这时,我们就需要用到 @import. @import url(

4.清除浮动

浮动:在非IE浏览器下,当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素,在这种情况下,容器的高度不能自动伸长以适应内容的高度,使得内容溢出到容器外面而影响(甚至破坏)布局的现象.这个现象叫浮动溢出,为了防止这个现象的出现而进行的CSS处理,就叫CSS清除浮动. 未清除浮动的情况: 清除浮动的第一种方法:使用clear属性的空元素(这里用的是div,其它均可) <!DOCTYPE html> <html lang="en">

css清除浮动的方法总结

在各种浏览器中显示效果也有可能不相同,这样让清除浮动更难了,下面总结8种清除浮动的方法,测试已通过 ie chrome firefox opera,需要的朋友可以参考下 清除浮动是每一个 web前台设计师必须掌握的机能.css清除浮动大全,共8种方法. 浮动会使当前标签产生向上浮的效果,同时会影响到前后标签.父级标签的位置及 width height 属性.而且同样的代码,在各种浏览器中显示效果也有可能不相同,这样让清除浮动更难了.解决浮动引起的问题有多种方法,但有些方法在浏览器兼容性方面还有问

前端之旅HTML与CSS篇之清除浮动塌陷

以下内容为转载. 方法1:给浮动的元素的上级添加高度如果一个元素要浮动,那么它的祖先元素一定要有高度.高度的盒子,才能关住浮动.只要浮动在一个有高度的盒子中,那么这个浮动就不会影响后面的浮动元素.所以就是清除浮动带来的影响了.所以只需要给li的上级ul或者div设置一个height:40px:(只要是浮动元素的上级元素就可以.),那么第二个div就好挤下来,在第一个盒子下面显示出来.方法2:clear:both;但是在实际开发过程当中中,高度height很少出现.为什么?因为能被内容撑高!那也就

css浮动(folat),清除浮动(clear)

css浮动(float) float是css样式,用于设置标签的居左浮动和居右浮动,浮动后的元素不属于html文档流,需要用清除浮动把文档拽回到文档流中 浮动值: left:向左浮动 right:向右浮动 html文档流:自窗体自上而下分成一行一行,并在没行中从左到右的顺序排放元素. 通过例子来解释浮动 1.页面上有两个块元素,每个块元素独占一行 2.我们希望他们能并排显示,这是就可以使用float,我们先给红色的div加float:left,发现两个是在一行了,但是他们重叠在了一起. 3.这是