margin,外边距,就是设置元素的从边框最外边缘向外(正值)或者向内(负值)的延申的距离。

margin是完全透明的,看不见的。但它是元素之间的边界

  margin的边界线是两个元素之间真正的边界线。

  元素的外部边界线就是元素的margin边界线。元素的内部边界想就是元素的padding边界线(或者说是内容区的边界线,两者重叠)

  所以,两个并列元素的边界线就是两个元素的margin边界线,父元素与子元素的边界线就是父元素内容区的边界和子元素的margin边界

margin为正值的时候比较好理解。主要说一下margin为负值的时候现象

标准文档流中,一般情况下元素是默认向左和向上流动的,直到遇到边界线。

float元素按照流向会分为向左流动或者向右流动,如果流动元素前面的元素也是流动元素且位于上一行,那么该元素也可能会向上浮动(可以看后面的浮动实例),

 元素margin负值的行为总结

先移动margin边界,然后根据元素的流向规律或者auto规律来移动和扩充元素,直到因为负值移动后的边界再次与其他元素的边界重合。

浮动元素因为margin负值移动到父元素边界外,且前一行也是浮动元素时,还会向上浮动

所有的流动元素其实都是行内块可以看作一行,只不过时超过父元素宽度时会自动换行

 

具体分析如下。

1.普通文档流,没有浮动,也没有定位(position:static 默认值)时。

效果表现一般为

当设置负值的 margin 的方向为 top 或者 left 的时候,元素会按照设置的方向移动相应的距离。

当设置负值的 margin 的方向为 bottom 或者 right 的时候,元素本身并不会移动,元素后面的其他元素会往该元素的方向移动相应的距离,并且覆盖在该元素上面。

在元素不指定宽度的情况下,如果设置 margin-left 或者 margin-right 为负值的话,会在元素对应的方向上增加其宽度。效果就和设置 padding-left 或者 padding-right 一样。

实例1

html代码

<body >
        <div id="d1">
            <div id="d2">
            </div>
        </div>
    </body>

css代码1

#d1 {
                background: green;
                border: 1px solid pink;
                width:200px;
                height: 200px;
                margin: 100px auto;
            }
            #d2 {
                background: gold;
                border: 1px solid rgb(219, 192, 255);
                width:100px;
                height: 100px;
            }

css代码1效果图

android margin 负值 margin为负_d3

 

 css代码2,d2的margin-left设为-50px

#d1 {
                background: green;
                border: 1px solid pink;
                width:200px;
                height: 200px;
                margin: 100px auto;
            }
            #d2 {
                background: gold;
                border: 1px solid rgb(219, 192, 255);
                width:100px;
                height: 100px;
                margin-left: -50px;
            }

css代码2的效果图

android margin 负值 margin为负_android margin 负值_02

     

android margin 负值 margin为负_css_03

 

 

 

 css代码2的效果图比css代码1看上去其实向左移动了50px。

这是为什么呢?

margin的负值时,是从边框的最外边向内延申的,也即是说margin-left:-50时,margin-left的边界线是位于黄色块左边框的右边的,就如右侧的图,。而子元素的真正的边界就是margin的边界线。所以黄色块的元素就会向左流动,直到遇到父元素的内边界,也就是左侧的效果图。

实例2

再举个margin-bottom为负值的例子

<body >
        <div id="d1">
            <div id="d2">
            </div>
            <div id="d3">
            </div>
        </div>
    </body>

css代码1

#d1 {
                background: green;
                border: 1px solid pink;
                width:200px;
                height: 200px;
                margin: 100px auto;
            }
            #d2 {
                background: gold;
                border: 1px solid rgb(219, 192, 255);
                width:100px;
                height: 100px;
            }
            #d3 {
                background: rgb(255, 0, 200);
                border: 1px solid rgb(219, 192, 255);
                width:50px;
                height: 50px;
            }

css代码1效果图

android margin 负值 margin为负_d3_04

css代码2, 把黄色块的div的margin-bottom设为-50px

     

android margin 负值 margin为负_d3_05

 

android margin 负值 margin为负_d3_06

把黄色块的div的margin-bottom设为-50px,为社么粉色块会上去了呢?

把黄色块的div的margin-bottom设为-50px,如右图,margin下边界线跑到黄色块下边界上方去了。

而元素之间真正的边界是元素margin的边缘线,所以下方的粉色块就会向上流动,直到遇到黄色块的margin下边界为止。

也就得到了左边的效果图。

实例3

再举一个margin-right为负值的例子

html代码

<body >
        <div id="d1">
            <div id="d2">
            </div>
        </div>
    </body>

css代码1

#d1 {
                background: green;
                border: 1px solid pink;
                width:200px;
                height: 200px;
                margin: 100px auto;
                padding: 10px;
            }
            #d2 {
                background: gold;
                border: 1px solid rgb(219, 192, 255);
                height: 100px;
                margin-bottom: -50px;
            }

css代码1效果图

android margin 负值 margin为负_d3_07

 

 css代码2,

#d1 {
                background: green;
                border: 1px solid pink;
                width:200px;
                height: 200px;
                margin: 100px auto;
                padding: 10px;
            }
            #d2 {
                background: gold;
                border: 1px solid rgb(219, 192, 255);
                height: 100px;
                margin-right: -100px;
            }

css代码2效果图

 

android margin 负值 margin为负_css_08

 

android margin 负值 margin为负_css_09

为什么设置margin-right为-100,会使黄色块加长了100px呢?

margin-right为-100px,如右图所示,margin-right的边界线就向内移动了100px。

而黄色div未设置宽度,默认就是auto,而auto就是使元素的margin边界自动填充到父元素的内容区,所以通过负值跑到里边的margin-right边界线又被自动扩充到父元素右侧内容区的边界,所以看上去就是黄色块加长了

 

 2.元素没有浮动但是定位为relative时

   和第一种情况差不多,唯一的区别是,如果产生元素重叠,那么relative元素位于上面,即使是后面的元素也一样 。

  而第一种情况是后面的元素会位于上面

 

3.元素没有浮动但是定位为absolute

由于设置绝对定位的元素已经脱离了标准文档流,所以元素margin设置负值只会对自身有影响,而不会对后面的元素有影响

效果表现为

当设置负值的 margin 的方向为 top 或者 left 的时候,元素也会按照设置的方向移动相应的距离。

设置的 margin 的方向为 bottom 或者 right

由于设置绝对定位的元素已经脱离了标准文档流,所以,设置 margin-right/bottom 对后面的元素并没有影响。

 

4.元素设置了浮动

如果设置的 margin 的方向与浮动的方向相同,那么,元素会往对应的方向移动对应的距离。

如果设置 margin 的方向与浮动的方向相反,则元素本身不动,元素之前或者之后的元素会向钙元素的方向移动相应的距离。

浮动元素不仅可以左右浮动,如果一个浮动元素的上一行也是浮动元素,则改元素通过margin-left或者margin-right负值整体移动到父元素边框以外时,就会自动向上浮动

实例

html代码

<body >
        <div id="d1">
            <div id="d2">
            </div>
            <div id="d3">
            </div>
            <div id="d4">
            </div>
        </div>
    </body>

css代码1,为浮动前

#d1 {
                background: green;
                border: 1px solid pink;
                width:400px;
                height: 400px;
                margin: 100px auto;
                padding: 10px;
            }
            #d2 {
                background: gold;
                border: 1px solid rgb(219, 192, 255);
                width:100%;
                height: 100px;
            }
            #d3 {
                background: rgb(255, 0, 200);
                border: 1px solid rgb(219, 192, 255);
                width: 100px;
                height: 100px;
            }
            #d4 {
                background: rgb(255, 0, 43);
                border: 1px solid rgb(80, 6, 176);
                width:50px;
                height: 50px;
            }

效果图

android margin 负值 margin为负_d3_10

 

 css代码2, d3,d4左浮动

#d1 {
                background: green;
                border: 1px solid pink;
                width:400px;
                height: 400px;
                margin: 100px auto;
                padding: 10px;
            }
            #d2 {
                background: gold;
                border: 1px solid rgb(219, 192, 255);
                width:100%;
                height: 100px;
            }
            #d3 {
                background: rgb(255, 0, 200);
                border: 1px solid rgb(219, 192, 255);
                width: 100px;
                height: 100px;
                float: left;
            }
            #d4 {
                background: rgb(255, 0, 43);
                border: 1px solid rgb(80, 6, 176);
                width:50px;
                height: 50px;
                float: left;
            }

效果图

android margin 负值 margin为负_d3_11

 

 css代码3, d3的margin-left为-50, 效果图

android margin 负值 margin为负_文档流_12

 

 css代码4, d3的margin-left:-120px,效果图

android margin 负值 margin为负_android margin 负值_13

 

css代码5, d2也设置左浮动,这时因为d2已经完全位于父元素之外,这时d2会向上浮动,

效果图

 

android margin 负值 margin为负_android margin 负值_14