在标准文档流中,对于没有设置宽度的block元素,当其具备内容或者设置高度后,其自身宽度为父元素宽度的100%,这个时候给block元素设置水平方向的margin值,就会改变元素的可视宽度。可是不能改变高度,由于block元素的高度是固定或者等于其内容的高度,并不会拉伸。bootstrap
这个特色在bootstrap的布局里就有用到。布局
<div class="wrap"> 父元素padding: 0 10px; <div class="yellow">此block元素没有设置margin值</div> <div class="red">此block元素设置margin-left:-10px;margin-right:-10px; 拉伸了元素宽度</div> </div>
* {margin:0; padding:0;} .wrap { width: 400px; height: 400px; margin: 50px auto; padding: 0 10px; border: 1px solid #ccc; } .red { height: 100px; background-color: red; margin: 0 -10px; } .yellow { height: 100px; background-color: yellow; }
当绝对定位元素没有设置width,但设置了top/bottom,left/right值时,元素会被拉伸。好比设置left:0; right:0; 元素的宽度就是第一个相对定位的父元素的宽度的100%了,这时也能经过margin来改变元素的可视宽度。一样,对于绝对定位元素,咱们也能改变它的可视高度。flex
<div class="wrap"> 父元素position: relative; <div class="yellow">绝对定位,而且设置top:0; bottom:0; 垂直拉伸元素,经过设置margin来改变可视高度</div> </div>
* {margin:0; padding:0;} .wrap { position: relative; width: 400px; height: 400px; margin: 50px auto; border: 1px solid #ccc; } .yellow { position: absolute; top: 0; bottom: 0; width: 100px; margin: 50px 0; background-color: yellow; }
跟padding同样,对于正常处于标准文档流的元素而言,当元素的margin值为百分比值时,其实际值等于父元素的宽度*百分比;spa
当元素设置绝对定位后,其实际值等于第一个相对于它定位的父元素的宽度*百分比code
<div class="wrap"> 父元素宽度400px; <div class="yellow">margin-top:10%; 实际的margin-top=400px*10%=40px</div> </div>
* {margin:0; padding:0;} .wrap { width: 400px; height: 400px; margin: 50px auto; border: 1px solid #ccc; } .yellow { width: 200px; height: 200px; margin-top: 10%; background-color: yellow; }
margin重叠一般发生在兄弟元素之间以及父子元素之间,若是你们平时没有注意的话,margin重叠可能经常会给咱们带来一些小麻烦,这里就把发生margin重叠的状况总结一下。blog
当两个元素发生margin重叠时,其实际值的状况:文档
那何时会发生margin重叠呢?it
对于两个相邻的兄弟元素而言,只要是处于标准文档流中的block元素,垂直方向都会发生margin重叠。io
给一个定宽的block元素设置margin: 0 auto;使元素水平居中,这应该是不少人常常使用的,不过对于auto值的具体做用,可能不多有人知道。class
简单点说,对于未设置固定width或height值的元素,若是能自动拉伸,那么当设置了固定值后,auto就能够用来分配剩余空间大小。
感受有点拗口,举个例子,有一个定宽的block元素,咱们想让他在右边显示,最经常使用的就是使用float属性,不过用margin-left: auto;同样能够实现:
<div class="wrap"> <div class="red">margin-left: auto;</div> </div>
* {margin:0; padding:0;} .wrap { position: relative; width: 400px; height: 400px; margin: 50px auto; border: 1px solid #ccc; } .red { width: 100px; height: 100px; background-color: red; margin-left: auto; }
设置margin值为auto的有效场景包括: