CSS BFC学习笔记

BFC,全称是Block Formatting Context,块级格式化上下文。

具体是什么,可以理解为页面元素的一种特性,触发了BFC的元素往往会产生一些对初学者而言意想不到的效果。

触发BFC的方法有下面几种,满足其中任意一种就能触发BFC:

  • 浮动元素(float除了none以外任意值)
  • 绝对定位元素(position为absolute或fixed)
  • display为inline-block或table-cell或table-caption
  • overflow为除了visible以外的其他值(hidden、auto或scroll)

那么BFC有哪些特点呢,为什么要触发BFC呢? 先从几种现象说起吧。

一、外边距合并

有以下结构的html

<div>
    <p>这是一个段落</p>
</div>
<div>
    <p>这是一个段落</p>
</div>

CSS 如下

        body{
            margin: 0;
        }
        div{
            background-color: #2595e5;
            margin: 10px 0 10px;
        }
        p{
            background-color: #ff9900;
            margin: 10px 0 10px;
        }

产生效果:

代码里给div和p都加上了上下边距,但是产生的结果来看好像p标签的上下边距并没有生效,而且在垂直方向上,div的边距只有10px而不是两个10px,这其实是因为他们产生了外边距重叠。

简单地说,外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。

如何避免这种效果的发生呢,这将引出BFC的第一个特性:

阻止和子元素发生外边距折叠

给div加上overflow:hidden属性,即触发BFC的第四个条件:

        div{
            background-color: #2595e5;
            margin: 10px 0 10px;
            /*触发BFC*/
            overflow: hidden;
        }

再看效果

由此可见,触发了BFC的元素,不和它的子元素发生外边距折叠。

二、高度塌陷

在使用浮动的时候,经常会出现这种情况:

<div class="outer">
    <div class="inner"></div>
</div>

CSS:

        body{
            margin: 0;
        }
        .outer{
            background-color: #2595e5;
            border: 1px solid #f00;
        }
        .inner{
            background-color: #ff9900;
            width: 50px;
            height: 50px;
            float: left;
        }

效果:

可以看到outer的高度是0,并没有算上内部浮动的inner,这种现象称之为高度塌陷。

BFC将能解决这个问题,这就是BFC的第二个特性:

包含浮动元素

同样的给outer加上overflow:

        .outer{
            background-color: #2595e5;
            border: 1px solid #f00;
            /*触发BFC*/
            overflow: hidden;
        }

产生效果:

三、元素被浮动元素覆盖

这个问题同样出现在有浮动元素的时候:

<div class="left"></div>
<div class="right"></div>

CSS:

        body{
            margin: 0;
        }
        .left{
            width: 50px;
            height: 50px;
            background-color: #2595e5;
            float: left;
        }
        .right{
            background-color: #ff9900;
            width: 100px;
            height: 100px;
        }

产生效果:

可以看到,浮动的元素覆盖在了其相邻元素上,解决这个问题将引出BFC的第三个特性:

阻止元素被浮动元素覆盖

对right添加overflow属性:

        .right{
            background-color: #ff9900;
            width: 100px;
            height: 100px;
            /*触发BFC*/
            overflow: hidden;
        }

效果:

这个感觉跟给right也加了float: left一样,因为使用float: left同样会触发BFC(第一个条件)

当然这个情况只出现在两个元素宽度之和不大于父元素宽度的时候,不然right会换行。

总结

总结一下,触发了BFC的元素将具有以下特点:

  1. 阻止和子元素外边距折叠
  2. 包含浮动元素
  3. 阻止元素被浮动元素覆盖

最后需要说明的是IE7以下浏览器中并不支持BFC,而是有其特有的hasLayout,它和BFC很相似,但产生了很多问题。触发hasLayout的方式之一是使用zoom: 1,所以使用的时候最好加上zoom: 1,保证兼容性。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 10:06:24

CSS BFC学习笔记的相关文章

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

HTML&CSS基础学习笔记13—无序列表

无序列表 有时我们的工作繁忙,杂事很多,怕忘记,就会把事情一件件列出来,防止忘记. 它们的排列顺序对于我们来说并不重要,可以随意调换,我们将它称为无序列表,HTML里用<ul>标签来表示无序列表,列表里的项目则用<li>标签来表示: 1 2 3 4 5 <ul>     <li></li>     <li></li>     ... </ul> 看一段实例代码: 对于的浏览器显示结果是这样的: 更多内容学习,请

HTML&CSS基础学习笔记15-合并单元格

合并单元格 之前的文章中,我们已经能够创建一个简单地表格了,如果我们需要把横向的某两个相邻单元格<td>或者纵向的某两个相邻单元格<td>合并,我们该怎么做呢?我们要知道的知识点如下: 1.标签<td>的[colspan]属性规定单元格可横跨的列数,即横向合并的单元格数: 2.标签<td>的[rowspan] 属性规定单元格可横跨的行数,即纵向合并的单元格数: 3.这2个标签也可以同时使用. 样式示例: 现在就来试试合并单元格吧: <!DOCTYPE 

根据兄弟元素的数量来设置样式(CSS揭秘学习笔记)

CSS揭秘学习笔记 li.length == 4 li:first-child:nth-last-child(4), li:first-child:nth-last-child(4) ~ li { /* 当列表正好包含四项时,命中所有列表项 */ } li.length >= 4 li:first-child:nth-last-child(n+4), li:first-child:nth-last-child(n+4) ~ li { /* 当列表至少包含四项时,命中所有列表项 */ } li.l

HTML&CSS基础学习笔记7-高亮文本及组合使用

HTML提供了<mark>标签可以让你的文本高亮,这样看起来更加醒目.<mark>标签内的文本会呈现特殊的样式,它和<em>,<strong>一样也是一个带有语义的标签. 代码如下: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>高亮文本</title><

HTML&CSS基础学习笔记4-定义文档类型

定义HTML的文档类型 Web 世界中存在许多不同的文档.只有了解文档的类型,浏览器才能正确地显示文档. HTML 也有多个不同的版本,只有完全明白页面中使用的确切 HTML 版本,浏览器才能完全正确地显示出 HTML 页面.这就是 <!DOCTYPE> 的用处. <!DOCTYPE> 声明不是 HTML 标签,它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令.是一种标准通用标记语言的文档类型声明,它的目的是要告诉标准通用置标语言解析器,它应该使用什么样的文档

HTML&CSS基础学习笔记14—有序列表及列表嵌套

我们上篇讲到了无序列表,那么今天就来看看有序列表和他们的组合嵌套使用吧. 有序列表 现在我们要做那堆杂事了,但是发现这么多杂事,先做哪个好呢?于是我们给这堆杂事弄个优先级排序,让我们能够按照顺序做下去.HTML里用<ol>标签来表示有序列表,<ol>标签的列表项依然是用<li>标签表示. 它的代码模板是这样的: <span style="font-family:Microsoft YaHei;"><ol>       <

HTML&CSS基础学习笔记3-HTML的标签语法

HTML标签语法 1. 标签由英文尖括号<和>括起来,如<html>就是一个标签. 2. HTML中的标签一般都是成对出现的,分开始标签和结束标签.结束标签比开始标签多了一个/.如: <p></p> 3.标签的内容是开始标签与结束标签之间的内容,如:<h1>这是标题</h1>. 4. 标签与标签之间是可以嵌套的,但先后顺序必须保持一致,如:<div>里嵌套<p>,那么</p>必须放在</div

css 选择器 (学习笔记)

参考 http://zachary-guo.iteye.com/blog/605116 1. div+p  选择紧接在 <div> 元素之后的所有 <p> 元素.解释 : find p , p.prev = div 就ok! 2. [class~=flower] 选择 title 属性包含单词 "flower" 的所有元素.解释 : 注意是单词哦 class="abc xyz" abc这个算一个单词 3. [lang|=en] 选择 lang