Margin-top在Firefox中出错原因及解决方法

源文地址:http://www.jxbh.cn/newshow.asp?id=586&tag=2

 

 

经常会遇到Firefox下margin-top这失效的问题,但一直都是用变通的方式去解决,在这个说明 中,“collapsingmargins”(折叠margin)的意思是:2个或以上盒模型之间(关系可以是相邻或嵌套)相邻的margin属性(这之 间不能有非空内容、padding区域、border边框或使用清除分离方法)结合表示为一个单独的margin。
在CSS2.1中,水平的margin不会被折叠,垂直margin可能在一些盒模型中被折叠:
1、在常规文档流中,2个或以上的块级盒模型相邻的垂直margin会被折叠。
最终的margin值计算方法如下:
a、全部都为正值,取最大者;
b、不全是正值,则都取绝对值,然后用正值减去最大值;
c、没有正值,则都取绝对值,然后用0减去最大值。
注意:相邻的盒模型可能由DOM元素动态产生并没有相邻或继承关系。
2、相邻的和模型中,如果其中的一个是浮动的(floated),垂直margin不会被折叠,甚至一个浮动的盒模型和它的子元素之间也是这样。
3、设置了overflow属性的元素和它的子元素之间的margin不会被折叠(overflow取值为visible除外)。
4、设置了绝对定位(position:absolute)的盒模型,垂直margin不会被折叠,甚至和他们的子元素之间也是一样。
5、设置了display:inline-block的元素,垂直margin不会被折叠,甚至和他们的子元素之间也是一样。
6、如果一个盒模型的上下margin相邻,这时它的margin可能折叠覆盖(collapsethrough)它。在这种情况下,元素的位置 (position)取决于它的相邻元素的margin是否被折叠。
a、如果元素的margin和它的父元素的margin-top折叠在一起,盒模型border-top的边界定义和它的父元素相同。
b、另外,任意元素的父元素不参与margin的折叠,或者说只有父元素的margin-bottom是参与计算的。如果元素的border-top非 零,那么元素的border-top边界位置和原来一样。
一个应用了清除操作的元素的margin-top绝不会和它的块级父元素的margin-bottom折叠。
注意:
那些已经被折叠覆盖的元素的位置对其他已经被折叠的元素的位置没有任何影响;只有在对这些元素的子元素布局时,border-top边界位置才是必需的。
7、根元素的垂直margin不会被折叠。
浮动的块级元素的margin-bottom总是与它后面的浮动块级兄弟元素(floatednextin-flowblock- levelsibling)的margin-top相邻,除非那个同级元素使用了清除操作。
浮动的块级元素的margin-top和它的第一个浮动块级子元素(floatedfirstin-flowblock-levelchild)的 margin-top相邻(如果该元素没有border-top,没有padding-top,并且子元素没有使用清除操作)。
浮动的块级元素的margin-bottom如果符合下列条件,那么它和它的最后一个浮动块级子元素的margin-bottom相邻(如果该元素没有指 定padding-bottom或border):
a、指定了height:auto
b、min-height小于元素的实际使用高度(height)
c、max-height大于元素的实际使用高度(height)
如果一个元素的min-height属性设置为0,那么它所拥有的margin是相邻的,并且它既没有border-top和border- bottom,也没有padding-top和padding-bottom,它的height属性可以是0或auto,它不能包含一个内联的盒模型 (linebox),它所有的浮动子元素(如果有的话)的margin也都是相邻的。
当一个元素拥有的margin折叠了,并且它使用了清除操作,那么它的margin-top会和紧随其后的兄弟元素的相邻margin折叠,但结果是它的 margin将无法和其块级父元素的margin-bottom折叠。
折叠操作是以padding、margin、border的值为基础的(即在浏览器解析所有这些值之后),折叠后的margin计算将覆盖已使用的不同 margin的值。

IE6中常见CSS兼容性解决技巧
1、使用一个声明
你必须经常在HTML网页头部放置一个声明,推荐使用严格的标准。同时需要是IE6进入兼容模式,这已经足够兼容的了。
2、使用position:relative
设置一个标签position:relative可以解决很多问题,特别是曾经有过看不见的经历或者奇怪布局的框架。明显的,你需要小心,绝对位置放置的 子元素是否都参照找到新位置。
3、为浮动元素使用display:inline
浮动元素会有一个著名的IE6双边距marginbug。假如你设置了左边距5px但实际上得到了10px左边距。display:inline可以解决 这个问题,尽管它不是必需的,但是CSS仍然有效。
4、设置元素启动hasLayout
大部分IE6(IE7)的渲染问题都可以通过起来元素的hasLayout属性来兼容。这是IE内置的设定,确定一个内容块相对其它内容块是有界限和位置 的。当你需要设置一个行内元素例如一个连接变成块状元素或者是透明效果,设置hasLayout也是必须的。
5、修复重复字符的bug
复杂的布局会触发一个bug:浮动对象的最后字符会出现在已经清除浮动的元素后面。这里有几种解决的办法,部分是理想的,并且一些测试和出错是必须的。
◆确保浮动元素都使用:display:inline;
◆最后一个浮动元素使用margin-right:-3px;
◆在浮动对象最后一个元素后使用一个条件注释。例如这里输入注释…
◆在容器内的最后使用一个div空标签(它也必须设置90%宽度甚至更小)。
6、使用a标签完成可点击和hover原理
IE6只支持a标签的CSS定义hover效果,你可以使用它去控制javascript启动的widgets,使得他们仍然保持键盘操作。这里有 个二择一的问题,但是a标签是所有解决方案中最可靠的。IE6不支持“min-height”并且错误的将20em重写为“auto”。不过,当内容大于 设置的空间时,它会增加它的尺寸。另外一个选择是使用高级选择符。例如:
以下是代码片段: 

#element{min-height:20em;height:20em;}  

/*ignoredbyIE6*/#element[id]{height:auto;}  

7、使用!important,或是高级选择符替代IE特定代码
在外置的CSS文件里,放弃凭借传统的hacks和条件判断,使用有效的CSS代码去针对IE6仍然是有可能的。例如:最小高度可以使用一下定义。 

 #element{min-height:20em;height:auto!important;

/*understoodbyallbrowsers*  

/height:20em;/*IE6incorrectlyusesthisvalue/*}  

8、避免百分比定义
百分比在IE下比较混乱。除非你非常小心每个父元素的尺寸,这样就大概可以最后避免了。你仍然可以对其他浏览器使用!important来使用百分值。例 如:

body{margin:2%0!important;margin:20px0;/*IE6only*/}  

9、早点和经常测试
在你的网站和应用程序完成之前,不要放弃IE6的测试。问题将会更加严重并且需要很长时间去修复。如果你的网站可以运行于FireFox和IE6,它将差 不多肯定可以在其它浏览器下运行。
10、重构你的代码
经常的,修复会比重新考虑布局问题更加花费时间。Html细微的修改和更加简单的CSS经常是最有效的。这意味着你要放弃完美的合法的代码,但是将会更少 的问题出现,并且你知道怎样处理将要出现的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值