CSS 常见问题的解决

当你在一个浏览器里面做好,在其他浏览器里面却完全不是那么回事情。

很多时候,我们就只是去修补下,或者利用各个浏览器对代码支持的不一致,进行针对各个浏览器进行不同的定义。

其实浏览器的不兼容,我们往往是各个浏览器对于一些标准的定义不一致导致的,因此,我们可以进行一些初始化,很多问题都很轻松解决。

  1. 文字本身的大小不兼容。同样是 font-size:14px 的宋体文字,在不同浏览器下占的空间是不一样的,ie 下实际占高 16px,下留白 3px,而 ff 下实际占高 17px,上留白 1px,下留白 3px,opera 下就更不一样了。解决方案:给文字设定 line-height。确保所有文字都有默认的 line-height 值。这点很重要,在高度上我们不能容忍 1px 的差异。

  2. ff 下容器高度限定,即容器定义了 height 之后,容器边框的外形就确定了,不会被内容撑大,而 ie下是会被内容撑大,高度限定失效。所以不要轻易给容器定义 height。

  3. 横向上的撑破容器问题。如果 float 容器未定义宽度,ff 下内容会尽可能撑开容器宽度,ie 下则会优先考虑内容折行。故内容可能撑破的浮动容器需要定义 width。

    小实验:有兴趣大家可以看看这段实验。在不同浏览器下分别测试以下各项代码。

<div style="border:1px solid red;height:10px"></div> 
<div style="border:1px solid red;width:10px"></div> 
<div style="border:1px solid red;float:left"></div> 
<div style="border:1px solid red;overflow:hidden"></div>
  1. 上面的代码在不同浏览器中是不一样的,实验起源于对小 height 值 div 的运用,

    ,小 height 值要配合overflow:hidden 一起使用。实验好玩而已,想说明的是,浏览器对容器的边界解释是大不相同的,容器内容的影响结果各不相同。

  2. 最被痛恨的,double-margin bug。ie6 下给浮动容器定义 margin-left 或者 margin-right 实际效果是数值的2倍。解决方案,给浮动容器定义 display:inline。

  3. mirror margin bug,当外层元素内有 float 元素时,外层元素如定义 margin-top:14px,将自动生成 margin-bottom:14px。 padding 也会出现类似问题,都是 ie6 下的特产,该类bug 出现的情况较为复杂,远不只这一种出现条件,还没系统整理。解决方案:外层元素设定 border 或设定 float。

    引申:ff 和 ie 下对容器的 margin-bottom,padding-bottom 的解释有时不一致,似乎与之相关。

  4. 吞吃现象。还是 ie6,上下两个 div,上面的 div 设置背景,却发现下面没有设置背景的 div 也有了背景,这就是吞吃现象。对应上面的背景吞吃现象,还有滚动下边框缺失的现象。解决方案:使用 zoom:1。这个 zoom 好象是专门为解决 ie6 bug 而生的。

  5. 注释也能产生 bug~~~“多出来的一只猪。”这是前人总结这个 bug 使用的文案,ie6 的这个 bug 下,大家会在页面看到猪字出现两遍,重复的内容量因注释的多少而变。解决方案:用“<!–[if !IE]> picRotate start <![endif]–>”方法写注释。

  6. img 下的留白,大家看这段代码有啥问题:

 

把 div 的 border 打开,你发现图片底部不是紧贴着容器底部的,是 img 后面的空白字符造成,要消除必须这样写。

  
  1. 后面两个标签要紧挨着。ie7 下这个 bug 依然存在。解决方案:给 img 设定 display:block。

  2. 失去line-height。

    文字
    ,很遗憾,在 ie6 下单行文字 line-height 效果消失了。原因是这个 inline-block 元素和inline 元素写在一起了。解决方案:让 img 和文字都 float 起来。

    引申:大家知道 img 的 align 有 text-top,middle,absmiddle 啊什么的,你可以尝试去调整 img 和文字让他们在 ie 和 ff 下能一致,你会发现怎么调都不会让你满意。索性让 img 和文字都 float 起来,用 margin 调整。

  3. clear 层应该单独使用。也许你为了节省代码把 clear 属性直接放到下面的一个内容层,这样有问题,不仅仅是 ff 和 op下失去 margin 效果,ie 下某些 margin 值也会失效。

dd
ff
  1. ie 下 overflow:hidden 对其下的绝对层 position:absolute 或者相对层 position:relative 无效。解决方案:给 overflow:hidden 加 position:relative 或者 position: absolute。另,ie6 支持 overflow-x 或者 overflow-y 的特性,ie7、ff 不支持。

  2. ie6 下严重的 bug,float 元素如没定义宽度,内部如有 div 定义了 height 或 zoom:1,这个 div 就会占满一整行,即使你给了宽度。float 元素如果作为布局用或复杂的容器,都要给个宽度的。

  3. ie6 下的 bug,绝对定位的 div 下包含相对定位的 div,如果给内层相对定位的 div 高度 height 具体值,内层相对层将具有 100% 的 width 值,外层绝对层将被撑大。解决方案给内层相对层 float 属性。

  4. width:100% 这个东西在 ie 里用很方便,会向上逐层搜索 width 值,忽视浮动层的影响,ff 下搜索至浮动层结束,如此,只能给中间的所有浮动层加 width:100% 才行,累啊。opera 这点倒学乖了跟了 ie。