一周一章前端书·第24周:《HTML与CSS进阶教程》S02E11(完)

第14章:重要概念

14.1 containing block(包含块)

14.1.1 什么是包含块

  • 简单来说,包含块就是“包含自己的那块元素”,元素的“包含块”决定了元素的大小和定位。
  • “包含块”是一个相对的概念,并不是说父级元素就是包含块。比如说,绝对布局中,父级元素是position:relative;,子级元素是position:absolute;,那么此时父级元素是子级元素的包含块,自己元素的大小和定位由父级元素决定;但positioin:fixed固定定位元素的包含块是浏览器窗口。

14.1.2 包含块的判断以及范围

根元素的包含块
  • <html>根元素是页面最顶端的元素,它没有父元素,但也有包含块,叫做“初始包含块initial containing block”。
固定元素的包含块
  • 如果元素是固定定位position:fixed,那么它的包含块是当前的可视窗口(即当前浏览器窗口)。
静态/相对定位元素的包含块
  • 如果元素是静态或相对定位position:static/relative,那它的包含块是最近的块级(display:blockdisplay:inline-blockdisplay:table-cell)祖先元素。
绝对定位元素的包含块
  • 如果元素是绝对定位position:absolute,那么它的包含块是最近的position属性值为非static的祖先元素,该祖先元素可以是块元素也可以是行内元素。
  • 如果元素找不到position属性值为非static的祖先元素,那么它的包含块就是<html>根元素,这就是为什么在默认情况下,绝对定位元素是相对于浏览器窗口来定位的原因。
包含块的范围
  • 包含块的范围分为两种情况:
    • 如果祖先元素是块元素,那么包含块的范围由祖先元素的padding edge(内边距的边界)形成;
    • 如果祖先元素是行内元素,那么包含块的范围由祖先元素的direction(方向)属性来决定;

14.2 BFC和IFC

14.2.1 基本概念

  • 页面的任何元素都可以看成是一个盒子(box),盒子分两种类型:块盒子(block-level box)和行内盒子(inline-level box)。

说明:除了块盒子(block-level box)和行内盒子(inline-level box)之外,CSS3还增加了一个run-in box盒子。

  • 不同的元素和元素的display属性决定盒子的类型。不同的盒子类型,会根据自己的格式上下文(formatting context)作为渲染规则:
    • 块盒子(block-level box),即display属性为blocktablelist-item的元素,参与块级格式上下文(Block Formatting Context,简称BFC);
    • 行内盒子(inline-level box),即display属性为inlineinline-blockinline-table的元素,参与行级格式上下文(Inline Formatting Context,简称IFC);

14.2.2 什么是BFC

  • BFCBlock Formatting Context(块级格式上下文),是块盒子(block-level box)的渲染规则,它是块盒子内部的一个独立渲染区域,这个区域规定了盒子内部如何布局,并且这个区域具有封闭性,与外部区域毫不相关。
创建BFC
  • 根据W3C标准对BFC的定义,具备以下任意条件的元素会创建一个新的BFC:
    • 根元素;
    • float:left/right的浮动元素;
    • position:absolute/fixed的定位元素;
    • display属性值为inline-blocktable-captiontable-cell的块元素;
    • overflow:auto/hidden/scroll的元素;

注意:display:block/table的元素会参与BFC,但不会创建BFC。

BFC的特点
  • 根据W3C标准,总结BFC的渲染规则如下:
    • BFC内部,元素沿垂直方向逐个排列;
    • BFC内部,垂直相邻的两个元素的间距由margin属性来决定,且margin-topmargin-bottom会叠加;
    • BFC内部,元素的左外边界(margin-left)紧贴容器的左边(border-left),即便是浮动元素也是如此;
    • BFC是页面中一个隔离的盒子,BFC内部的子元素不会影响到外面的元素;
    • 计算一个BFC的高度时,其内部的浮动元素高度也会参与计算;

14.2.3 BFC的用途

  • 创建BFC来避免垂直外边距叠加
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .wrapper{
                width: 200px;
                border: 1px dashed gray;
                /*为wrapper创建BFC*/
                overflow: hidden;
            }
            
            /*为B创建BFC*/
            #bfc-box{
                overflow: hidden;
            }
            
            #A,#B{
                height: 60px;
                line-height: 60px;
                text-align: center;
                font-size: 30px;
                color-interpolation: #000;
                background-color: purple;
            }
            
            #A{
                margin-bottom: 20px;
            }
            
            #B{
                margin-top: 30px;
            }
        </style>
    </head>
    <body>
        <div class="wrapper">
            <!-- A处于为wrapper的BFC -->
            <div id="A"></div>
            <!-- B处于为bfc-box的BFC -->
            <div id="bfc-box">
                <div id="B"></div>
            </div>
        </div>
    </body>
</html>
  • 创建BFC来清除浮动
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>创建BFC清除包含的浮动</title>
        <style type="text/css">
            .wrapper{
                width: 200px;
                border: 1px dashed gray;
                /*由于父容器没定义高度,会造成父容器高度塌陷,通过创建BFC解决,因为BFC在计算自身高度时会把子元素的高度计算进去*/
                overflow: hidden;
            }
            
            #first,#second{
                width: 80px;
                height: 40px;
                border: 1px solid brown;
            }
            
            #first{
                float: left;
            }
            
            #second{
                float: right;
            }
        </style>
    </head>
    <body>
        <div class="wrapper">
            <div id="first"></div>
            <div id="second"></div>
        </div>
    </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>创建BFC避免文字环绕</title>
        <style type="text/css">
            .wrapper{
                width: 400px;
                height: 200px;
                border: 1px solid gray;
                padding: 10px;
            }
            
            img{
                width: 40px;
                height: 40px;
                float: left;
            }
            
            #content{
                background-color: papayawhip;
                /*由于浮动的img层叠级别比普通文档流高,创建BFC后不会和同级的浮动元素重叠*/
                overflow: hidden;
            }
        </style>
    </head>
    <body>
        <div class="wrapper">
            <img src="../img/weibo.png"/>
            <div id="content">【核电站事故102岁老人拒绝避难自杀 东电被下赔偿命令】东京电力福岛第一核电站事故发生后,在福岛县饭馆村自杀的102岁男性之遗属,向东电要求精神损失费等损害赔偿的诉讼判决,已于20日在福岛地方法院进行。判决命令东电支付1520万日元(约合人民币89万元)</div>
        </div>
    </body>
</html>
  • BFC创建自适应两列布局
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            #sidebar{
                float: left;
                width: 100px;
                height: 150px;
                background-color: aliceblue;
            }
            
            #content{
                height: 200px;
                width: auto;
                background-color: #CCCCCC;
                /*创建BFC使得浮动元素不会覆盖自己*/
                overflow: hidden;
            }
        </style>
    </head>
    <body>
        <div id="sidebar"></div>
        <div id="content"></div>
    </body>
</html>

14.3 stacking content(层叠上下文)

  • 理解层叠上下文,有助于深入理解浮动和定位布局,以及深入理解z-index对元素的堆叠顺序的控制。
  • 层叠上下文包含两个概念:层叠上下文(stacking content)和层叠级别(stacking level)。

14.3.1 什么是层叠上下文

  • 如果一个元素具备以下任意一个条件(不考虑CSS3),那么该元素将创建一个新的层叠上下文:
    • 根元素<html>元素会创建“根层叠上下文”;
    • z-index属性值为非auto的定位元素 :在元素只有通过z-index属性会使创建层叠上下文;

14.3.2 什么是层叠级别

  • 有没有想过一个问题,z-index属性为一个元素创建了层叠上下文,那么该元素的背景色、浮动的子元素、定位的子元素等,谁在上谁在下,应该遵循什么样的规则来堆叠呢?而层叠级别就是针对同一个层叠上下文的层叠规则。

注意:层叠上下文和层叠级别是两个不同的概念

  • 层叠级别的优先级由高到低排序:
    • z-index值为正整数的子元素;
    • z-index值为0的子元素;
    • 普通文档流的行内盒子(inline-level box):行内元素是内容,块元素是布局容器,所以内容更重要,层叠级别也更高;
    • 浮动盒子:非定位的浮动元素;
    • 块盒子:普通文档流下的块盒子(block-level box);
    • z-index值为负整数的子元素;
    • 背景和边框:当前层叠上下文的backgroundborder属性是装饰作用,层叠级别也最低;

14.3.3 层叠上下文的特点

  • 一个元素在z轴的堆叠顺序由“层叠上下文”和“层叠级别”两个因素决定:
    • 同一个层叠上下文中,比较的是“内部元素层叠级别”,级别大的元素显示在上,级别小的元素显示在下;
    • 同一个层叠上文如果层叠级别相同,则遵循“后来者居上”原则,比如z-index值相同时,后面的元素堆叠在上面;
    • 不同的层叠上下文,比较的是“父级元素的层叠级别”;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,611评论 1 92
  • 先前在学习CSS float时,有同学提到了BFC这个词,作为求知好问的好学生,哪里不懂查哪里,那么今天就来研究一...
    这名字真不对阅读 6,412评论 3 19
  • 以下文章是我在网上收集的内容,为了记录自己的学习以及为了以后不到处找而记录下来,如果对你有用,请感谢写这些文章的前...
    DCbryant阅读 890评论 0 2
  • (注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!)(注2:更多内容请查看我的目录。) ...
    love丁酥酥阅读 1,386评论 0 0
  • relative:生成相对定位的元素,通过top,bottom,left,right的位置相对于其正常位置进行定位...
    zx9426阅读 905评论 0 2