margin系列之keyword auto
本系列摘自 飘零雾雨的博客
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; */ }
#demo{ width: 500px; margin: auto; /* 或者 margin: 0 auto; */ }
HTML:
<div id="demo"> <p>恩,我就是那个需要水平居中的家伙。</p> </div>
<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; }
#demo{ width: 500px; } #demo p{ width: 100px; margin-left: auto; }
HTML:
<div id="demo"> <p>恩,我就是那个p。</p> </div>
<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的更多相关文章
- margin系列之百分比
本系列摘自 px; height: 600px; } #demo p{ margin: 10% 5%; } HTML: <div id="demo"> <p&g ...
- margin系列之内秀篇(二)
本系列摘自 飘零雾雨的博客 可挖掘性 之前已经写过一篇关于 margin 应用场景的文章:margin系列之内秀篇,当然,它的应用场景会远大于文中所述,无法一一列举. 所以本篇权当是对此的补遗好了, ...
- margin系列之内秀篇
本系列摘自 飘零雾雨的博客 最Cool的利器 一样东西在不同的场景,不同的人手里,所能做的事会有很大不同.我深切的以为 margin 绝对是 CSS 中最有能力的利器之一,不知大家以为然否? 前面几 ...
- 慎用margin系列3---IE6下3px bug
当我们想让一段文字出现在一个布局块的右边的时候,我们会让布局块向左浮动,然后把段落设置左布局块宽度大小的左空白.比如左布局块是.a{float:left;height: 110px;width: 28 ...
- 慎用margin系列2---ie6双倍边距问题
IE6下有一个著名的margin双倍bug 一.什么是双边距Bug? 先来看图: 我们要让绿色盒模型在蓝色盒模型之内向左浮动,并且距蓝色盒模型左侧100像素.这个例子很常见,比如在网页布局中,侧边栏靠 ...
- 慎用margin系列1---CSS的margin塌陷(collapse) 问题与对策
对于以下简单代码: 如果您认为应该是这样的话: 那就错了.结果是这样的: 因为CSS中存在一个margin collapse,即边界塌陷或者说边界重叠.对于上下两个并列的div块而言,上面div的 ...
- margin css的外边距
h2{margin:10px 0;} div{margin:20px 0;} ...... <h2>这是一个标题</h2> <div> <h2>这是又一 ...
- margin负值-内秀篇
zccst整理 margin系列之布局篇 margin系列之bug巡演(三) margin系列之bug巡演(二) margin系列之内秀篇(二) margin系列之bug巡演 margin系列之内秀篇 ...
- margin 相关 bug 系列
原文地址:margin系列之bug巡演 by @doyoe IE6浮动双倍margin bug 这当是IE6最为经典的bug之一. 触发方式 元素被设置浮动 元素在与浮动一致的方向上设置margin值 ...
随机推荐
- 从Eclipse到Android Studio经历
现在不得不要和相处近两年的Eclipse分手了,很舍不得,谢谢你这些日子有你的陪伴,每天都会有些的期待和挑战.两年来,我们建立了很深厚的情感.曾经以为我的世界只能有你,而现在我的心里可能有了别人.起初 ...
- ubuntu下设置开机自启动项
可用一些小工具来管理 Ubuntu 的启动选项: 小工具 rcconf: #sudo apt-get rcconf #sudo apt-get install rcconf root 下运行: #su ...
- 《Linux内核修炼之道》 之 高效学习Linux内核
http://blog.csdn.net/fudan_abc/article/details/5738436
- java_类泛型基本实例
package ming; public class Apple2<T> { public T info; public Apple2(T info) { this.info = info ...
- 在iOS上自动检测内存泄露
手机设备的内存是一个共享资源.应用程序可能会不当的耗尽内存.崩溃,或者遭遇大幅度的性能降低. Facebook iOS客户端有很多功能,并且它们共享同一块内存空间.如果任何特定的功能消耗过多的内存,就 ...
- 考试宝典-真题园安卓AppV2.1.0新版发布啦,全新界面,全新体验,全面适配Android 5.0&6.0系统!
真题园移动客户端是真题园网 http://www.zhentiyuan.com 旗下的一款学习考试应用App. 1.全新适配Android5.0.6.0系统,重新优化架构网络通信模块. 2.全新清爽U ...
- 工作中遇到的UIScrollview的问题及解决方案
用scrollview的时候,记得创建scrollview后再在scrollview上放一个view,将其他子空间和子view都放在这个view上. 目前遇到的问题: ImagePlayerView( ...
- JavaScript总结2--函数
一.定义函数 在js中,函数也是对象,能赋值给变量,能当作参数,可以设置属性,和调用他拥有的方法.函数的toString()方法,会返回他完整的函数内容.他有两个定义方法,函数表达式和函数声明.当一个 ...
- 对于jdk jre jvm的简单认识
1:名词解释 jdk:java develop kit:java开发工具包 jre:java runtime environment :java开发运行时环境 jvm:java virtua m ...
- ReentrantLock和synchronized的区别
一.ReentrantLock类 ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票.定时锁等候和可中断锁等候的一些特性 ...