margin塌陷、浮动模型问题及其解决方案

一、margin塌陷(外边距重叠)问题的分类

类型一:父子嵌套
.farther{
    width:400px;
    height:400px;
    background: #00FFFF;
    margin-top: 20px;
  }  
.son{
    width:200px;
    height:200px;
    background: #FE2EF7;
    margin-top: 40px;
}

我们对一对嵌套的盒子作如上样式设置,我们期望父级上边距为20px;子元素上边距为40px;实际上,父元素和子元素的上边距都变成了40px。

结论:当一个块级元素包含在另一个块级元素之中时,子元素与父元素之间也会产生重叠现象,重叠后的外边距取其中最大者。

Ps:margin重叠时margin值计算方法:

  • 全部都为正值,取最大者;
  • 不全是正值,直接相加;
  • 无正值,取小。

针对类型一:触发父级BFC(Block Formatting Context ),改变父级的渲染规则

  • float的属性不是none;
  • overflow的属性不是visible;
  • position:absolute / fixed;
  • display:inline-block / table-cells / table-caption.

解决方案各有优缺点,例如:overflow:hidden; 溢出部分隐藏 但溢出部分有用时,不能用这个方法 在解决这个问题时要根据实际情况进行选取。哪个不影响用哪个*

类型二
.box1{
    width:200px;
    height:200px;
    background: #00FFFF;
    margin-bottom: 40px;
  }  
.box2{
    width:200px;
    height:200px;
    background: #FE2EF7;
    margin-top: 20px;
}

      在css中对垂直相邻块级元素作如上样式设置,我们期望的间距是60px,实际上,它们之间的距离只有40px。

结论:两个垂直相邻的块级元素,当上下两个边距相遇时,起外边距会产生重叠现象,且重叠后的外边距,等于其中较大者。

针对类型二:

  • 我们可以在设置边距时只设置一个边距来解决。

浮动模型

当盒子设置float:left/right就变成浮动元素。这些元素站队边界是父级边界。

.father{
    border: 5px solid black;
    width: 300px;
  }  
.son1{
    border: 5px solid #f66;
    width: 100px;
    height: 100px;
    float: left;

}
.son2{
    border: 5px solid #f66;
    width:100px;
    height: 100px;
    float: left;
}

效果图:这里写图片描述

原因: 浮动元素产生浮动流,所有产生浮动流的元素,块级元素看不到它们,但产生了bfc的元素和文本元素类属性(inline)以及文本都能看到浮动元素。

解决方案:清除浮动流

  • 最后一个子元素添加
p{
clear:both;
}
  • 伪元素清除浮动:
.father::after {
    content: '';
    display: block;
    clear: both;
}

解释一下为什么要用display:block?
clear 很特殊,想让他生效,必须是块级元素才可以,而::after 是行级元素

  • 触发父级BFC
    内部把元素转换成inline-block,让父级元素可以“看到”浮动元素,从而解决问题。
    这里写图片描述

补充

1.行级元素,也叫内联元素 inline

特点

  • 内容决定元素所占位置
  • 不可以通过 CSS 改变宽高

例 span,strong,em,a,del等
span 自带隐藏属性 display:inline; 可以通过改成 block 变成块级元素

2.块级元素,block

特点

  • 独占一行
  • 可以通过 CSS 改变宽高

例 div、p、h1…h6、ol、ul、dl、table、address、blockquote、form等

3. 行级块元素 inline-block

特点

  • 内容决定大小
  • 可以改变宽高

例: img、input
我们可以通过 display 更改元素属性

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值