DIV+CSS 浏览器兼容

所有浏览器 通用
height: 100px;

IE6 专用
_height: 100px;

IE6 专用
*height: 100px;

IE7 专用
*+height: 100px;

IE7、FF 共用
height: 100px !important;

 


程序代码

height:100px;
*height:120px;
_height:150px;

下面我简单解释一下各浏览器怎样理解这三个属性:

在FF下,第2、3个属性FF不认识,所以它读的是 height:100px;

在IE7下,第三个属性IE7不认识,所以它读第1、2个属性,又因为第二个属性覆盖了第一个属性,所以IE7最终读出的是第2个属性 *height:120px;

在IE6下,三个属性IE6都认识,所以三个属性都可以读取,又因为第三个属性覆盖掉前2个属性,所以IE6最终读取的是第三个属性。


 

1.为什么在不同的浏览器显示效果不一样? 
因为不同浏览器对于css样式表的解析不一样,所以导致样式乃至层布局发生变化。例如,ff中设置padding属性时,div会相应增加height和width,而ie的解析是不会的,再例如ff对盒模型的解析和ie相差两个象素。

2.设计时要做到所有浏览器都兼容吗? 
根据“设计诉说”的站点统计小样本结果显示,6225个访问者中有72.1%使用IE6.0;12.7%使用IE7.0;7.9%在使用FF2.0,剩余的不同版本的浏览器占的百分比都不到1% 。所以我认为只要做到IE6 FF2.0 以及新出的IE7.0兼容即可,顶多向下兼容一下IE5.5,完全没有必要为了那些个小数点费劲脑子。如果有必要可以另外设计css文件,然后通过js判断浏览器版本进行选择相应的文件。

3.css样式的优先级是怎么样的? 
在正常的IE中,如果你在css中重复定义一个属性时,浏览器解析的是后面的属性,

示例:box {height:100px;height:200px;height:400px;height:300px;}


<1> 区分三款浏览器简单方法: 
#example { color: #333; } /* Moz FF */ 
* html #example { color: #f0f; } /* IE6 */ 
*+html #example { color: #0ff; } /* IE7 */ 
在兼容IE7的*+html的hack一定要在顶部加入DTD声明,否则无效。

 

<2> ie7.0与ie6.0的之间不兼容 
ie7与ie6 在div+css出现宽度定义不同,在宽度定义上出现宽度的解释不同

IE7宽度在IE6上要宽一些,正是这个原因网页可能会出现溢出问题, 还好这个问题可以通过更改数值或者修改一下百分比解决.。

ie7.0修复了!important这个bug。

先前由于ie6.0对!important识别存在bug, 在firefox和IE中的BOX模型解释不一致导致相差2px,大部分网页标准设计师通过这个bug来兼容 ie6.0和firefox,

即采用:div {margin:30px!important;margin:28px;}。

但是ie7.0把这个bug给修复了,所以问题又出现了,怎么兼容 ie.7.0的同时又能兼容ie6.0和firefox?

不过ie7 也能识别!important 也可以通过这个来区分IE6。 ie7.0对很多不规范的css不再支持,对js语法要求更严格规范。 很多在IE6下正常显示的js页面,在IE7下均不能正常显示,并且还没有提示错误。

ie7.0对js语法要求更严格规范,只是这个规范似乎并没有说明,也没有明白的告诉大家,他们是怎么“规”怎么“范”的 .

 

<3> 如何做到让IE6.0与FF兼容? 
最常用的一种方法了,也是屡试不爽的——“!important”,这个字段是用来提高优先级的,而IE6.0对于找个字段是无法识别的,于是FF与 IE6.0就可以分开解析。

 

注意事项: 
1、float的div一定要闭合。 
例如:(其中floatA、floatB的属性已经设置为float:left;) 
< #div id="floatA" > 
< #div id="floatB" > 
< #div id="NOTfloatC" > 
这里的NOTfloatC并不希望继续平移,而是希望往下排。这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将 float标签闭合。

在 
< #div class="floatB"> 
< #div class="NOTfloatC"> 
之间加上 
< #div class="clear"> 
这个div一定要注意声明位置,一定要放在最恰当的地方,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。

此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden;

当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性,用zoom:1;可以做到,这样就达到了兼容。

例如某一个wrapper如下定义:colwrapper{overflow:hidden;zoom:1;margin:5px auto;}

 

2、margin加倍的问题 
设置为float的div在ie下设置的margin会加倍,这是一个ie6都存在的bug。

解决方案是在这 个div里面加上display:inline

相应的css为 
#IamFloat{ 
                   float:left; 
                   margin:5px;/*IE下理解为10px*/ 
                   display:inline;/*IE下再理解为5px*/}

 

3、关于容器的包涵关系 
很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在IE中,外层的宽度会被内层更宽的div挤破。

一定要用Photoshop或者Firework量取像素级的精度。

 

4、关于高度的问题 
如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。

 

5、最狠的手段 —— !important; 
如果实在没有办法解决一些细节问题,可以用这个方法。FF对于”!important”会自动优先解析,然而IE则会忽略,

值得注意的是,一定要将 xxxx !important 这句放置在另一句之上.

 

6.DOCTYPE 影响 CSS 处理

 

7.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行.

 

8.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中.

 

9.FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width.

 

10.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式

 

11.div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了 。缺点是要控制内容不要换行

 

12.cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以.

 

13.FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。

    参照 menubar, 给 a 和 menubar 设置高 度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。

 

14.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法:

div{margin:30px!important;margin:28px;}

注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器可以识别。

所以在IE下其实解释 成这样: 

div{maring:30px;margin:28px} 
重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important; 
  

15.IE5 和IE6的BOX解释不一致 

IE5下 :div{width:300px;margin:0 10px 0 10px;} 

div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在IE6和其他浏览器上宽度则是以300px+10px(右填 充)+10px(左填充)=320px来计算的。

这时我们可以做如下修改:
div{width:300px!important;width /**/:340px;margin:0 10px 0 10px} 

16.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值,

所以先定义 :ul{margin:0;padding:0;}     就能解决大部分问题

 

17.ff下父容器的高度自适应 
  height:100%; overflow:auto

 

18.各浏览器padding兼容 
padding:0px;  /*ff*/ 
*padding:0px; /*ie7.0*/ 
_padding:0px; /*ie6.0 */

 

19.img 下的留白

大家看这段代码有啥问题: 
<div> 
<img src=”" mce_src=”" /> 
</div> 
把div的border打开,你发现图片底部不是紧贴着容器底部的,是img后面的空白字符造成,要消除必须这样写 
<div> 
<img src=”" mce_src=”" /></div> 

 

20. 失去line-height

<div style=”line-height:20px”><img />文字</div>,很遗憾,在ie6下单行文字 line-height 效果消失了。

原因是<img />这个inline-block元素和inline元素写在一起了。解决方案:让img 和文字都 float起来 


21 .IE 5.x/Win
在此我们指Windows平台上的IE 5.0和IE 5.5。CSS的支持依然很糟糕,但是比起NN 4.x已经有了长足的改变。

它们臭名昭著错误的盒状模型(Box model)可能是导致CSS界第一个hack的出现。我们先来看看盒状模型。

W3C规范的盒子,可以使用“相加”来描述,即,一个元素的实际盒子宽度是由内容宽度(content width),边框(border),边距(padding)堆积起来的。

而IE 5.x/Win则可以用“相减”来描述,也被称为边框盒状模型(border box model),一个元素的实际宽度就是该元素的width设值,边框,边距都从中减去。

 

来看一个例子:
div { width: 200px; margin: 20px; padding: 20px; border: 5px;}

依照W3C规范,这个div实际所占宽度是5px + 20px + 200px + 20px + 5px。

而对IE5.x/Win的边框盒状模型来说,这个div实际宽度就是200px,而内容宽度被压迫到只有150px:200px - 5px - 20px - 20px - 5px。这时候,出现了Box Model Hack.

该hack使用了IE 5.x/Win不支持的voice-family,并在值中设置一些CSS转义引号(CSS-escape quotes)欺骗IE 5.x/Win认为规则块(declaration block)已经闭合。

div { /*为了更好说明,width调了一下写作习惯*/ margin: 20px; padding: 20px; border: 5px; width: 240px;           /* 1. IE 5.x/Win需要的宽度 */ voice-family: "\"}\"";  /* 2. IE

5.x/Win看见了},认为规则已经结束了 */ voice-family: inherit;  /* 3. 能够正确解析的浏览器重置该值 */ width: 200px;           /* 4. 这才是我们需要的真正宽度 */}  

 

21.图片下方出现几像素的空白间隙
问题说明:这个问题在ie6和ff(火狐)下经常见到。

例如 <div><img src=""/></div>这个图片下面会有一条空白间隙。

解决方法:给图上一个垂直方向的属性如:vertical-align: top(任意一个就行middle);

这个问题从而延伸到——object(视频)和textarea在火狐下也会出现类似的问题,解决方法一样。

重置代码里就有这样一个全局定义:object,textarea,img{vertical-align: top;}


22.IE6双倍margin的BUG(双边距)
问题说明:这是ie6一个著名的bug,当一个元素向一边浮动时,其它同一个方向如果有margin的话,ie6就会产生双倍的margin。

例如:<div style="float: left;margin-left: 10px;"></div>在ie6下显示会有margin-left:20px的距离

解决方法:加个_display:inline:属性

例如<div style="float: left;margin-left: 10px;_display: inline;"></div>


23.ie6下的浮动元素和非浮动元素间出现3像素BUG
问题说明:这也是ie6一个著名的bug,当一个元素浮动时,同级别的文字没有浮动,在ie6下它们之间就会产生3个像素的bug。

例如:<div><img style="float: left;" src=""/>摘要摘要摘要摘要</div>,图片和文字就会出现3像素

解决方法:方法一,两个元素都浮动,

如:<div><img style="float: left;" src=""/><span style="float: left;">摘要摘要摘要摘要</span></div>;

方法二,这种设计时一般图片和文字要有间隙的,做个ie6的hack就行,

如:<div><img style="float: left;" src=""/><span style="margin-right: 5px; _margin-right: 2px;">摘要摘要摘要摘要</span></div>


24.li在IE中底部空行
问题说明:当li里面有两个以上的浮动元素时,li的下面就会产生一条空白间隙,

例如:<ul class="tlist"><li><span style="float: left;">栏目</span><a style="float: left;" href="#" target="_blank">标题标题标题</a></li></ul>

解决方法:这个问题和第一个问题很相似,解决方法也是一样,在li上加个垂直方向的属性,

例如:<ul class="tlist"><li style="vertical-align: top;"><span style="float: left;">栏目</span><a style="float: left;" href="#" target="_blank">标题标题标题</a></li></ul>

 

25.IE6样式中文注释后引发失效

问题说明:这是ie6 出现的奇怪现象。这是由于css 和html 的编码不同所引致,满足下面条件就会引起注释下面的样式不起作用:

1). css有中文注释

2). css为ANSI编码

3). html为utf-8编码

解决方法:
1). 去掉中文注释,用英文注释或者多打几个“*”,这是ahuing在之前的教程里提到的,例如: /*** 注释 ***/
2). 统一css 和 html 的编码
建议采用第二种解决方法。ps: css为uft-8  html 为ANSI ,貌似不会出现失效的情况。



26
.IE6出现重复字符(文字溢出)


问题说明:一个容器包含2两个具有“float”样式的子容器,第二个容器的宽度大于父容器的宽度,或者父容器宽度减去第二个容器宽度的值小于3,在第二个容器前存在注释(这也是为什么此bug也叫做“IE6注释bug”的原因)。

例如下列代码:

 1 <!DOCTYPE html PUBLIC "-//W3C//liD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/liD/xhtml1-transitional.lid">
 2 
 3 <html xmlns="http://www.w3.org/1999/xhtml">
 4 
 5 <head>
 6 
 7 <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
 8 
 9 <title>标题</title>    
10 
11 <style>
12 
13 *{
14    margin: 0;padding: 0;font-size: 12px;
15 }
16  .a{width:205px;}
17 .b{
18     float: left;
19     width: 50px;
20     background: black;color: #fff;margin-right: 5px;
21     overflow: hidden;
22 }
23 .c{
24     float: left;
25     width: 150px;
26     background: red;
27 }
28 </style>
29 </head>
30 <body>
31         <div class="a">
32         <div class="b">测试测试测试测试测试测试测试111111111111</div>
33          <!-- 注释 -->
34         <div class="c">测试测试测试测试测试测试测试2222222222</div>
35 </div>
36 </body>
37 </html>

 

解决方法:

为何会出现重复文字,谁也没说清楚,包括官方,这个问题,个人认为,ie6将注释也当成内容存在。如何消灭重复文字,只要让上面任何一个条件不满足即可。

改变结构,不出现【一个容器包含2两个具有“float”样式的子容器】的结构。


1).减小第二个容器的宽度,使父容器宽度减去第二个容器宽度的值大于3。

2).去掉所有的注释。
3).在第二个容器后面加一个或者多个<div style="clear"></div>来解决。 
4).给溢出文字的标签加position: relative;属性 

27.png图片在IE6下出现透明或背景变灰的bug;

问题说明:这里的png图片是指32位和24位的,8位的png图片透明ie6是支持的。

解决方法:
1)使用滤镜,语法如下
.image-style 
{ background-image: none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src="filename.png", sizingMethod="scale"); }

注意:使用滤镜需要损耗性能。

2)给IE6单独制作一张.gif图片(或者8位的png图片),打上hack
.image-style{ background:transparent url("filename.png") no-repeat scroll 0 0;_background-image:url("filename.gif"); }

这种方法只需要在切图时多存储一份.gif格式的图片,一般采用这种方法。


参考:https://www.cnblogs.com/guchenfeng/p/4702004.html

转载于:https://www.cnblogs.com/shihaiying/p/11380447.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值