由清除float原理到BFC
关于浮动
设置为浮动的元素会脱离当前文档流,向左或向右移动直到边缘遇到另一个浮动元素或者到达边界。普通元素不会对齐造成影响。
浮动是把双刃剑,在给我们的布局带来便利的同时有一些缺点需要我们去解决。例如最常见的父元素塌陷。如下图所示:
.warper{
width: 200px;
border:1px solid #ff6633;
}
.float-1{
float: left;
background: blue;
height: 100px;
width: 100px;
}
.float-2{
float: left;
background: #ff0;
height: 50px;
width: 100px;
}
//html
<div class='warper'>
<div class="float-1"></div>
<div class="float-2"></div>
</div>
可以看到父元素的高度为0,为了解决这种状况就要清除浮动了。
清楚浮动的方式
总结了一下,大致有如下几类:
- 结尾空元素或者after等伪元素或者br 来clear
- 父元素同样浮动
- 父元素设置overflow为hidden或者auto
- 父元素display:table
大致归类,可以分为两大类,1使用clear的属性,后面的可以归为一类,都是通过触发BFC来实现的。
下面详细看一下这两大类清除浮动的方式及原理。
clear属性
clear 属性规定元素盒子的边不能和浮动元素相邻。该属性只能影响使用清除的元素本身,不能影响其他元素。
换而言之,如果已经存在浮动元素的话,那么该元素就不会像原本元素一样受其影响了。
第一种方式里我们的填补元素(我自己的称呼),就是起这种作用。
//这里当然可以换成一个空的div,<br/>等,原理和效果都是一致的
.warper:after {
content: '';
height: 0;
display: block;
clear: both;
}
此时after伪元素设置clear:both之后表明,我两边都不能接受浮动元素,原本受浮动元素影响,伪元素的位置在浮动元素下方如图:
这样显然也不能撑起父元素的高度。设置之后,需要重新安排安排了。既然两边都不接受浮动元素,但浮动元素位置也确定了,那只能把伪元素放在下边,如图:
可以看到,伪元素的位置在最下方了,距顶部的高度为float元素的高度,顺带撑起了父元素的高度。同样适用其他填充元素(display为block),都能达到相同的目的。
在看后面几种原理之前我们需要先看一下BFC的定义。
BFC
块级格式化上下文:BFC(block formatting contexts)
照本宣科的定义看起来可能不大好理解,BFC是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Block-level Box如何布局,并且与这个区域外部毫不相干。
借用张鑫旭大大的一句话,BFC元素特性表现原则就是,内部子元素再怎么翻江倒海,翻云覆雨都不会影响外部的元素。所以,避免margin穿透啊,清除浮动什么的也好理解了。
正如下面的解释:
In a block formatting context, each box’s left outer edge touches the left edge of the containing block (for right-to-left formatting, right edges touch). This is true even in the presence of floats (although a box’s line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats)
在BFC中,每个盒子的左外边框紧挨着包含块的左边框(从右到左的格式,则为紧挨右边框)。
即使存在浮动也是这样的(尽管一个盒子的边框会由于浮动而收缩),除非这个盒子的内部创建了一个新的BFC浮动,盒子本身将会变得更窄)。
BFC的特性
- 块级格式化上下文会阻止外边距叠加
- 块级格式化上下文不会重叠浮动元素
- 块级格式化上下文通常可以包含浮动
换句话说创建了 BFC的元素就是一个独立的盒子,里面的子元素不会在布局上影响外面的元素,反之亦然.
同时BFC任然属于文档中的普通流。所以呢浮动也就解决了,关于BFC以后要专门搞个文章仔细研究一下。
看到这里就可以知道了,为什么可以拿来清除浮动了
表现为BFC的元素都是一个十分个性的存在,无论里面怎么折腾,对外表现始终如一。
大家肯定可以猜到,上面几种利用了BFC的清除方式肯定是触发了BFC的条件,让父元素变为BFC。我们来看一下触发BFC的条件,看是不是如我们所想。
BFC触发条件
CSS3里面对这个规范做了改动,称之为:flow root,并且对触发条件进行了进一步说明。
float 除了none以外的值
overflow 除了visible 以外的值(hidden,auto,scroll )
display (table-cell,table-caption,inline-block)
position(absolute,fixed)
fieldset元素
由上面可以对比一下,我们提到那几种方法,就是触发了BFC而已。
看个例子
.warper{
width: 200px;
border:1px solid #ff6633;
// 下面属性任选其一
overflow: hidden;
overflow: auto;
float: left;
display:inline-block;
position: fixed;
}
结束语
参考文章
CSS深入理解流体特性和BFC特性下多栏自适应布局
理解CSS中BFC
到这里清除float相关的内容就说完了,知其然更要知其所以然,清除float的方式繁多无比,掌握其中原理才能不人云亦云。当然抛砖引玉,更多的是共同学习共同进步,更多请移步博客。
由清除float原理到BFC的更多相关文章
- 【转】CSS清除浮动_清除float浮动
CSS清除浮动方法集合 一.浮动产生原因 一般浮动是什么情况呢?一般是一个盒子里使用了CSS float浮动属性,导致父级对象盒子不能被撑开,这样CSS float浮动就产生了. 浮动产生样式效果截图 ...
- CSS清除浮动_清除float浮动
2.clear:both清除浮动为了统一样式,我们新建一个样式选择器CSS命名为“.clear”,并且对应选择器样式为“clear:both”,然后我们在父级“</div>”结束前加此di ...
- CSS清除float浮动
一.浮动产生原因 - TOP 一般浮动是什么情况呢?一般是一个盒子里使用了CSS float浮动属性,导致父级对象盒子不能被撑开,这样CSS float浮动就产生了. 本来两个黑色对象盒子是在 ...
- css 清除float的方法
首先我们要理解这个flaot 为什么要清除,作为小白来说直接颠覆了我之前学的内容,因为之前学的东西虽然碰到float后,脱离文档流后给兄弟元素或者父元素造成影响,但是都是通过option来定位 要么绝 ...
- CSS清除浮动_清除float浮——详解overflow:hidden 与clear:both属性
最近刚好碰到这个问题,看完这个就明白了.写的很好,所以转载了! CSS清除浮动_清除float浮动 CSS清除浮动方法集合 一.浮动产生原因 - TOP 一般浮动是什么情况呢?一般是一个盒子里 ...
- overflow:hidden清除浮动原理解析及清除浮动常用方法总结
最近在看<CSS Mastery>这本书,里面有用overflow:hidden来清理浮动的方法.但是一直想不明白为什么能够实现清除浮动,查阅了网络上的解释,下面来总结一下. 一.首先来想 ...
- ::after::before清除浮动原理
先来看一段代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- CSS 之 清除 float 常用的方法
大多数前端使用.clearfix:after{ .....} 和 .clearit{....}的组合来清除浮动. 前端开发经常用到浮动 float:left; float:right; 有浮动就需要 ...
- 清除float影响
条件: 父元素中有子元素float的话,可能就会影响父元素的高度,从而影响布局: 解决方案: 1.直接给父元素定高: 弊端:必须知道父元素的高: 2. 父元素使用overflow属性值为hidden解 ...
随机推荐
- 解决UIScrollView,UIImageView等控件不能响应touch事件的问题
关于UIScrollView,UIImageView等控件不能响应touch事件,主要涉及到事件响应者链的问题,如果在UIScrollView,UIImageView等控件添加了子View,这样事件响 ...
- php 命令空间总结
本文移到:http://www.phpgay.com/Article/detail/classid/2/id/53.html 1.命名空间的语法: <?php namespace 名称; ?&g ...
- HTML5 全屏 API
翻译人员: 铁锚 原文日期: 2013年12月23日 翻译日期: 2013年12月29日 原文链接: Fullscreen API 在越来越真实的web应用程序中,JavaScript也变得越来越给力 ...
- Android系统修改硬件设备访问权限
Android系统修改硬件设备访问权限 在硬件抽象层模块文件(so)文件中,提供的函数调用open函数来打开设备文件,比如/dev/gpio,如果不修改设备文件/dev/gpio的访问权限,那么应用程 ...
- STL - set和multiset
set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实现, ...
- HBase写数据
1 多HTable并发写 创建多个HTable客户端用于写操作,提高写数据的吞吐量,一个例子: static final Configuration conf = HBaseConfiguration ...
- gdb学习(一)[第二版]
概述 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点可以是条件表达式) ...
- java注解及在butternife中的实践和原理
1. 背景 之前去一个公司,说到了java的注解,问java的注解有几种方式,然后我提到了android中的butternife和afinal注解工具,我们知道butternife在6.1版本的时候 ...
- 如何来看单片机外设A/D转换器ADC0804时序图
如图,为单片机AD转换器的一种: ADC0804单片集成A/D转换器.它采用CMOS工艺20引脚集成芯片,分辩率为8位,转换时间为100µs,输入电压范围为0-5V.芯片内具有三态输出数据锁存器,可直 ...
- C语言之选择排序
选择法排序是相对好理解的排序算法.假设要对含有n个数的序列进行升序排列,算法步骤是: 1.从数组存放的n个数中找出最小数的下标(算法见下面的"求最值"),然后将最小数与第1个数交换 ...