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

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

要了解清除浮动的原理,首先我们要了解BFC这个名词。

BFC(Block Fomatting Context)

BFC,翻译过来就是”块级格式化上下文”。它有三个特性:

  1. BFC会阻止垂直外边距(margin-top、margin-bottom)的重叠。当元素同属于一个BFC时,两个元素才可能发生垂直外边距的重叠。
  2. BFC不会重叠浮动元素。
  3. BFC可以包含浮动。

了解了上面的三个特性之后,那我们就可以利用BFC的第三条特性来清除浮动。这里说清除浮动并不是更合适,应该说包含浮动,也就是父容器变成BFC就可以了。那如何形成BFC呢,有如下方法。

  1. 根元素
  2. float为 left 或 right
  3. overflow为 hidden|auto|scroll
  4. display为 table-cell|table-caption|inline-block|flex|inline-flex
  5. position为 absolute|fixed

因此,我们可以为浮动元素的父容器添加上面这些属性来形成BFC达到清除浮动的效果。但上面所有这些方法都有局限性,我们不可能为所有的父容器都添加float属性(虽然现实中确实有网页是这么做的);overflow属性会影响滚动条和绝对定位元素;diaplay很多属性低版本IE并不支持(珍爱生命,远离IE);position影响元素的定位,会出现我们不想要的效果。

hasLayout

我们知道在IE6、7有个hasLayout的概念,很多bug的源头正是它。

  • 当元素的hasLayout属性值为flase的时候,元素的尺寸和位置由其最近的祖先元素控制。
  • 当元素的hasLayout属性值为true的时候会达到和BFC类似的效果,元素负责自身及其子元素的尺寸的定位。

我们可以利用这点在IE6、7下完成清除浮动,首先我们要先看看如何使元素hasLayout为true。

  • position: absolute
  • float: left|right
  • display: inline-block
  • width: 除auto外
  • height: 除auto外
  • zoom: 除normal外
  • 在IE7中使用overflow: hidden|auto|scroll 也可以

BFC清除浮动

综上,我们就可以得出利用BFC清除浮动的方法:

 1 .clearfix{
 2    *zoom:1;
 3 }
 4 .clearfix:after{
 5     content:".";
 6     display:block;
 7     height:0;
 8     visibility:hidden;
 9     clear:left;
10 }

1 .clearfix{
2     *zoom:1;
3 }
4 .clearfix:after{
5     content:"";
6     display:table;
7     clear:both;
8 }

上面就是得出的两种浏览器兼容的方案。总之,清除浮动就两种方式

  1. 利用 clear 属性,清除浮动
  2. 使父容器形成BFC

今天,我们谈的是第二种的方法背后的原理,至于第一种是不涉及的。

时间: 2024-10-24 22:21:11

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

前端学习笔记 清除浮动

这里有个例子 <!DOCTYPE html> <html> <head> <title>test </title> <meta charset="utf-8"> </head> <body> <style> #div1{ width:100px; height:100px; background: red; float:left; } #div2{ width:500px; he

html+css学习笔记 3[浮动]

inline-block/float(浮动) 回顾:inline-block 特性:      1.块在一排显示 2.内联支持宽高 3.默认内容撑开宽度 4.标签之间的换行间隙被解析(问题) 5.ie6 ie7不支持块属性标签的inline-block(问题) float浮动: 1.块在一排显示     2.内联支持宽高     3.默认内容撑开宽度      4.脱离文档流     5.提升层级半层 文本流 float:left | right | none | inherit; 文档流是文档

Java IO学习笔记:概念与原理

Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了流,然后将这些流还可以写到另外的目的地(文件.内存.控制台.网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同部分. 二.分类 流的分类,Java的流分类比较丰富,刚接触的人看了后会感觉很晕.流分类的方式很多: 1.按照输入的方向分,输入流和输出流,输入输出的参照对象是Java程序. 2.

C++学习笔记34 模版的原理

模版在C++中具有非常重要的地位,STL就是大量运用模版写出来的. 模版的优点我就不一一列举了.这里我只说一下模版的原理. 当编译器遇到模版方法定义的时候,编译器进行语法检查,但是并不会编译模版.编译器无法编译模版定义,因为编译器不知道要使用的类型是什么,编译器不知道x和y的类型的情况下无法为x=y这样的语句生成代码. 当编译器遇到一个实例化的模版的时候,例如vector<int> vi(这里我只是拿vector举例,实际上基本类型的vector代码好像会自动存在编译器中),编译器会将模版类定

清除浮动的原理剖析

常用的清除浮动的几种方法总结下: 1,手动设置一个标签(在浮动元素下方),然后对其设置clear属性 2,给浮动元素设置 :after伪类,创建块元素,设置clear属性 3,给父元素设置浮动 4,给父元素设置overflow设置非visible值(auto,hidden) 5,给父元素的display设置为table-cell 7,在ie6,7中,设置zoom或者width,height来触发haslayout,使父元素包含浮动元素 原理剖析: 1,2方法之所以可以成功,是因为了clear属性

CSS学习笔记08 浮动

从CSS学习笔记05 display属性一文中,我们知道div是块元素,会独占一行,即使div的宽度很小,像下面这样 应用display属性的inline属性可以让div与div共享一行,除了这种方法外,还有没有其他方法可以实现这种效果呢,答案是肯定的,那就是下面要介绍的CSS的浮动特性,浮动从字面意思上来看,就是浮起来,动起来,那么是谁浮起来,又是谁动起来呢?往下看,很快就会知道答案了. 元素的浮动是指设置了浮动属性的元素会脱离标准文档流的控制,漂浮在标准流之上.元素浮动后,虽然脱离标准流,但

css清除浮动的原理

最近学习css发现了高度塌陷时候要清除浮动,为了理解清楚浮动原理,网上找了不少资料,发现都写的不是很清楚,而且都是一模一样的内容,我在里分享一下我对清楚浮动原理的理解, 如果你已经很了解什么是浮动和浮动的效果你可以直接跳转到三.如何清除浮动(重点)阅读 一.什么是浮动首先我们需要知道定位 元素在页面中的位置就是定位,解决问题之前我们先来了解下几种定位方式 1.普通流定位 static(默认方式)  普通流定位,又称为文档流定位,是页面元素的默认定位方式  页面中的块级元素:按照从上到下的方式逐个

Css学习之清除浮动的方法详解

本文和大家分享的主要是css中浮动清除相关内容,一起来看看吧,希望对大家学习css http://www.maiziedu.com/course/web/有所帮助. 当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素,在这种情况下,容器的高度不能自动伸长以适应内容的高度,使得内容溢出到容器外面而影响(甚至破坏)布局的现象.这个现象叫浮动溢出,为了防止这个现象的出现而进行的CSS处理,就叫CSS清除浮动. #div { background-color: blu

css-浮动与清除浮动的原理详解(清除浮动的原理你知道吗)

float元素A的特点: 脱离文档流 靠向left或right float元素会和块盒子重叠 准确来说,是块盒子和A重叠,但块盒子内容会浮动在A周围 不会和inline元素重叠 <div class="parent"> <div class="box"></div> <p> 孟子曰:"君子有三乐,而王天下不与存焉.父母俱存,兄弟无故①,一乐也:仰不愧于天,俯不怍②于人,二乐也:得天下英才而教育之,三乐也.君子