经典CSS缺陷--margin塌陷问题和margin合并问题

margin塌陷问题

问题描述:
在文档流中,父元素的高度默认是被子元素撑开的
也就是说 子元素有多高,父元素就有多高
但是当子元素设置浮动之后,子元素会完全脱离文档流
此时将会导致子元素无法撑开父元素的高度,导致父元素高度塌陷

代码示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>margin塌陷</title>
    <style type="text/css">     
        .parent{
            border: 10px red solid;
        }

        .child{
            background-color: yellow;
            width: 100px;
            height: 100px;
            float: left;
        }
    </style>
</head>
<body>
    <div class="parent">
        <div class="child"></div>
    </div>
</body>
</html>

网页效果:下图为元素脱离文档流的结果


当我们注释掉浮动属性的时候


我们可以得到想要的效果


  

 如上图所示,由于父元素高度塌陷,子元素想要通过margin-top向下移动,可是失败了,即使我们调试的时候通过在父元素添加border-top也无济于事。如果margin-top超过一定限度就会带着父级一起向下移动。

解决方案:

(一)页面中元素都有一个隐藏的属性--Block Formatting Content块级格式化上下文(简称BFC)

/* 我们这里简单说一下BFC
具有bfc的元素我们可以抽象的理解成为隔离了的独立容器
那这个隐藏的属性我们如何触发(开启)呢?
方法:
满足下面任一条件即可
浮动元素   float属性值为除了none以外的值
绝对定位元素 position 为 absolute、fixed

    • display 为inline-blocks,table-cells,table-captions
overflow 为 hidden,auto,scroll
bfc的三个特性:
a.阻止外边距折叠
b.可以包含浮动的元素
c.可以阻止元素被浮动元素覆盖 */

正文继续

所以只需要在父级元素上加一个overflow:hidden就可以,其他如上条件之一,如果情况合适均可。

(二)给父级元素添加一个边框,就可以解决;如果不希望看到边框,可以将边框的颜色设成背景色即可。


margin合并问题

问题描述:
处于上下位置关系的两个div容器,在通过margin-top、margin-bottom改变间距时,如果两个属性的值相同时,则两容器间的距离就是这个值;如果两个属性的值不同,则取较大值作为两容器间的距离;
如下图所示,两容器间距本来应该是上容器的margin-bottom值+下容器的margin-top值
但现实是两容器间距等于margin-bottom和margin-top两者中的最大值



这类bug不必解决,只需要调节最大值达到要求即可。

但也存在着解决方法,那就是在两容器外都套上相同容器(class/id相同的),并在容器中设定overflow:hidden。


***************************************************************************************************************

文章结束~  撒花✿✿ヽ(°▽°)ノ✿~



































评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值