由清除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解 ...
随机推荐
- Dynamics Crm2011 Removes an option from an Option Set control
应用场景:OptionSet中有N个option值,特定的条件下需要去除某些option的显示,例如在某个条件下我要红框中的两个option不显示 var purchasetype= Xrm.Page ...
- Android OnLowMemory和OnTrimMemory
1.OnLowMemory 是Android提供的API,在系统内存不足,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,系统会调用OnLowMemory. 系统提 ...
- C++容器学习,与结构体排序和set来一场邂逅
最近学习C++容器,积累一下.下面介绍set和multiset,并使用sort对结构体进行排序.C++之路漫漫其修远兮! 一.对结构体进行排序 // sort_struct.cpp : 定义控制台应用 ...
- LeetCode之“数组”:Rotate Array
题目链接 题目要求: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, ...
- windows的服务中的登录身份本地系统账户、本地服务账户和网络服务账户修改
以一个redis服务为例: 一个redis注册服务后一般是网络服务账户,但是当系统不存在网络服务账户时,就会导致redis服务无法正常启动.接下来修改redis服务的登录身份. cmd下输入如下命令: ...
- 安卓笔记-- ListView点击和长按监听
其中点击监听为setOnItemClickListener() 具体实现代码如下 listView.setOnItemClickListener(new AdapterView.OnItemClick ...
- The 16th tip of DB Query Analyzer
The 16th tip of DB Query Analyzer ---- SQL Schedule will be executed even DBMS h ...
- unix重定向标记
stdin ,0,< << stdout,1,> >> stderr,2,2> 2>> 将stdout和stderr输出到同一个文件: > ...
- 译文:ovs+dpdk中的“vHost User NUMA感知”特性
本文描述了"vHost User NUMA感知"的概念,该特性的测试表现,以及该特性为ovs+dpdk带来的性能提升.本文的目标受众是那些希望了解ovs+dpdk底层细节的人,如果 ...
- 白瑜庆:知乎基于Kubernetes的kafka平台的设计和实现
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文首发在云+社区,未经许可,不得转载. 自我介绍 我是知乎的技术中台工程师,现在是负责知乎的存储相关组件.我的分享主要基于三个,一个是简单 ...