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

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. android学习日记26--AIDL之进程间的通信

    1.AIDL介绍 AIDL:Android Interface Definition Language,即Android接口定义语言. 由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运 ...

  2. 【C语言】字符串替换空格:实现一个函数,把字符串里的空格替换成“%20”

    //字符串替换空格:实现一个函数,把字符串里的空格替换成"%20" #include <stdio.h> #include <assert.h> void ...

  3. Web应用Word生成

    前段时间接到一个Web应用自己主动生成Word的需求,现整理了下一些关键步骤拿来分享一下. 思路:(注:这里仅仅针对WORD2003版本号.其他版本号大同小异.) 由于WORD文件内部的数据及格式等是 ...

  4. [Effective C++ --021]必须返回对象时,别妄想返回其reference

    引言 在条目20中,我们知道了值传递和引用传递的效率问题,因此在设计程序时,我们可能就尽可能来返回引用而不是值. 可是,可能会犯下面的一些错误:传递一些引用指向其实并不存在的对象. 第一节:返回临时变 ...

  5. Android Sutido 编译速度优化

    虽然Android Studio 此时已经更新到了Android Studio 2.1版本,build 版本android-studio-bundle-143.2739321.但是在安装该版本都是根据 ...

  6. iOS之SDWebImage的使用

    第一步,下载SDWebImage,导入工程.github托管地址https://github.com/rs/SDWebImage 第二步,在需要的地方导入头文件 1 #import "UII ...

  7. delta

    1,安装synplyfy:综合工程,便于学习(模块间的关系,数据流向) 2,安装wps office:  www.wps.com/linux,论坛有安装方法和依赖包处理 3,安装kmplayer: 4 ...

  8. highcharts 去掉右下角链接

    去掉右下角的highcharts.com链接需要加入以下代码: credits: { enabled:false }, 如果不设置,那么默认为显示.

  9. SQL-学习使用FOR XML PATH

    前言:本人SQL技术很烂,然后工作时间也不久,许多东西都还在学习中,说的不好的地方尽请谅解. 首先跟大家说一下我今天遇到的问题吧. 查出的数据有三列,第一列存放的是32位的GUID,Res_Name存 ...

  10. 月下载量上千次的APP源码分享

    在360上面上线了一个月,下载量上千余次.这里把代码都分享出来,供大家学习哈!还包括教大家如何接入广告,赚点小钱花花,喜欢的帮忙顶一个,大神见了勿喷,小学僧刚学Android没多久. 首先介绍这款应用 ...