CSS margin全面了解

江山十日雪,雪深江雾浓。开时刻的牵绊,邀阳光作伴,约清风同行,收拾起行囊,咱们去亲近草原吧,去亲近辽阔无边的草原。

一、margin可以为负值

在盒模型中,内容区的width/height、padding、border都不能为负值,但是margin例外,它可以为负值。

关于margin负值的使用技巧,了解不多,日后有机会再补充,此处先贴一个经典应用,margin-left负值结合浮动实现不改变DOM结构的流体布局。

此demo与CSS float浅析篇中的是同一个。

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPEhtml>
  2. <html>
  3. <head>
  4. <metacharset="utf-8">
  5. <title>不改变DOM结构的流体布局</title>
  6. <style>
  7. .container{
  8. width:600px;
  9. margin-left:auto;
  10. margin-right:auto;
  11. background-color:orange;
  12. font-size:16px;
  13. line-height:1.5;
  14. }
  15. .box1{
  16. width:100%;
  17. float:left;
  18. }
  19. .box2{
  20. margin-right:220px;
  21. padding-left:20px;
  22. }
  23. img{
  24. width:200px;
  25. float:left;
  26. margin-left:-200px;
  27. }
  28. .clearfix:after{
  29. content:"";
  30. display:table;
  31. clear:both;
  32. }
  33. .clearfix{
  34. *zoom:1;
  35. }
  36. </style>
  37. </head>
  38. <body>
  39. <divclass="containerclearfix">
  40. <divclass="box1">
  41. <divclass="box2">
  42. <h3>不改变DOM位置的流体布局</h3>
  43. <p>假如有一段文本和一幅图像,在DOM节点中,文本在前,图像在后,怎么能把图像定位到右边呢?</p>
  44. <p>通常的做法是,调换DOM节点中图像与文本的位置,让图像在前,文本在后,然后将图像浮动到右边即可。</p>
  45. <p>但这样改变DOM节点顺序始终不妥,还有什么更好的方法呢?</p>
  46. <p>下面就介绍一种新的思路来完成布局。</p>
  47. <ul>
  48. <li>将文本用div包起来,定义为box1;现在的结构是一个box1和一个img。</li>
  49. <li>将box1宽度设为100%,左浮动;将img设置一个宽度,也左浮动,然后margin-left设为负的宽度值;此时图像就定位到文本的右边啦。</li>
  50. <li>但是有一个问题,图像盖住了文本内容,这可怎么办?</li>
  51. <li>重点来了,在box1中增加一个box2,box2把文本全部包起来,然后margin-right设为图像的宽度(+额外的间距),这样就解决问题啦!</li>
  52. </ul>
  53. </div><!--关闭box2-->
  54. </div><!--关闭box1-->
  55. <imgsrc="http://imgsrc.baidu.com/forum/w%3D580/sign=0c101fe665380cd7e61ea2e59145ad14/f9a3492762d0f7032de1758a08fa513d2797c542.jpg"alt="apicture"style="width:200px;height:300px"/>
  56. </div><!--关闭container-->
  57. </body>
  58. </html>

二、margin的百分比数值

当margin属性的值为百分数时,其总是以父元素的width为基数进行计算。

请看下面这个demo,当初折磨了我N久的。。。只怪我知道得太晚了,说多了都是泪啊。。。

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPEhtml>
  2. <html>
  3. <head>
  4. <metacharset="utf-8">
  5. <title>margin的百分数值</title>
  6. <style>
  7. .container{
  8. width:500px;
  9. height:300px;
  10. margin:50pxauto;
  11. background-color:orange;
  12. border:1pxsolidblack;
  13. }
  14. .box{
  15. width:250px;
  16. height:150px;
  17. margin-left:auto;
  18. margin-right:auto;
  19. background-color:cyan;
  20. }
  21. .box1{
  22. margin-top:75px;
  23. margin-bottom:75px;
  24. padding:5px;
  25. }
  26. .box2{
  27. margin-top:25%;
  28. margin-bottom:25%;
  29. padding:5px;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <divclass="container">
  35. <divclass="boxbox1">
  36. <p>父元素的高度为300px,子元素的高度为150px,只要margin-top和margin-bottom都为75px,这个盒子就能垂直居中。</p>
  37. <p>OK,居中啦!!!</p>
  38. </div>
  39. </div>
  40. <divclass="container">
  41. <divclass="boxbox2">
  42. <p>既然子元素的高度是父元素高度的50%,那么只要margin-top和margin-bottom都为25%,应该也能垂直居中。</p>
  43. <p>额,这什么鬼?说好的居中呢?</p>
  44. </div>
  45. </div>
  46. </body>
  47. </html>

三、垂直方向上margin的合并

这个问题经常造成一些困惑,不过只需要记住一句话即可,垂直方向上的margin只要亲密接触就会合并,也只有亲密接触才会合并。

垂直方向上margin的合并,如果发生在相邻元素,其实是很好理解的;但是如果发生在父元素与子元素之间,就有些怪异了。

来看例子:

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPEhtml>
  2. <html>
  3. <head>
  4. <metacharset="utf-8">
  5. <title>垂直方向上的margin合并</title>
  6. <style>
  7. .container{
  8. width:500px;
  9. height:300px;
  10. margin:50pxauto;
  11. background-color:orange;
  12. }
  13. .box{
  14. width:300px;
  15. height:200px;
  16. margin-left:auto;
  17. margin-right:auto;
  18. background-color:cyan;
  19. margin-top:25px;
  20. padding:5px;
  21. }
  22. .border{
  23. border:1pxsolidblack;
  24. /*padding:1px;*/
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <divclass="container">
  30. <divclass="box">
  31. <p>父元素的margin-top为50px,子元素的margin-top为25px;</p>
  32. <p>咦,子元素的margin-top呢?为什么都顶到父元素上边界了?</p>
  33. <p>额,因为父元素与子元素的margin-top亲密接触了呀,所以它们合并在一起了啊。</p>
  34. </div>
  35. </div>
  36. <divclass="containerborder">
  37. <divclass="box">
  38. <p>可是我就是想让子元素距离父元素的上边界25px啊,我不想让它们合并呀。</p>
  39. <p>很简单,给父元素加个边框,它们就无法亲密接触了,就不会合并了啊。</p>
  40. <p>或者给父元素设置padding也是可以的喔。</p>
  41. </div>
  42. </div>
  43. </body>
  44. </html>

消除垂直方向上margin合并的方法:给父元素加border或者加padding,打破父元素与子元素margin之间的亲密接触即可。

margin合并的规则:

XML/HTML Code复制内容到剪贴板
  1. <!DOCTYPEhtml>
  2. <html>
  3. <head>
  4. <metacharset="utf-8">
  5. <title>margin合并规则</title>
  6. <style>
  7. .container{
  8. width:300px;
  9. height:500px;
  10. margin:50px;
  11. background-color:orange;
  12. float:left;
  13. border:1pxsolidblack;
  14. }
  15. .box1,.box2,.box3,
  16. .box4,.box5,.box6{
  17. width:200px;
  18. height:150px;
  19. margin:30pxauto;
  20. background-color:cyan;
  21. text-align:center;
  22. line-height:150px;
  23. }
  24. .box1{
  25. margin-bottom:30px;
  26. }
  27. .box2{
  28. margin-top:20px;
  29. }
  30. .box3{
  31. margin-bottom:30px;
  32. }
  33. .box4{
  34. margin-top:-30px;
  35. }
  36. .box5{
  37. margin-bottom:-30px;
  38. }
  39. .box6{
  40. margin-top:-50px;
  41. background-color:green;
  42. }
  43. p{
  44. width:220px;
  45. margin:10pxauto;
  46. font-size:16px;
  47. line-height:1.5;
  48. }
  49. </style>
  50. </head>
  51. <body>
  52. <divclass="container">
  53. <divclass="box1">box1</div>
  54. <divclass="box2">box2</div>
  55. <p>box1的margin-bottom为30px,box2的margin-top为20px,两个margin都是正数,取绝对值大的。</p>
  56. </div>
  57. <divclass="container">
  58. <divclass="box3">box3</div>
  59. <divclass="box4">box4</div>
  60. <p>box3的margin-bottom为30px,box4的margin-top为-30px,两个margin一正一负,相加。</p>
  61. </div>
  62. <divclass="container">
  63. <divclass="box5">box5</div>
  64. <divclass="box6">box6</div>
  65. <p>box5的margin-bottom为-30px,box6的margin-top为-50px,两个margin都是负数,取绝对值大的。</p>
  66. </div>
  67. </body>
  68. </html>

1. 两个margin都是正数,取绝对值大的;

2. 一个margin是正数,另一个margin是负数,相加;

3. 两个margin都是负数,取绝对值大的。

以上这篇CSS margin全面了解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

原文地址:http://www.cnblogs.com/cc156676/archive/2016/07/21/5690270.html

标签: CSS margin