高度坍塌、BFC、圣杯布局

高度坍塌原因及其解决方式

高度坍塌的原因

  • 原因: 在文档流中,父元素的高度默认是被子元素撑开,也就是子元素多高父元素多高。但当将子元素设置浮动后,而父元素没有设置高度,子元素将完全脱离文档流,导致子元素无法将父元素撑开,导致父元素高度坍塌,而因为父元素高度坍塌,父元素以下的元素就会向上移,导致页面混乱。

解决办法

  • html代码
<div class="body clearfix">
    <div class="content">Lorem ipsum dolor sit.</div>
    <div class="content">Error quidem labore animi.</div>
    <div class="content">Sunt nemo veniam quidem.</div>
    <div class="content">Facilis similique nesciunt at?</div>
    <div class="content">Minus, pariatur? Ab, nemo.</div>
</div>
  • 为每个元素设置基础样式
.body{
    
    
        background-color: lightblue;
}
.body .content{
    
    
    width: 100px;
    height: 100px;
    background-color: green;
    float: left;
}
  • 当给类名为content的元素设置float:leftfloat:right时,外层div将会出现高度坍塌。
  1. 给父元素设置after伪类(万能消除法)
.clearfix::after{
    
    
    content: "";
    clear: both;
    display: block;
}
.body{
    
    
    width: 100%;
    background-color: lightblue;
}
.body .content{
    
    
    width: 100px;
    height: 100px;
    background-color: green;
    float: left;
}
  • 为外层div的最后添加一个元素,将其display设置为block,内容设为,将其clear属性设置为both,清除浮动。
  1. 给父元素直接设置高度
.body{
    
    
    width: 100%;
    background-color: lightblue;
    height: 100px;
}
.body .content{
    
    
    width: 100px;
    height: 100px;
    background-color: green;
    float: left;
}
  • 直接给父元素设置高度,高度固定,只适合高度固定的布局,不推荐使用。
  1. 使用overflowzoom来清除浮动
.body{
    
    
    width: 100%;
    background-color: lightblue;
    overflow: hidden;/*或overflow:auto;*/
    zoom: 1;/*针对IE6浏览器的兼容*/
}
.body .content{
    
    
    width: 100px;
    height: 100px;
    background-color: green;
    float: left;
}
  • overflow属性规定当内容溢出元素框时发生的事情。
  • overflow:hidden实际上就创建了一个块级格式化上下文(BFC)
  • 只有block-level box参与BFC
  • block-level box指的是display 属性为 block, list-item, table 的元素,会生成 block-level box。
  • BFC布局规则
    1)内部的Box会在垂直方向,一个接一个地放置。
    2)Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
    3)每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
    4)BFC的区域不会与float box重叠。
    5)BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
    6)计算BFC的高度时,浮动元素也参与计算
  • 而此处当设置overflow:hidden(hidden不为visible时),触发BFC机制,计算BFC的高度时,浮动元素也参与计算。
  1. 将父元素浮动起来
.body{
    
    
    width: 100%;
    background-color: lightblue;
    float: left;
}
.body .content{
    
    
    width: 100px;
    height: 100px;
    background-color: green;
    float: left;
}
  • 该方法虽然可以解决高度坍塌的问题,但是会对后续布局产生影响,不推荐使用。

BFC

  • BFC(Block formatting context)块级格式化上下文
  • 只有Block-level box参与
  • 其规定了Block-level box中如何布局
  • 且这个区域与外部区域毫不相干

Box(盒子)

  • css布局的对象和基本单位,一个页面由多个box组成,而元素的类型和display属性决定了box的类型。
  • block-level box: display 属性为 block, list-item, table 的元素,会生成 block-level box 。并且参与BFC
  • inline-level box: display 属性为 inline, inline-block, inline-table 的元素,会生成 inline-level box。并且参与 inline formatting context(IFC)

Formatting Context(格式化上下文)

  • 定义的是页面中的一块渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。
  • 常见有block formatting context(BFC)inline formatting context(IFC)

BFC布局规则

BFC布局规则

  • 内部的Box会在垂直方向,一个接一个地放置。
  • Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
  • 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
  • BFC的区域不会与float box重叠。
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
  • 计算BFC的高度时,浮动元素也参与计算

如何触发BFC

  • 根元素或其它包含它的元素
  • 非块级元素具有 display: inline-block,table-cell, table-caption, flex, inline-flex
  • 块级元素具有overflow ,且值不是 visible
  • 浮动(float不为none)
  • 绝对定位的元素

BFC作用

  • 清除浮动
  • 解决外边距合并的问题
  • 布局:自适应两栏布局

圣杯布局

圣杯布局的要求

  • header和footer各自占领屏幕所有宽度,高度固定。
  • 中间的container是一个三栏布局。
  • 三栏布局两侧宽度固定不变,中间部分自动填充整个区域。
  • 中间部分的高度是三栏中最高的区域的高度。

圣杯布局的优点

  • 页面在加载时,先加载中间的主体部分

圣杯布局代码

HTML代码

<header class="header">header</header>
    <div class="container">
        <div class="middle">middle</div>
        <div class="left">left</div>
        <div class="right">right</div>
    </div>
<footer class="footer">footer</footer>

CSS代码

.header{
    
    
        background-color: lightgray;
        height: 80px;
        width: 100%;
    }/*头部基础样式*/
.footer{
    
    
        background-color: lightgray;
        height: 80px;
        width: 100%;
        bottom: 0;
        clear: both;
    }/*清除浮动*/
.container{
    
    
        padding-left: 150px;
        padding-right: 150px;
    }/*为left,right预留位置*/
.middle{
    
    
        width: 100%;
        height: 600px;
        float: left;
        background-color: lightgreen;
    }/*设置左浮动*/
.left{
    
    
        width: 150px;
        height: 600px;
        float: left;
        background-color: lightpink;
        margin-left: -100%;
        position: relative;
        right: 150px;
    }/*把元素放入预留的位置*/
.right{
    
    
        width: 150px;
        height: 600px;
        float: left;
        background-color: lightpink;
        margin-right: -100%;
    }

猜你喜欢

转载自blog.csdn.net/fyrrr/article/details/110941787