本系列摘自  飘零雾雨的博客

margin的重要性:

有个不容置疑的事,前端开发人员没有人能够忽视CSS margin的重要性。CSS coding时,margin的使用频率就如同呼吸般频繁,如果我可以说得夸张点的话。

margin作为CSS盒模型基本组成要素之一,是非常Basis的一个技术手段,所以我想对于它的一些基本情况应该不用太介绍了?

margin经常被用来做什么?

  • 让块元素水平居中;
  • 让元素之间留有舒适的留白;
  • 处理特殊的first或last,大家懂的?
  • 一些布局;

需要注意的地方:

  • margin折叠;
  • margin的百分比值;
  • margin的auto值;
  • margin和相对偏移top, right, bottom, left的异同;
  • IE6浮动双margin Bug;
  • IE6浮动相邻元素3px Bug;

看起来似乎有不少的知识点?恩,这些都是我们需要了解的,包括一些没有被列举出来的点。

今天要讲的其实只是其中很少的一部分,恩,标题里有:keyword auto

keyword auto

auto是margin的可选值之一。相信大家平时使用auto值时,最多的用法大概是 margin: 0 auto; 和 margin: auto;,恩,是的,块元素水平居中。让我们来看看代码实现:

CSS:

#demo{     width: 500px;     margin: auto; /* 或者 margin: 0 auto; */ }

HTML:

<div id="demo">     <p>恩,我就是那个需要水平居中的家伙。</p> </div>

为了更明显点,我们来看个例子:margin实现块元素水平居中。Cool,这么简单就实现了水平居中。

不过你可能也发现了不论是 margin: auto; 还是 margin: 0 auto; 效果都是一样的,都是让 #demo 水平居中了,但纵向并没有任何变化。

大家都知道 margin 是复合属性,也就是说 margin: auto; 其实相当于 margin: auto auto auto auto;margin: 0 auto;相当于 margin: 0 auto 0 auto;,四个值分别对应上右下左。至于CSS中的上、右、下、左顺序就不做赘述了。

根据规范,margin-top: auto; 和 margin-bottom: auto;,其计算值为0。这也就解释了为什么 margin: auto; 等同于margin: 0 auto;。但仅此而已吗?让我们来看看规范描述:

原文:On the A edge and C edge, the used value of ‘auto’ is 0.

翻译:如果场景是A和C,那么其 auto 计算值为 0

更详细请参阅:margin properties

由此可见,它们还与书写模式 writing-mode 和 文档流方向 direction 有关。所以我们说 margin: auto; 等同于 margin: 0 auto; 是不太精准的,因为还有前置条件。

了解这些很重要,这有助于理解 margin 属性的设计意图。

OK,聊了这么多,我们回到默认的 writing-mode: horizontal-tb; 和 direction: ltr; 的情况继续往下,后面的话题都基于这个前提。

为什么auto能实现水平居中?

这是因为水平方向的 auto,其计算值取决于可用空间(剩余空间)。

原文:On the B edge and D edge, the used value depends on the available space.

翻译:如果场景是B和D,那么其 auto 计算值取决于可用空间。

想象这样一个场景,一个宽100px的p被包含在一个宽500px的div内,此时设置 p 的 margin-left 值为 auto,大家觉得结果会怎样?

CSS:

#demo{     width: 500px; } #demo p{     width: 100px;     margin-left: auto; }

HTML:

<div id="demo">     <p>恩,我就是那个p。</p> </div>

结果你猜到了吗?没猜到也不怕,用事实说话:margin-left关键字auto结果猜想

好了,结果得到了,p相对于包含块右对齐了,这与规范描述一致。margin-left:auto; 自动占据了包含块的可用空间,即 500 - 100px = 400px。也就是说auto最后的计算值为400px,即 margin-left:400px;。所以 margin-right:auto; 的结果会相当于左对齐。

到这里,相信大家都知道为什么 margin: auto; 和 margin: 0 auto; 能实现水平居中了。因为左右方向的auto值均分了可用空间,使得块元素得以在包含块内居中显示。

至于垂直方向上为什么无法居中,还有更深层的原因吗?大家可以思考一下。

可参考:

margin系列之keyword auto的更多相关文章

  1. margin系列之百分比

    本系列摘自  px; height: 600px; } #demo p{ margin: 10% 5%; } HTML: <div id="demo"> <p&g ...

  2. margin系列之内秀篇(二)

    本系列摘自  飘零雾雨的博客 可挖掘性 之前已经写过一篇关于 margin 应用场景的文章:margin系列之内秀篇,当然,它的应用场景会远大于文中所述,无法一一列举. 所以本篇权当是对此的补遗好了, ...

  3. margin系列之内秀篇

    本系列摘自  飘零雾雨的博客 最Cool的利器 一样东西在不同的场景,不同的人手里,所能做的事会有很大不同.我深切的以为 margin 绝对是 CSS 中最有能力的利器之一,不知大家以为然否? 前面几 ...

  4. 慎用margin系列3---IE6下3px bug

    当我们想让一段文字出现在一个布局块的右边的时候,我们会让布局块向左浮动,然后把段落设置左布局块宽度大小的左空白.比如左布局块是.a{float:left;height: 110px;width: 28 ...

  5. 慎用margin系列2---ie6双倍边距问题

    IE6下有一个著名的margin双倍bug 一.什么是双边距Bug? 先来看图: 我们要让绿色盒模型在蓝色盒模型之内向左浮动,并且距蓝色盒模型左侧100像素.这个例子很常见,比如在网页布局中,侧边栏靠 ...

  6. 慎用margin系列1---CSS的margin塌陷(collapse) 问题与对策

      对于以下简单代码: 如果您认为应该是这样的话: 那就错了.结果是这样的: 因为CSS中存在一个margin collapse,即边界塌陷或者说边界重叠.对于上下两个并列的div块而言,上面div的 ...

  7. margin css的外边距

    h2{margin:10px 0;} div{margin:20px 0;} ...... <h2>这是一个标题</h2> <div> <h2>这是又一 ...

  8. margin负值-内秀篇

    zccst整理 margin系列之布局篇 margin系列之bug巡演(三) margin系列之bug巡演(二) margin系列之内秀篇(二) margin系列之bug巡演 margin系列之内秀篇 ...

  9. margin 相关 bug 系列

    原文地址:margin系列之bug巡演 by @doyoe IE6浮动双倍margin bug 这当是IE6最为经典的bug之一. 触发方式 元素被设置浮动 元素在与浮动一致的方向上设置margin值 ...

随机推荐

  1. maven 把spring项目打包成可执行的文件

    转载自http://www.mamicod.e.com/info-detail-635726.html 最近需要解决Maven项目导入可执行的jar包的问题,如果项目不包含Spring,那么使用mvn ...

  2. hibernate uniqueResult方法

    假设查询返回多个值用list()方法 public void testQuery(){ Configuration config = new Configuration().configure(); ...

  3. Nginx模块开发入门

    前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...

  4. iOS web与js的简单交互

    我们在封装网页的时候经常会遇到需要往网页里面的控件添加数据,但是怎么添加又成了难点.本人最近在开发的时候就遇到这样的事,解决之后,来和大家分享一下. //以必应网站为例 [web loadReques ...

  5. iOS实用的小技巧

    1.快捷键 上传APP模拟器截图:comm+s 自动保存到桌面 2.storyboard 改型号尺寸 如从iPad改为iPhone6:

  6. multi-threads synchronization use conditional mutex

    #include <pthread.h> int thread_flag; pthread_cond_t thread_flag_cv; pthread_mutex_t thread_fl ...

  7. [引]MSDN Visual Basic 和 C# 中都会用到的编程概念

    本文转自:http://msdn.microsoft.com/zh-cn/library/dd460655.aspx 本节介绍 Visual Basic 和 C# 中都会用到的编程概念. 本节内容   ...

  8. JSON对象和string的相互转换

    JSON.stringify(obj) 将JSON转为字符串. JSON.parse(string) 将字符串转为JSON格式.

  9. videojs 动态加载视频

    VideoJS dynamic source change via RESTful API 'Undefined' issue with changing RTMP source on compres ...

  10. PeopleReady 是什么系统?其中文为全员就绪

    PeopleReady 中文:全员就绪. 顾名思义: 一句话:PeopleReady 就是能使人快速Ready的系统. 稍长一句话:就是能使大家快速Ready(经验+知识)的系统. 详细的来说:通过积 ...