深入理解margin属性

百分比margin的计算规则
  • 普通元素的百分比margin都是相对于容器的宽度计算的
<div style="width:600px;height:200px;">
    <img src="1.jpg" style="margin:10%">
</div>

计算之后水平方向的margin和垂直方向的margin都是60px

  • 绝对定位元素的百分比margin是相对于第一个定位祖先元素(relative/absolute/fixed)的宽度计算的
<div style="width:600px;height:200px;">
    <img src="1.jpg" style="margin:10%;position:absolute">
</div>

计算之后水平方向的margin和垂直方向的margin都是102.4px,因为是根据第一个定位祖先元素计算的

css的margin重叠

margin重叠通常特性

  • block水平元素,不包括float和absolute元素
  • 不考虑writing-mode,只发生在垂直方向(margin-top和margin-bottom)

margin重叠的3种情况

1. 相邻的兄弟元素

     p{
        line-height: 2em;
        margin:1em 0;
        background: #ccc;
     }
     <p>第一行</p>
     <p>第二行</p>

这里写图片描述
第一行的margin-bottom和第二行的margin-top重叠,因此两个行之间只有1em的距离,并不是2em

2. 父级和第一个/最后一个子元素

.father{
    background: #ccc;
 }
<div class="father">
    <div class="son" style="margin-top: 80px;">我是son</div>
</div>

这里写图片描述
在子元素上添加margin-top:80px,并没有将父元素撑开,从效果图看,相当于直接在父元素上添加margin-top:80px,也相当于在子元素和父元素上都添加margin-top:80px,而这两个产生了重叠

父子margin重叠其他条件

margin-top重叠

  • 父元素非块状格式化上下文元素(overflow:hidden)
  • 父元素没有border-top设置
  • 父元素没有padding-top值
  • 父元素和第一个子元素之间没有inline元素分(&nbsp;

margin-bottom重叠

  • 父元素非块状格式化上下文元素
  • 父元素没有border-bottom设置
  • 父元素没有padding-bottom设置
  • 父元素和最后一个子元素之间没有inline元素分隔
  • 父元素没有min-height、height、max-height限制

3. 空的block元素

.father{
    background: #ccc;
    overflow:hidden;
 }
 .son{
    margin:1em 0;
}
<div class="father">
    <div class="son" ></div>
</div>

这里写图片描述
空block元素只有图中的高度,从margin:1em 0;看子元素应该有上下外边距加起来2em,但是实际只有1em。

空block 元素margin重叠其他条件

  • 元素没有border设置
  • 元素没有padding设置
  • 里面没有inline元素
  • 没有height,或者min-height

margin重叠计算规则
1、正正取大值
2、正负值相加
3、负负最负值
相邻重叠绝对值最大的负值
父子重叠绝对值最大的负值自身重叠

css的margin:auto

元素如果没有设置width或height,会自动填充容器。
如果设置了width或height,自动填充就会被覆盖,此时的margin值是0px。
原本应该填充的尺寸被 width、height强制变更,而margin:auto就是为了填充这个变更的尺寸设计的。

div{
    width:100px;
    margin:0 auto;/*左右均auto,居中显示*/
}

图片为何不居中???

img{
    width:200px;
    margin:0 auto;
}

因为此时图片是inline水平,就算没有width,也不会占据整个容器。

img{
    displayblock;
    width:200px;
    margin:0 auto;
}

此时图片是block水平,就算没有width,也会占据整个容器(不能一行显示)

无法垂直居中???

.father{
    height:200px;
    background:#ccc;
}
.son{
    height:100px;
    width:500px;
    background:#c00;
    margin:auto
}

这里写图片描述
水平方向能居中,但垂直方向无法居中。
假设.son没有设置高度height:100px,高度会自动200px高吗?—NO

writing-mode与垂直居中

.father{
    height:200px;
    width:100%;
    background:#ccc;
    writing-mode:vertical-lr;
}
.son{
    height:100px;
    width:500px;
    background:#c00;
    margin:auto
}

writing-mode会把文档流改为垂直方向,所以可以实现垂直居中,但是水平居中会失效。

绝对定位元素的margin:auto居中

.father{
    height:200px;
    background:#ccc;
    position:relative;
}
.son{
    position:absolute;/*没有width、height,absolute元素自动填满容器*/
    top:0;
    right:0;
    bottom:0;
    left:0
}
//给绝对定位元素设置width,height,会限制absolute元素自动填满容器
.son{
    position:absolute;
    width:500px;
    height:100px;
    top:0;
    right:0;
    bottom:0;
    left:0;
    margin:auto;/* 此方法只适用于IE8+*/
}

css margin负值定位

  • margin负值下的两端对齐–margin改变元素尺寸
  • margin负值下的等高布局margin-bottom:-600px;padding-bottom:600px;
  • margin负值下的两栏自适应布局

margin无效情形分析

  • inline水平元素的垂直margin无效
    两个前提:
    1、非替换元素,不是<img>元素
    2、正常书写模式
  • margin重叠
  • display:table-cell/table-row等声明的margin无效
  • 绝对定位元素非定位方向上的margin无效(实际是起作用的,是一直有效)
  • 内联特性导致margin无效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值