关于margin的一些问题

在平时处理样式的过程中,会出现各种问题。比如:

  • 包含在父元素中的子元素设置了浮动,子元素高度变化的时候父元素的高度没有随着变化,就是没有被撑高,父元素仍然是原来设置的那个高度
  • 包含在父元素中的子元素,子元素的宽高没有设置,而是通过自身的margin值来根据父元素的大小来设置自身的宽高,但是实际上顶部的margin却跟父元素重叠在一起
  • 元素明明设置成了块级,但是定义高度一直都不是想要的高度
  • 跟相邻元素用margin隔开,但是实际上margin的值跟设定的不同。
  • 在低版本浏览器中(ie6,7),block元素设置成inline-block后没有效

盒子模型

前面提的问题,基本上都是与css中的盒模型相关的。

Source: w3c

盒子的宽度

= margin-left + margin-right + border-left + border-right + padding-left + padding-right + width

盒子的高度

= margin-top + margin-bottom + border-top +border-bottom + padding-top + padding-bottom + height

注意:

  • margin是透明的没有颜色,border默认与文字颜色一直,padding的颜色同元素的背景色。
  • margin的垂直属性,也就是margin-top, margin-bottom,在inline的元素中不起作用。margin是可以有负值的。
  • padding属性无论是在inline还是block元素中都会有效,不过padding是没有负值的。

Margin外边距

box.html这里,其中inner跟outer1的margin-top, margin-right发生了重叠,也就是子元素跟父元素的margin会发生重叠;outer1的margin-bottom跟outer2的margin-top发生了重叠,也就是相邻元素的margin会发生重叠。

标准

在css2.1的标准是这么说的 (这里进入

" In CSS, the adjoining margins of two or more boxes (which might or might not be siblings) can combine to form a single margin. Margins that combine this way are said to collapse, and the resulting combined margin is called a collapsed margin. "

在css中,两个或者更多(有可能是同辈或者是后辈)毗邻盒子的外边距会重叠形成一个单一的边距。这种方式生成外边距的方式称为坍塌(叠加),这个结果形成的外边距叫做坍塌(叠加)外边距。

标准里的不发生重叠的情况

水平方向上永远不会发生重叠。

垂直方向上,下列情况不会发生重叠:

  • 根元素的外边距不会发生重叠
  • 如果拥有"空隙clearance"(也就是除了clear:none以外的值)的元素的上下外边距毗邻,它的边距会跟毗邻的元素发生重叠,但是形成的重叠不会再跟父元素的底部外边距发生重叠。

什么是空隙clearance?

*(Clear‘s) Values other than ‘none‘ potentially introduce clearance. (clear除了none以外的值可能产生空隙)

Clearanceinhibits margin collapsing and acts as spacing above the margin-top of an element. It is used to push the element vertically past the float.(空隙会抑制外边距坍塌,并且会表现为在外边距的顶部有一段空白。这是用来将元素垂直浮动的)

标准里发生重叠的情况

什么才是两个外边距毗邻呢(也就是怎样才会发生重叠)?

  • 处于同一个块级格式上下文中的,同属正常流的块级盒子。(这两个元素是没有脱离正常流的块级盒子,而且同在一个块级格式化上下文中。)
  • 两个元素没有line box,没有clearance,没有内边距和边框
  • 两个元素都是垂直边缘毗邻,符合下列情况中的一种
    • 盒子的顶部外边距(margin-top),和它的第一个处于正常流子元素的顶部外边距(margin-top)
    • 盒子的底部外边距(margin-bottom),和它的下一个处于正常流中的兄弟元素的顶部外边距(margin-top)
    • 处于正常流中的最后一个元素的底部外边距(margin-bottom),和它高度height为auto的父元素的底部外边距(margin-bottom)
    • 没有触发块级格式上下文,min-height为0,或者height为auto,以及没有处于正常流的子元素的盒子的margin-top,和margin-bottom

所谓的外边距坍塌,就是与另一个的外边距毗邻,只要是四个外边距中的任意一个即可。

注意:外边距坍塌会发生在任何的元素上,不单只是兄弟元素或者祖先元素。

上面的规则的意思就是(也就是具体规则):

  • 浮动盒子跟任意其他盒子的外边距不会叠加(即使是浮动元素跟它的正常流子元素)。
  • 具有块级格式上下文的元素(就比如除overflow: visiable值之外的元素)跟它的处于正常流的子元素不会发生外边距叠加。
  • 具有绝对定位的盒子的外边距不会发生叠加。(以及他们的正常流子元素)
  • 行内块级(inline-block)盒子不会发生外边距叠加。(以及他们的正常流子元素)。
  • 处于正常流的块级元素的底部外边距(margin-bottom)总是会跟他的下一个兄弟正常流的块级元素的顶部外边距(margin-top)叠加,除非这个兄弟元素有空隙(clearance).
  • 正常流块级元素的margin-top会跟它的第一个正常流块级子元素的margin-top叠加,如果这个元素没有border-top,没有padding-top,以及它的子元素没有空隙(clearance)。
  • 一个正常流的块级盒子若是height:auto或min-height:0,他的margin-bottom会跟最后一个正常流子元素的margin-bottom叠加,如果这个盒子没有padding-bottom或者border-bottom,并且子元素的margin-bottom没有跟有空隙(clearance)的margin-top叠加的话。
  • 一个盒子如果min-height:0,没有border-top或border-bottom,也没有padding-top或padding-bottom,也没有包含一个line box,且height:0 或height: auto,那么他的外边距会叠加,所有正常流子元素的外边距都会叠加。

如果发生外边距叠加,这个产生的外边距的值是这两个外边距中最大的那个。如果有负的外边距,那么值就是用最大的负的外边距的跟最大的正的外边距的相加。如果没有正值外边距,那么就是绝对值的最大值减去0.

Demo

不发生重叠的情况

前面翻译了css2.1中关于margin发生重叠的各种情况。但是大部分的实际工作中,为了更好的更精准的进行布局,我们一般是要避免margin发生重叠的。前面也提到了,水平方向上的margin是永远不会重叠的,所以接下来通过实际操作来看一下如何避免毗邻的外边距重叠。

浮动盒子跟任意其他盒子的外边距不会叠加(即使是浮动元素跟它的正常流子元素)。

参考demo1, demo2

在demo1中,outer浮动,inner是outer的in-flow(正常文档流)的子元素,所以outer的margin与inner的margin没有发生重叠。

在demo2中,outer,outer2均设置了浮动,触发了BFC,所以outer和outer2的外边距不会叠加。

浮动其实是脱离正常的文档流了,发生重叠的三个条件都是在正常的文档流中触发的,所以浮动是肯定不会发生外边距重叠的。

?    具有块级格式上下文(BFC)的元素(就比如除overflow: visiable值之外的元素)跟它的处于正常流的子元素不会发生外边距叠加。

块级格式上下文(block formatting context,后文简称BFC)是css2.1里描述的,在css3里面描述成了flow root。浮动元素和position除了relative和static之外的值,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow除了visible之外的值,都会触发BFC,其他的后续再详细分析。

参考在demo1中的outer和inner。Outer触发了BFC,所以与子元素inner的外边距没有重叠。

?    具有绝对定位的盒子的外边距不会发生叠加。(以及他们的正常流子元素)

    参考demo3

绝对定位也是脱离了正常的文档流的,跟浮动一样,违背了触发外边距重叠的条件,所以绝对定位也是肯定不会发生外边距重叠的。

?    行内块级(inline-block)盒子不会发生外边距叠加。(以及他们的正常流子元素)。

    参考demo4

这里发现一个问题,在inline-block里包含了一个block元素,然后为什么不是在顶部对齐而是根据文字中线对齐呢?稍后再做讨论。

?    如果拥有"空隙clearance"(也就是除了clear:none以外的值)的元素的上下外边距毗邻,它的边距会跟毗邻的元素发生重叠,但是形成的重叠不会再跟父元素的底部外边距发生重叠。

参考demo5

发生重叠的情况

如果拥有"空隙clearance"(也就是除了clear:none以外的值)的元素的上下外边距毗邻,它的边距会跟毗邻的元素发生重叠

参考demo5

剩下的明天补上。

时间: 2024-10-29 19:14:48

关于margin的一些问题的相关文章

须知的css——margin不重叠的情形

margin重叠 摘自css2.1规范中文版 CSS中,两个或者多个盒(可能但不一定是兄弟)的相邻的margin会被结合成一个margin.Margin按这种方式结合叫重叠(collapse),产生的结合的margin叫做重叠margin. margin重叠的计算规则 摘自css2.1规范中文版 当两个或者更多的margin合并时,产生的margin宽度为合并margin宽度中的最大值.至于负margin,就从正相邻margin的最大值中减去负相邻margin的绝对值的最大值.如果没有正marg

深入理解CSS中的margin

1.css margin可以改变容器的尺寸 元素尺寸 可视尺寸--标准盒子模型中盒子的宽度是不包括margin值的,clientWidth 占据尺寸--包括margin的宽度 outWidth不在标准之中,jquery中有相对应的方法 margin与可视尺寸 1.1使用那个与没有设定width/height的普通block水平元素 2.2只适用于水平方向尺寸 <body style="background-color:#1a2b3c"> <div style=&quo

margin塌陷现象

如果两个盒子是包含关系,如果让子盒子在父盒子之内向下平移100px:(margin塌陷现象)解决方案: padding , border , overflow <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>盒子模型</title> <style>/*margin塌陷*/ .box1 { wi

SVM3 Soft Margin SVM

之前分为两部分讨论过SVM.第一部分讨论了线性SVM,并且针对线性不可分的数据,把原始的问题转化为对偶的SVM求解.http://www.cnblogs.com/futurehau/p/6143178.html 然后考虑到特征数量特别特别多的时候,引入核函数的求解.http://www.cnblogs.com/futurehau/p/6149558.html 但是,之前也遗留了一个问题,就是比如高斯核函数或其他的核函数,虽然large margin能够在一定程度上防止过拟合,但是加入你的核函数太

margin小结

一. margin百分比 1. 普通元素的百分比margin都是相对于容器的宽度计算 2. 绝对定位元素的百分比margin是相对于第一个定位祖先元素(relative/absolute/fixed)的宽度计算 这是在默认的 writing-mode: horizontal-tb; 和 direction: ltr; 的情况下, 若书写模式变成纵向的时候,其参照将会变成包含块的高度. 二. margin重叠 1. 通常特性 block水平元素(不包括float和absolute元素) 不考虑wr

css之padding和margin

先看一个图: padding就是content内容到边框的距离,有四个值可以取,分别设置上右下左:padding-top,padding-right,padding-bottom,padding-left 可以简写为padding:1px,2px,3px,4px; content内容是什么? 最明显的就是图片,可以是输入框,可以是按钮,也可以是一段文字等. margin就是设置与其他元素的四个边, margin-top:本元素的上边和上边元素的下边的距离 margin-bottom:本元素下边和

margin,padding之我见

在网页布局中,margin和padding绝对会占很重要的作用,但是在实际的项目中,很多新手前端程序员们往往不能正确的使用它们,导致会出现一些不必要的麻烦,下面是我在前几天的项目中遇到的一些问题,以及个人总结的一些方法,仅供参考. 想比margin,padding则是要乖巧的多,几乎没有让你不省心的地方,我们知道,简单的padding语法有四种: eg:1.div1{padding:1px;}  (表示上下左右的内边距都是1PX) 2.div2{padding:1px 2px}; (上下边距是1

1 background(复合属性)与font(复合属性) 2 行内块的间距问题 3 行内元素的margin 4 清除浮动 5定位的元素的层级 6 Border-radius: 边框半径

1 background(复合属性)与font(复合属性): background: 颜色  图片的链接  是否平铺  背景位置 是否滚动.(可以随意调动或省略) Font: 粗度 字体风格 字体大小/行高 字体样式 字体大小和样式不可省略 2 行内块的间距问题 行内块元素相邻时,行内块元素之间会有几像素的间距,只有通过浮动解决. 3 行内元素的margin 行内元素的上下外边距不起作用,左右起作用. 4 清除浮动 给父盒子设置一个高度     Clear: both      Overflow

[ css 外边距 margin ] css中margin外边距合并问题讲解及实例演示

外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距;合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者 外边距合并外边距合并(叠加)是一个相当简单的概念.但是,在实践中对网页进行布局时,它会造成许多混淆.简单地说,外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距.合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者.当一个元素出现在另一个元素上面时,第一个元素的下外边距与第二个元素的上外边距会发生合并.请看下图: CSS 外边距合并实例 1 亲自试一试

Qt qss一些伪装态,以及margin与padding区别

伪状态    描述 :checked    button部件被选中:disabled    部件被禁用:enabled    部件被启用:focus    部件获得焦点:hover    鼠标位于部件上:indeterminate    checkbox或radiobutton被部分选中:off    部件可以切换,且处于off状态:on    部件可以切换,且处于on状态:pressed    部件被鼠标按下:unchecked    button部件未被选中 子部件    描述::down-