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值 ...
随机推荐
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
[目录] 一.[基础知识——扫盲] 二.[DOM.SAX.JDOM.DOM4j简单使用介绍] 三.[性能测试] 四.[对比] 五.[小插曲XPath] 六.[补充] 关键字:Java解析xml.解析x ...
- android122 zhihuibeijing 新闻中心NewsCenterPager加载网络数据实现
新闻中心NewsCenterPager.java package com.itheima.zhbj52.base.impl; import java.util.ArrayList; import an ...
- WCF的ABC
首先: WCF的全称是Windows Communication Foundation,Windows通信基础的意思,是Microsoft为构建面向服务的应用程序而提供的统一编程模型,它整合.NET平 ...
- 实例源码--Android简单团购应用源码
下载源码 技术要点: 1.HTTP通信技术 2.XML数据解析 3.控件的简单应用 4.源码带有非常详细的中文 注释 ...... 详细介绍: 1. HTTP通信技术 通 过HTTP通信技术, ...
- java_可变参数构造器 Bulder模式
package com.test1.www; class NutritionFacts { //必须 private int servingSize; private int servings; // ...
- Linux系统搭建负载均衡环境
1:负载均衡的定义多台服务器组成一个集群,向外提供相同的服务,所有的请求经过apache服务器的分配,到各台tomcat服务器处理请求.另外还需实现session共享,如果有一台tomcat服务器宕机 ...
- 实现虚拟机上面的linux系统和windows主机的通信
一:配置静态ip 1:使用startx命名切换到图形化用户界面: 2:在“开始”——“系统设置”——“网络”——eth0 将通过dchp自动获取ip改为静态绑定ip ip地址:填入你要给的ip,需要与 ...
- Redis的安装与使用
一.什么 Redis REmote DIctionary Server,简称 Redis,是一个类似于Memcached的Key-Value存储系统.相比Memcached,它支持更丰富的数据结构,包 ...
- linux下安装软件后的环境变量设置
/home/username/.bashrc文件中加入如下内容 export LM_LICENSE_FILE=/home/program_files/modeltech_10.2c/modeltech ...
- 关于apple watch(苹果表)
如何升级呢? 对于Apple Watch用户来说,只要打开Apple Watch的iPhone应用,打开主菜单然 后选择软件升级,就能下载升级文件.新版本可以无线安装.需要注意的是,在升级 wat ...