边界,元素周围生成额外的空白区。“空白区”一般是指其余元素不能出现且父元素背景可见的区域。——CSS权威指南
我比较喜欢使用“外边距”这个词来解释margin(同理padding能够称之为“内边距”,可是我又偏偏喜欢称呼padding为“补白”或者“留白”),咱们能够很清楚的了解到margin的最基本用途就是控制元素周围空间的间隔,从视觉角度上达到相互隔开的目的。css
注意点
A、负margin是绝对标准的CSS
这不是开玩笑。W3C甚至标注过:对于margin属性来讲,负值是被容许的。这是Nuff说的,查看这篇文章会
有更多详细内容。
B、负maring不是一种hack方法
千真万确,不能由于缺少对负marign的理解,或者由于它长得像hack,就认为它是一种hack方法。
除非你是用来修复本身在其余地方形成的错误。
C、不脱离文档流
不使用float的话,负margin元素是不会破坏页面的文档流。因此若是你使用负margin上移一个元素,
全部跟随的元素都会被上移。
D、彻底兼容
全部现代浏览器都彻底支持负margin(IE6在大多数状况下也支持)。
E、浮动会影响负margin的使用
负margin不是你天天都用的CSS属性,应用时应当心谨慎。
F、Dreamweaver不解析负margin
DW的设计视图不会解析负margin。但问题是你为何要在设计视图中检查你的网站呢?
上右 下左
省略的数值写法,基本以下: 1、若是margin只有一个值,表示上右下左的margin同为这个值。
例如:margin:10px; 就等于 margin:10px 10px 10px 10px; 2、若是 margin 只有两个值,第一个值表示上下margin值,第二个值为左右margin的值。
例如:margin:10px 20px; 就等于 margin:10px 20px 10px 20px; 3、若是margin有三个值,第一个值表示上margin值,第二个值表示左右margin的值,第三个值表示下margin的值。
例如:margin:10px 20px 30px; 就等于 margin:10px 20px 30px 20px; 4、若是margin有四个值,那这四个值分别对应上右下左这四个margin值。
例如:margin:10px 20px 30px 40px;
外边距合并指的是,当两个垂直外边距相遇时,它们将造成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。html
当一个元素出如今另外一个元素上面时,第一个元素的下外边距与第二个元素的上外边距会发生合并。请看下图:html5
当一个元素包含在另外一个元素中时(假设没有内边距或边框把外边距分隔开),它们的上和/或下外边距也会发生合并。请看下图:浏览器
假设有一个空元素,它有外边距,可是没有边框或填充。在这种状况下,上外边距与下外边距就碰到了一块儿,它们会发生合并:布局
若是这个外边距遇到另外一个元素的外边距,它还会发生合并:性能
这就是一系列的段落元素占用空间很是小的缘由,由于它们的全部外边距都合并到一块儿,造成了一个小的外边距。网站
外边距合并初看上去可能有点奇怪,可是实际上,它是有意义的。以由几个段落组成的典型文本页面为例。第一个段落上面的空间等于段落的上外边距。若是没有外边距合并,后续全部段落之间的外边距都将是相邻上外边距和下外边距的和。这意味着段落之间的空间是页面顶部的两倍。若是发生外边距合并,段落之间的上外边距和下外边距就合并在一块儿,这样各处的距离就一致了。ui
什么时候应当使用margin:
须要在border外侧添加空白时。
空白处不须要背景(色)时。
上下相连的两个盒子之间的空白,须要相互抵消时。如15px + 20px的margin,将获得20px的空白。spa
什么时候应当时用padding:
须要在border内测添加空白时。
空白处须要背景(色)时。
上下相连的两个盒子之间的空白,但愿等于二者之和时。如15px + 20px的padding,将获得35px的空白。设计
margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔。margin用于布局分开元素使元素与元素互不相干;padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段“呼吸距离”。
HTML(这里说的是html标准,而不是xhtml)里分两种基本元素,即block和inline。顾名思义,block元素就是以”块”表现的元素(block-like elements),inline元素便是以”行”表现的元素(character level elements and text strings)。两者表现的主要差异在于,在页面文档中block元素另起一行开始,并独占一行。inline元素则同其余inline元素共处一行。
block元素(块元素)大体有:P|H1|H2|H3|H4|H5|H6|UL|OL|PRE| DL | DIV | NOSCRIPT | BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS(随着html5标准的推动,一些元素将被废除,而一些新的元素将被引入)注意的是并不是全部的block元素的默认display属性都是block,像table这种display:table的元素也是block元素。
inline元素(内联元素)大体有:#PCDATA(即文本)| TT | I | B | BIG | SMALL|EM | STRONG | DFN | CODE |SAMP | KBD | VAR | CITE | ABBR | ACRONYM|A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO|INPUT | SELECT | TEXTAREA | LABEL | BUTTON
其中有类特殊的元素:如img|input|select|textarea|button|label等,他们被称为可置换元素(Replaced element)。他们区别通常inline元素(相对而言,称non-replaced element)是:这些元素拥有内在尺寸(intrinsic dimensions),他们能够设置width/height属性。他们的性质同设置了display:inline-block的元素一致。
或许有朋友对非置换元素(non-replaced element)有点疑惑,稍微帮助你们理解一下。非置换元素,W3C 中没有给出明确的定义,但咱们从字面能够理解到,非置换元素对应着置换元素(replaced element),也就是说咱们搞懂了置换元素的含义,就懂了非置换元素。
置换元素(replaced element)主要是指 img, input, textarea, select, object 等这类默认就有 CSS 格式化外表范围的元素。进而可知,非置换元素(non-replaced element)就是除了 img, input, textarea, select, object 等置换元素之外的元素。
margin在块级元素下,他的性能能够彻底体现,上下左右任你设定。且记住块级元素的margin的参照基准是前一个元素即相对于自身以前的元素有margin距离。若是元素是第一个元素,则就是相对于父元素的margin距离(但第一个元素相对于父元素margin-top而父元素又没有设定padding-top/border-top的话要须要印证上面的垂直外边距合并的知识)
margin也能用于内联元素,这是规范所容许的,可是margin-top和margin-bottom对内联元素(对行)的高度没有影响,而且因为边界效果(margin效果)是透明的,他也没有任何的视觉影响。
这是由于边界应用于内联元素时不改变元素的行高度,若是你要改变内联元素的行高即相似文本的行间距,那么你只能使用这三个属性:line-height,fong-size,vertical-align。请记住,这个影响内联元素高度的是line-height而不是height,由于内联元素是一行行的,定一个height的话,那这究竟是整段inline元素的高呢?仍是inline元素一行的高呢?这都说不许,因此统一都给每行定一个高,只能是line-height了。
margin-top/margin-bottom对内联元素没有多大实际效果,不过margin-left/margin-right仍是可以对内联元素产生影响的。应用margin:10px 20px 30px 40px;,左边这个css若是写在inline元素上,他的效果大体是,上下无效果,左边离他相邻元素或者文本距离为40px,右边离他相邻元素或者文本距离为20px。
最后在内联元素中还有上文咱们提到的非可置换inline元素(non-replaced element),这些个元素img|input|select|textarea|button|label虽然是内联元素,但margin依旧能够影响到他的上下左右!
总结下来margin 属性能够应用于几乎全部的元素,除了表格显示类型(不包括 table-caption, table and inline-table)的元素,并且垂直外边距对非置换内联元素(non-replaced inline element)不起做用。
林林总总写了那么多,最后总结一些浏览器中常见的margin Bug吧,之后遇到margin下的布局问题能够查看这里找到解决的方案,若是你还发现其余关于浏览器下margin的Bug你能够发表留言,核对采纳后我会及时添加进去,感谢你的分享:
IE6中双边距Bug:
发生场合:当给父元素内第一个浮动元素设置margin-left(元素float:left)或margin-right(元素float:right)时margin加倍。
解决方法:是给浮动元素加上display:inline;CSS属性;或者用padding-left代替margin-left。
原理分析:块级对象默认的display属性值是block,当设置了浮动的同时,还设置了它的外边距就会出现这种状况。也许你会问:“为何以后的对象和第一个对象之间就不存在双倍边距的Bug”?由于浮动都有其相对应的对象,只有相对于其父对象的浮动对象才会出现这样的问题。第一个对象是相对父对象的,而以后对象是相对第一个对象的,因此以后对象在设置后不会出现问题。为何display:inline能够解决这个双边距bug,首先是inline元素或inline-block元素是不存在双边距问题的。而后,float:left等浮动属性可让inline元素haslayout,会让inline元素表现得跟inline-block元素的特性同样,支持高宽,垂直margin和padding等,因此div class的全部样式能够用在这个display inline的元素上。
IE6中浮动元素3px间隔Bug:
发生场合:发生在一个元素浮动,而后一个不浮动的元素天然上浮与之靠近会出现的3px的bug。
解决方法:右边元素也一块儿浮动;或者为右边元素添加IE6 Hack _margin-left:-3px;从而消除3px间距。
原理分析:IE6浏览器缺陷Bug。
IE6/7负margin隐藏Bug:
发生场合:当给一个有hasLayout的父元素内的非hasLayout元素设置负margin时,超出父元素部分不可见。
解决方法:去掉父元素的hasLayout;或者赋hasLayout给子元素,并添加position:relative;
原理分析:IE6/7独有的hasLayout产生问题。
IE6/7下ul/ol标记消失bug:
发生场合:当ul/ol触发了haslayout而且是在ul/ol上写margin-left,前面默认的ul/ol标记会消失。
解决方法:给li设置margin-left,而不是给ul/ol设置margin-left。
原理分析:IE6/7浏览器Bug
IE6/7下margin与absolute元素重叠bug:
发生场合:双栏自适应布局中,左侧元素absolute绝对定位,右侧的margin撑开距离定位。在IE6/7下左侧应用了absolute属性的块级元素与右边的自适应的文字内容重叠。
解决方法:把左侧块级元素更改成内联元素,好比把div更换为span。
原理分析:这是因为IE6/IE7浏览器将inline水平标签元素和block水平的标签元素没有加以区分一视同仁渲染了。属于IE6/7浏览器渲染Bug。
IE6/7/8下auto margin居中bug:
发生场合:给block元素设置margin auto没法居中
解决方法:出现这种bug的缘由一般是没有Doctype,而后触发了ie的quirks mode,加上Doctype声明就能够了。在《战胜IE的葵花宝典》里给出的方法是给block元素添加一个width可以解决,但根据本人亲测,加with此种方法是无效的,若是没有Doctype即便给元素添加width也没法让block元素居中。
原理分析:缺乏Doctype声明。
IE8下input[button | submit] 设置margin:auto没法居中
发生场合:ie8下,若是给像button这样的标签(如button input[type="button"] input[type="submit"])设置{ display: block; margin:0 auto; }若是不设置宽度的话没法居中。
解决方法:能够给为input加上宽度
原理分析:IE8浏览器Bug。
IE8百分比padding垂直margin bug: 发生场合:当父元素设置了百分比的padding,子元素有垂直的margin的时候,就好像父元素被设置了margin同样。 解决方法:给父元素加一个overflow:hidden/auto。 原理分析:IE8浏览器Bug。