margin-top 无效,避开麻烦的margin叠加(margin collapsing)

问题:

<div id="top" style="height:100px;background-color:#CCC;"></div>
<div id="parent" style="background-color:#F9F; overflow:hidden;">
<div id="child" style="margin-top:10px; background-color:#99F;">想实现效果: Chile 与 parent 间有 10px 间距 <br /> 可 margin-top:10px; 后, 是 parent 与 wrap 间有 10px 间距</div><div></div>
</div>

暂时解決方法:

1、在 parent 窗体中 加入 : overflow:hidden;

2、在父级内部的添加上、下两个空元素    : 有些教科书上将这种方法称为完美的解决方法。但实际当中我们一般不会使用,因为这种方法不仅要多加两个无意义元素标签,对这两个元素还要特别设置CSS使其高度为0。)

3、給 parent 窗体加 个 border 属性,属性值不能为 none; 0 ;

4、parent 窗体加: float:left; (clear:both;)

以下转自:http://www.cssass.com/blog/?p=164

斯芬克斯——ie私有属性haslayout这篇文章中,我们提到的第一个斯芬克斯之迷,其实就是一个margin叠加问题。
关于margin collapsing,在W3C中是有明文规范的,符合其规则的都将产生margin collapsing。W3C认为margin叠加后的布局界面更良好。

margin collapsing(css2.1规范)
margin collapsing(css2规范)

margin叠加现象(父子级别):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<head>
<style type="text/css">
*{padding:0;margin:0;}
#wrap{background:#ccc;}
#content{background:#eee;margin:50px 0;}
</style>
</head>
<body>
<div id="wrap">
<div id="content">margin:50px 0;</div>
</div>
</body>
</html>

可以看出wrap未被子层的margin所撑开。

但是,这种margin叠加往往不是我们所想要的效果(一些人甚至将此称为一个bug:margin叠加bug,也有称高度不适应bug的)——平心而论,我们努力的要避开margin collapsing多少也有些违背了W3C的初衷。不过,由于ie下经常有意无意的会触发haslayout,从而会避开margin叠加,这使得浏览器间显示不一。因此,我们还是有理由在适当时候彻底避开margin叠加的。

那么,如何避免这种margin叠加现象呢?

从《斯芬克斯——ie私有属性haslayout》那篇文章中,我们知道,ie下触发haslayout可以避开margin叠加。那么其他浏览器呢?

我们先看一下另两种解决方法。
方法一:在父级内部的添加上、下两个空元素。
有些教科书上将这种方法称为完美的解决方法。但实际当中我们一般不会使用,因为这种方法不仅要多加两个无意义元素标签,对这两个元素还要特别设置CSS使其高度为0。):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<head>
<style type="text/css">
*{padding:0;margin:0;}
#wrap{background:#ccc;}
#content{background:#eee;margin:50px 0;}
</style>
</head>
<body>
<div id="wrap">
<div>&nbsp;</div>
<div id="content">margin:50px 0;<br />上下各添加一个额外空元素。元素只要不脱离文档流,就能在ie,ff等浏览器下避开margin-top塌陷。如果元素是脱离文档流的,只要是触发了haslayout,在ie下也能避开塌陷。这两个元素一般要设置其高为0,而不让其增加页面的额外高度。</div>
<div>&nbsp;</div>
</div>
</body>
</html>
第二种,在父级上使用border属性(属性值0和none除外)。
这个方法也不大经常使用,因为在wrap上至少要设置一个1px的多余边框(上下两个就是2px),而且这条边线的颜色的颜色设置也是个问题,因为可能在wrap内部会使用背景图片(background-image),那么这条边线就无法伪装隐藏了。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<head>
<style type="text/css">
*{padding:0;margin:0;}
#wrap{background:#ccc;border:1px solid #ccc} /* border的颜色设置同background一样 */
#content{background:#eee;margin:50px 0;}
</style>
</head>
<body>
<div id="wrap">
<div id="content">margin:50px 0;</div>
</div>
</body>
</html>

最后一个方法,就利用到了ie的haslayout原理了(清除浮动也用到了这种方法)。对于ff下,在父级(wrap)上使用overflow:hidden;对于ie则触发其layout——如何触发,可以看这篇文章:on having layout

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<head>
<style type="text/css">
*{padding:0;margin:0;}
#wrap{background:#ccc;overflow:hidden;width:100%}
#content{background:#eee;margin:50px 0;}
</style>
</head>
<body>
<div id="wrap">
<div id="content">margin:50px 0;</div>
</div>
</body>
</html>

(overflow:hidden也会触发ie7中的layout。但是对之前的ie版本无效,否则倒是可以一个属性搞定)。

火狐在win7下和windows xp下,对CSS解析的不一致

在做公司网站的导航的时候,碰到了这个问题。windows xp下面的火狐和win7下面的火狐显示出来的版面不一致!win7下面,容器overflow了。找到下面这篇资料。这也暴露出一个设计上的问题:控制显示效果,除非异常巧妙和灵活,否则不能把设计付托给自适应的宽度和高度。通常为了达到精确的一致,只能做成固定像素的大小。这样,才能确保万无一失。

CSS中,FireFox火狐对Arial字体的英文字母"特别照顾" 总是会放大,而在IE和Chrome下却不会放大.
这些都是在win7系统才能看到.如果你不打算兼容win7用户,那么本篇文章可以忽略.
我怀疑Win7和WinXP中自带的Arial字体是不是不一样,分别查看版本,5.06和3.00.
于是在Win7中,我往一张图片PS了几个字母,保存,然后发到WinXP系统中,PS了同样的字母,发现大小是完全相同的.那就不是字体问题了.
得出一个结论,FireFox在Win7中对Arial字体特别有爱.

当你在win7下,用火狐看到某个容器中的行尾有几个中文字换行时,而在IE和Chrome中不换行,请不要奇怪.
很可能是你用了Arial字体,并且那个句子中带有英文字母.难道win7中自带的Arial字体和WinXP的不一样???

解决办法?唯有把容器设宽一点,或者放弃使用Arial字体.

来源:http://hi.baidu.com/boden/blog/item/10f18e38e7b7a9fd3a87ce8d.html

css文件可以从站外加载?

今天处理了潮人社团遗留下来的部分问题。后台使用formValidator,这在没有启用独立二级域名、使用URL重写之前是完全没问题的——跟总站共享一份formValidator。

启用了独立的二级域名以后,原来的文件夹,现在变成了根目录。这就是说,无法通过相对路径、绝对路径取得总站的其他文件夹的资源了。我们知道,js文件是支持从站外加载的。那么css文件呢?实践证明,也是可以的。在引用文件地址前面,加上完整的URI,真是个好主意。

题外话,一个服务器,一个IP地址,一个站点,实现二级域名、三级域名。结合ISAPI Rewriter和ASP.NET,我们做到了。不过一系列细节问题,处理起来很麻烦。

margin-top 无效问题及解决方法

今天在做潮汕风情网专题的友情链接时,再次碰到了这个问题。其产生的原因是其父容器的hasLayout属性没有被触发(火狐中也是这种情况)。解决方法是通过给父容器添加特定的属性,以触发其hasLayout属性。

可触发hasLayout的属性有:overflow:hidden,border:solid 1px #fff,float:left

当然,也可以通过在顶部和底部添加两个空元素来解决。

参考链接:http://hi.baidu.com/mengqing723/blog/item/9df9aecb17d20df752664f53.html margin-top 无效,避开麻烦的margin叠加(margin collapsing)

公告栏

  • 姓名:林剑锋(不见不散)
  • 来自:中国-广州
  • 简介:潮汕人,出生于广东揭西。醉心于Web开发8年,挑战了一年整体策划和网站运营。目前就职于平成混媒IT部。
  • Email/QQ:admin@ljf.cn

QQ群:设计学院 68075618,网站设计师 9908776

统计

文章:335篇
评论:163条 (2条Spam)
相册:1个 (120张图片)
主题:Nagrand新主题

www.ljf.cn网站PR查询