我真不懂margin

  平时很多问题,大多是知其然不知其所以然造成的。所以,明白了原理,在遇到问题就有了分析的思路。所以,我希望大家在遇到非标准的问题的时候,也就所谓的某些bug的时候,
多去探查一下,为什么会产生这种问题。解决的原理是什么,别解决了就算完了。现在的省事,会给你将来的成长埋下隐患。

  而往往所谓的bug,是对规范,原理的理解不透彻造成的。
  所以多问个为什么,虽尺有所短,但假以时日,必寸有所长。

本文主要涉及以下知识点点:

  • 垂直外边距合并
  • 什么时候用maigin,什么时候用padding
  • 行内替换元素和费替换元素
  • margin的基线
  • 盒子的物理大小,显示大小,逻辑大小
  • 浮动触发haslayout

了解了这些,就可以说margin我是懂点了。距离真正懂还差得远。下面是针对自己情况的一些笔记和总结。

具体详细的文档可参考  圆心、海玉的文章和w3c上的规范。 

http://www.planabc.net/2007/03/18/css_attribute_margin/    圆心

http://www.hicss.net/do-not-tell-me-you-understand-margin/  海玉

http://www.w3cplus.com/css/the-definitive-guide-to-using-negative-margins.html  大漠老师网站

感谢前辈们的心血。


  1. margin下面,父元素的背景可以看到。可以说margin的地方是透明的
  2. 当一个元素位于另一个元素中,且这个父元素没有东西来和子元素隔开(父元素有border或者padding都可以隔开子元素),那父元素与子元素的上/下外边距也会合并。
  3. 只有普通文档流中块框的垂直外边距才会发生外边距合并。行内框、浮动框或绝对定位之间的外边距不会合并。
    外边距合并只发生在垂直方向上,水平方向上是不会发生外边距合并的。
  4. 实际工作中,垂直外边距合并问题常见于第一个子元素的margin-top会顶开父元素与父元素相邻元素的间距,而且只在标准浏览器下(FirfFox、Chrome、Opera、Sarfi)产生问题,IE下反而表现良好。
    像水一样,接触后融合。但大小是之前大的那个。
  5. 根据规范,一个盒子如果没有上补白(padding-top)和上边框(border-top),那么这个盒子的上边距会和其内部文档流中的第一个子元素的上边距重叠
    注意,脱离文档流后不受影响。

  再说了白点就是:父元素的第一个子元素的上边距margin-top如果碰不到有效的border或者padding.就会不断一层一层的找自己“领导”(父元素,祖先元素)的麻烦,把自己的margin当领导的margin执行

  其中有类特殊的元素:如img|input|select|textarea|button|label等,他们被称为可置换元素(Replaced element)

  1. 他们区别一般inline元素(相对而言,称non-replaced element)是:这些元素拥有内在尺寸(intrinsic
    dimensions),他们可以设置width/height属性。他们的性质同设置了display:inline-block的元素一致。
    margin也能用于内联元素,这是规范所允许的,但是margin-top和margin-bottom对内联元素(对行)的高度没有影响,并且由于边界效果(margin效果)是透明的,他也没有任何的视觉影响。
  2. 给行内非替换元素设置上下margin是没用的。而且行内元素不会发生外边距合并。外边距合并只在垂直方向上。
    注意&nbsp也会占个位置
    行内替换元素,可以设置宽高,margin上下也会有效果。且不会在水平方向上有外边距合并,还是那句话,外边距合并只在垂直方向上。
  3. margin 属性可以应用于几乎所有的元素,除了表格显示类型(不包括 table-caption, table and inline-table)的元素,而且垂直外边距对非置换内联元素(non-replaced inline element)不起作用。
    置换元素(replaced element)主要是指 img, input,
    textarea, select, object 等这类默认就有 CSS 格式化外表范围的元素。
  4. 何谓参考线?参考线就是 margin 移动的基准点,此基准点相对于 box 是静止的。而 margin 的数值,就是 box 相对于参考线的位移量。

从上我们可以看到 top 和 left 都是以外元素为参考,而 right 和 bottom 以本元素为参考。上面的位移方向是指 margin 数值为正值时候的情形,如果是负值则位移方向相反。
box 的实际大小 = box 的物理大小 + 正的 margin

这仅对元素本身有效,对于其后面的相关元素,他们则只以 margin 的逻辑大小为准则,进行布局

结论:

box
最后的显示大小等于 box 的 border 及 border 内的大小加上正的 margin 值。而负的 margin 值不会影响 box 的实际大小,如果是负的 top 或 left 值会引起 box 的向上或向左位置移动,如果是 负的bottom
或 right 只会影响下面 box 的显示的参考线。

  实际的逻辑大小,是按照边边来算的。

  1. 基线,逻辑大小,物理大小,显示大小。
    基线是margin的关键。逻辑大小改变后,下一个block基线位置就变了,最后的定位还是看基线位置。尤其是上面和左面。
  2. 行内元素,设置了浮动,就可以设置宽高了
    float:left等浮动属性可以让inline元素haslayout,会让inline元素表现得跟inline-block元素的特性一样,支持高宽,垂直margin和padding等

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。

时间: 2024-11-06 09:57:03

我真不懂margin的相关文章

words2

餐具:coffee pot 咖啡壶coffee cup 咖啡杯paper towel 纸巾napkin 餐巾table cloth 桌布tea -pot 茶壶tea set 茶具tea tray 茶盘caddy 茶罐dish 碟plate 盘saucer 小碟子rice bowl 饭碗chopsticks 筷子soup spoon 汤匙knife 餐刀cup 杯子glass 玻璃杯mug 马克杯picnic lunch 便当fruit plate 水果盘toothpick 牙签中餐:bear's

从零开始学_JavaScript_系列(十)——dojo(3)(GRID表格创建、样式、列宽可变、排序、过滤器)

(34)gridx gridx系列插件并非和dojo的插件在一起 需要下载的请通过以下网址下载: http://oria.github.io/gridx/ 不过我也不太懂不同版本有什么区别(事实上我对gridx还属于新手水平) PS:dojo本身有dojox/grid插件,语法和gridx并不同,所以不能混用. PSS: 由于看这篇帖子的人,基本没办法自己和服务器/数据库互动,所以建议自己写一个json文件,然后get这个json文件(具体看之前的AJAX相关的,很简单,或者使用我下面给的例子也

java类文件结构(字节码文件)

[0]README 0.1)本文部分文字描述转自 "深入理解jvm",旨在学习类文件结构  的基础知识: 0.2)本文荔枝以及荔枝的分析均为原创: 0.3)下面的截图中有附注t*编号,不关乎博文内容: [1]类文件概述 1)各种不同平台的虚拟机与所有平台都统一使用存储格式--字节码,他是构成平台无关性的基石: 2)时至今日,商业机构和开源机构已经在 java语言外发展出一大批在 jvm 上运行的语言,如 Groovy, JRuby, Jython,Scala等: 3)实现语言无关性的基

bcdedit 替代easybcd 编辑grub

bcdedit这个命令是win7下,继续安装xubuntu时遇到的.当时xubuntu的语言设置为en-us,时区改为HK,可是仍有很多不太适应的地方.于是,删了xubuntu,重装它.同时,grub也被干掉了!当时,正好赶上过年,就用大白菜恢复了一下. 近段时间准备学习这个命令.小白一个,大牛尽管喷. bcdedit.exe命令行工具用于修改启动配置数据存储.启动配置数据存储包含启动配置参数并控制操作系统的启动方式.这些参数以前位于Boot.ini文件中(在基于BIOS的操作系统中)或位于稳定

代码亦或其他,苍穹之下,同呼吸共命运

cnblog是开发者的圈子,第一篇文章却发表的是与IT没有关系的内容,担心了好久怕被管理员删掉.又一想,自己哪次不是顾虑这个顾虑那个,最后什么都没有干吗,管理员估计至少维护网站首页的内容吧,如果看见了,还请手下留情. <苍穹之下,同呼吸共命运>这个纪录片最近很火,又不知道从哪里听来柴静被带走了,这些撇到一边不论,单单看这个纪录片,我觉得柴静的行为对所有中国人都有有意义的,甚至可以说是伟大的,千万不要把伟大等同于秦皇汉武周总理这些人或者长城兵马俑这些遗迹.有很多人质疑柴静,还有批判,但是我觉得我

隐藏Console窗口无效(续1)

[2014/10/19  23:57 ] :通过端口远程控制主机.运行程序之后,程序自动开放本机的999端口,其他电脑便可以通过999端口对本机操作. 程序中使用的到的命令: telnet测试端口命令: telnet IP 端口 或者 telnet 域名 端口(若telnet不是内部命令,使用打开或关闭windows功能,启动Telnet服务) netstat 测试开放的端口号 使用ipconfig控制网络连接的一个命令行工具.它的主要功用,包括用来显示现时网络连接的设置(/all参数),或通过

Oracle/Hive/Impala SQL比较(5)

5 Function 指数据库内置的function,不讨论UDF.另外,操作符都不比较了,区别不大. 5.1 数学函数 功能 Oracle Hive Impala ABS 绝对值,有 有 有 SIN/SINH/ASIN/COS/COSH/ACOS/TAN/TANH/ATAN/ATAN2 三角函数 其中ATAN2接受两个参数(二维平面中的坐标) 没有SINH/COSH/TANH/ATAN2 同hive BITAND 按位与,有 CEIL 天花板值,有 有,还有个别名CEILING 有,同hive

做了很多年的择校服务,感慨万千

说真的,做了好几年的择校服务,感觉现在家长和孩子的压力一年比一年大.考一些私立小学的孩子,遇到的题目是日新月异,家长要面对的择校服务费也是一天比一天贵,明年龙宝宝幼升小,猪宝宝小升初,估计很多学校的名额价格又要炒的上天,我真不懂,这么拼命的不想输在起跑线上,值得吗? http://blog.tianya.cn/post-7637394-126235876-1.shtmlhttp://blog.tianya.cn/post-7637394-126235880-1.shtmlhttp://blog.

评论整理——第一期:中国彩虹5无人机首飞成功,中国网友热评

中国彩虹5无人机首飞成功,中国网友热评 原标题:中国量产型彩虹5大型无人机首飞 远远领先俄罗斯 据全球无人机网7月15日报道,下翼展21米.一身灰色的量产型彩虹五无人机在河北某机场跑道上滑行起飞,成功完成首次试飞.这标志着自2016年珠海航展上首次亮相后,我国自主研发的中高端大型"察打一体"无人机彩虹五正式进入批量生产阶段,为后续产品交付和合同签订奠定了良好的基础. 看到这则报道与俄罗斯无人机对比,有网友指责不厚道: macise[湖北省武汉市网友] 怎么不说远超美国呢?俄罗斯这方面有