margin相关

一、标准盒模型和怪异模式盒模型

标准盒模型和怪异模式盒模型可以通过box-sizing来设置:
 标准盒模型: box-sizing: content-box
 怪异模式盒模型: box-sizing: border-box

两种模型的区别:标准模式会被设置的padding撑开,而怪异模式则相当于将盒子的大小固定好,再将内容装入盒子。盒子的大小并不会被padding所撑开。

1.标准盒模型:盒子总宽度 = width + padding + border + margin


标准盒模型.jpg

2.怪异模式盒模型:盒子总宽度 = width + margin


怪异模式盒模型.jpg

二、margin百分比

假设我们有这样的一段HTML代码,外面一个DIV宽度980px,高度500px,里面有一个子元素DIV,宽度和高度都不设置,然后给他设置margin:10% 5%,这个属性相当于margin:10% 5% 10% 5%。

HTML代码:

<div class="demo1"> <div>这个div设置:margin:10% 5%</div> </div>

CSS代码:

.demo1{ height:500px; width:980px; margin:0 auto; background:#EEE; overflow:hidden;} .demo1 div{margin:10% 5%; background:#666;}

这里还出现了一个小的hack,就是demo1盒子不会紧挨着body,也就是不会定格布局,而且body元素上面还有一段空白,这段空白的高度刚好是.demo1 div元素的margin-top,demo1和.demo1 div元素都是顶格对其的,只要给demo1元素设置overflow:hidden,即可解决这个问题。
  我们根据以往的理解,.demo1 div的margin应该是:50px 49px 50px 49px,但是运行以后,通过查看盒模型示意图,却发现是:98px 49px 98px 49px:


得出结论:

当margin设置成百分数的时候,其top right bottom left的值是参照父元素盒子的宽度进行计算,在w3c的规范中也是这样描述的: margin 的百分比值参照其包含块的宽度进行计算,同样的padding如果设置成百分数的话,其盒子模型和margin是一样的。
  这只发生在默认的 writing-mode: horizontal-tb;direction: ltr;的情况下,当书写模式变成纵向的时候,其参照将会变成包含块的高度。

三、关于img的margin设置问题

margin-top 和 margin-bottom 值对行内非替换元素(non-replaced inline element)是无效的。因此我们可以指定 img 元素的 margin-top 和 margin-bottom,而非替换行内元素(如 i,span 等)设置 margin-top 和 margin-bottom 却不会产生效果。

四、margin--在同级元素(非父子关系)之间应用

(1)水平方向的外边距合并

两个水平方向的盒子相遇,那么最终两者之间的距离为左边盒子的右外边距和右边盒子的做外边距之和。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>水平方向的两个盒子</title>
    <style>
        *{
            margin:0;
            padding:0;
            border:0;
        }
        body{
            font-size: 0;
        }
        .left{
            width: 100px;
            height: 100px;
            background: red;
            display: inline-block;
            margin-right: 50px;
            font-size: 20px;
        }
        .right{
            width: 100px;
            height: 100px;
            background: yellow;
            display: inline-block;
            margin-left: 50px;
            font-size: 20px;
        }
    </style>
</head>
<body>
    <div class="left">宽为100px,右边距为50px</div>
    <div class="right">宽为100px,左边距为50px</div>
</body>
</html>

效果图:


Paste_Image.png
补充说明:

大家可以看到,为了使得两个div(块状元素)脱离正常的文档流我使用了display:inline-block;属性,另外,我还把body的font-size设置为0,这样可以解决inline-block自身的问题,否则两个div的举例会大于100px。当然使用float也可以使得两个div出现在同一行中。

如果使用display: inline-block;,则会出现一个bug,例如lia把设置成display: inline-block;,然后把padding和margin都设置为0还是会出现空隙,如:


此时有两种方法设置间距为0:
1.将设置display: inline-block;的元素写在一行。

2.将父元素设置为font-size: 0

(2)竖直方向的外边距合并

两个竖直方向的盒子相遇时,其竖直方向的距离等于上方盒子的下外边距和下方盒子的上外边距中较大的一个。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>水平方向的两个盒子</title>
    <style>
        *{
            margin:0;
            padding:0;
            border:0;
        }
        .top{
            width: 100px;
            height: 100px;
            margin-bottom: 100px;
            background: red;
        }
        .bottom{
            width: 100px;
            height: 100px;
            margin-top: 50px;
            background: green;
        }
    </style>
</head>
<body>
    <div class="top">高为100px,下边距为100px</div>
    <div class="bottom">高为100px,上边距为50px</div>
</body>
</html>

此时两个块之间的间隙为100px,而非100+50px。

另外一个有趣的例子就是:假设有一个元素同时设置了margin-top和margin-bottom,但是内容为空,那么这两个margin值也会叠加,值为两者最大的一个,它类似与竖直方向上两个盒子margin值的叠加。代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>水平方向的两个盒子</title>
    <style>
        *{
            margin:0;
            padding:0;
        }
 
        .top{
            width: 500px;
            height: 100px;
            background: red;
        }
        .middle{
            margin-top: 100px;
            margin-bottom:50px;
        }
        .footer{
            width: 500px;
            height: 100px;
            background: green;
        }
 
    </style>
</head>
<body>
    <div class="top">上面的div,高100px</div>
    <div class="middle"></div>
    <div class="footer">下面的div,高100px</div>
</body>
</html>

我们发现这时在上面的div和在下面的div之间的举例并不是100+50=150px,而是两者中的最大者,即100px。

(3)margin--在父元素和子元素之间应用(重点)

(1)在子元素中设置水平方向的margin值,父元素设置padding:父子元素距离为margin+padding,不会叠加;
  (2)在子元素中设置竖直方向的margin值:margin-top: 100px;

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>margin</title>
    <style>
        *{padding:0; margin:0; border:0;}
        .father{
            width: 500px;
            height: 500px;
            background: red;
        }
        .son{
            width: 100px;
            height: 100px;
            background: green;
            margin-top: 100px;
        }
    </style>
</head>
<body>
    <div class="father">
        <div class="son">高度为100px,margin-top为100px。</div>
    </div>
</body>
</html>

效果如下:



  我们希望子元素的上部距离父元素的上部为100px,可是我们看到的却是父元素的上部距离浏览器页面的上部有100px的距离,实际上这是因为当父元素没有设置padding值以及border值时,出现了一个bug--父元素的上方与子元素的上方完全重合在了一起,无法分开。所以才会导致上述这种父元素和子元素同时向下的情况。

对于这种问题解决方法有下面几种:
  • 方法一:给父元素添加padding-top值
  • 方法二:给父元素添加border值
  • 方法三:给父元素添加属性overflow:hidden;
  • 方法四:给父元素或者子元素声明浮动float;
  • 方法五:使父元素或子元素声明为绝对定位:position:absolute;
  • 方法六:给父元素添加属性 overflow:auto; positon:relative;

转载自 http://www.cnblogs.com/zhuzhenwei918/p/6124263.html

margin的高度塌陷总结:

在标准文档流中,竖直方向上的margin不叠加,以较大的为准,水平方向叠加无塌陷,如果不在标准文档流中(例如绝对定位,浮动),无塌陷现象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,725评论 1 92
  • margin与可视尺寸,适用范围:1、没有设定width/height的普通block水平元素2、只适用于水平方向...
    大瓶绿茶阅读 486评论 0 0
  • 本课来自http://www.imooc.com/learn/9请不要用作商业用途。 HTML5 HTML介绍 H...
    PYLON阅读 3,192评论 0 5
  • 1.在什么场景下会出现外边距合并?如何合并?如何不让相邻元素外边距合并?给个父子外边距合并的范例 概念:在CSS当...
    饥人谷_任磊阅读 641评论 0 3
  • 一 外部式css样式 (也可称为外联式)就是把css代码写一个单独的外部文件中,这个css样式文件以“.css...
    KunMitnic阅读 925评论 0 1