视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
浏览器,兼容性
2025-10-02 15:38:30 责编:小OO
文档
CSS在不同浏览器的兼容性问题

为什么会出现兼容性问题

所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。在大多数情况下,用户用什么浏览器来查看同一网站,都应该是统一的显示效果。所以浏览器的兼容性问题是前端开发人员经常会碰到和必须要解决的问题。

浏览器兼容问题一:不同浏览器的标签默认的外边框和内边框不同 

问题症状: 随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。

碰到频率: 100%

解决方案: css里    *{margin:0;padding:0;}

备注: 这个是最常见的也是最易解决的一个浏览器兼容性问题,几乎所有的css文件开头都会用通配符*来设置各个标签的内外边框是0。

浏览器兼容问题二:块属性标签float后,又有横行的margin情况下,在IE6显示margin比设置的大 

问题症状: 常见症状是IE6中后面的一块被顶到下一行

碰到频率: 90%(稍微复杂点的页面都会碰到,float布局最常见的浏览器兼容问题)

解决方案: 在float的标签样式控制中加入 display:inline;将其转化为行内属性

备注: 我们最常用的就是div+css布局了,而div就是一个典型的块属性标签,横向布局的时候我们通常都是用div float实现的,横向的间距设置如果用margin实现,这就是一个必然会碰到的兼容性问题。

浏览器兼容问题三:设置较小高度标签(一般小于10px),在IE6,IE7,遨游中高度超出自己设置高度 

问题症状: IE6、7和遨游里这个标签的高度不受控制,超出自己设置的高度

碰到频率: 60%

解决方案: 给超出高度的标签设置overflow:hidden;或者设置行高line-height 小于你设置的高度。

备注: 这种情况一般出现在我们设置小圆角背景的标签里。出现这个问题的原因是IE8之前的浏览器都会给标签一个最小默认的行高的高度。即使你的标签是空的,这个标签的高度还是会达到默认的行高。

浏览器兼容问题四:行内属性标签,设置display:block后采用float布局,又有横行的margin的情况,IE6间距bug(类似第二种) 

问题症状: IE6里的间距比超过设置的间距

碰到几率: 20%

解决方案: 在display:block;后面加入display:inline;display:table;

备注: 行内属性标签,为了设置宽高,我们需要设置display:block;(除了 input标签比较特殊)。在用float布局并有横向的margin后,在IE6下,他就具有了块属性float后的横向margin的bug。不过因为它本身就是行内属性标签,所以我们再加上display:inline的话,它的高宽就不可设了。这时候我们还需要在display:inline后面加入display:talbe。

浏览器兼容问题五:图片默认有间距 

问题症状: 几个img标签放在一起的时候,有些浏览器会有默认的间距,加了问题一中提到的通配符也不起作用。

碰到几率 :20%

解决方案: 使用float属性为img布局

备注: 因为img标签是行内属性标签,所以只要不超出容器宽度,img标签都会排在一行里,但是部分浏览器的img标签之间会有个间距。去掉这个间距使用float是正道。(使用负margin,虽然能解决,但负margin 本身就是容易引起浏览器兼容问题的用法,所以不建议使用)

浏览器兼容问题六:标签最低高度设置min-height不兼容 

问题症状: 因为min-height本身就是一个不兼容的css属性,所以设置min-height时不能很好的被各个浏览器兼容 

碰到几率 :5%

解决方案: 如果我们要设置一个标签的最小高度200px,需要进行的设置为:{min-height:200px; height:auto !important; height:200px; overflow:visible;}

备注: 在B/S系统前端开时, 有很多情况下我们又这种需求。当内容小于一个值(如300px)时。容器的高度为300px;当内容高度大于这个值时,容器高度被撑高,而不是出现滚动条。这时候我们就会面临这个兼容性问题。 

如何应对兼容性问题

做兼容页面的方法是:每写一小段代码(布局中的一行或者一块)我们都要在不同的浏览器中看是否兼容,当然熟练到一定的程度就没这么麻烦了。建议经常会碰到兼容性问题的新手使用。很多兼容性问题都是因为浏览器对标签的默认属性解析不同造成的,只要我们稍加设置都能轻松地解决这些兼容问题。如果我们熟悉标签的默认属性的话,就能很好的理解为什么会出现兼容问题以及怎么去解决这些兼容问题

 css hack技术

css hack 技术是通过一些浏览器特殊支持或者不支持的语句,确定一个css样式能给被浏览器解析或者不能被浏览器解析。css  hack技术针对不同浏览器的差异进行利用和设计,使用它可以在最大限度的让所以的浏览器下显示同样的风格和模式。

css hack 技术是一种改善CSS在不同浏览器下的表现形式的技巧与方法。 CSS hack技术是通过一些浏览器特殊或者不支持的语句,使一个CSS样式能够被浏览器解析或者不能解析的方法实现的。

CSS Hack的原理只有两条:兼容性和顺序。就是利用书写顺序和不同浏览器对一些特定书写方法的解析方式不同而达到不同的效果。不管是什么方法,书写的顺序都是firefox的写在前面,IE7的写在中间,IE6的写在最后面。(其顺序正好是对CSS2.0标准执行的好坏程度)

可把浏览器分为3类:IE6 ;IE7和遨游;其他(IE8 chrome ff safari opera等)。IE6认识的hacker 是下划线_ 和星号 *;IE7和遨游只认识的hacker是星号 * ;而其他浏览器下划线_和星号*都不认识。

比如有这样一个css样式设置

 #exam{height:300px;

*height:200px;

_height:100px; }

IE6浏览器在读到 height:300px的时候会认为高度是300px;继续往下读,他也认识*heihgt,所以当IE6读到*height:200px的时候会覆盖掉前一条的相冲突设置,认为高度是200px。继续往下读,IE6还认识_height,所以他又会覆盖掉200px高的设置,把高度设置为100px;IE7和遨游也是一样的从高度300px的设置往下读。当它们读到*height200px的时候就停下了,因为它们不认识_height。所以它们会把高度解析为200px;剩下的浏览器只认识第一个height:300px;所以他们会把高度解析为300px。因为优先级相同且相冲突的属性设置后一个会覆盖掉前一个,所以书写的次序是很重要的。

DIV+CSS网页布局这是一种趋势,不过在使用DIV+CSS网站设计的时候,应该注意css样式兼容不同浏览器问题,特别是对完全使用DIV+CSS设计的网页,就应该更注意IE6、 IE7 和FF对CSS样式的兼容。

什么是浏览器兼容:当我们使用不同的浏览器(Firefox、IE7、IE6)访问同一个网站,或者页面的时候,会出现一些不兼容的问题,在这种浏览器下显示正常,在另一种下就乱了,目前解决这个浏览器的问题,最直接的方法就是利用CSS hack技术为每个浏览器各写一段css,让它们各执行各的,这就是CSS hack技术解决CSS在不同浏览器中的兼容性问题的核心。

!important 

!important是被Firefox浏览器所支持的一种用于确定优先级的技术。随着IE7对!important的支持, !important 方法现在只针对IE6的兼容性问题。注意:!important也算是hack的一种。不过实用性较小。

例如:

#example { 

width: 100px !important; /* IE7+FF */ 

width: 200px; /* IE6 */ 

}

CSS HACK的常用方法

首先需要知道的是:

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

IE6 专用 _height: 100px; 

IE7 专用 *+height: 100px;

IE6、IE7 共用 *height: 100px;

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

例如:

#example { height:100px; } /* FF */

* html #example { height:200px; } /* IE6 */

*+html #example { height:300px; } /* IE7 */

/*注意:这个范例中区别符号在样式名前面,并且加了html*/

下面的这种方法比较简单

举几个例子:

1、IE6 - IE7+FF(-为区别,+为共同)

#example { 

height:100px; /* FF+IE7 */

_height:200px; /* IE6 */

}

其实这个用上面说的第一种方法也可以

#example { 

height:100px !important; /* FF+IE7 */

height:200px; /* IE6 */

}

2、IE6+IE7 - FF

#example { 

height:100px; /* FF */

*height:200px; /* IE6+IE7   IE7的后一次应用将第一次覆盖了*/

}

3、IE6+FF - IE7

#example { 

height:100px; /* IE6+FF  但两者效果可能不同*/

*+height:200px; /* IE7 */

}

4、IE6 IE7 FF 各不相同

      

#example { 

height:100px; /* FF */

_height:200px; /* IE6 */

*+height:300px; /* IE7 */

}

或:

#example { 

height:100px; /* FF */

*height:300px; /* IE7 */

_height:200px; /* IE6 */

}

需要注意的是,代码的顺序一定不能颠倒了,要不又前功尽弃了。因为浏览器在解释程序的时候,如果重名的话,会用后面的覆盖前面的,就象给变量赋值一个道理,所以我们把通用的放前面,越专用的越放后面。

解释一下4的代码:读代码的时候,第一行height:100px; 大家都通用,IE6 IE7 FF 都显示100px。到了第二行*height:300px; FF不认识这个属性,IE6 IE7都认,所以FF还显示100px,而IE6 IE7把第一行得到的height属性给覆盖了,都显示300px。到了第三行_height:200px;只有IE6认识,所以IE6就又覆盖了在第二行得到的height,最终显示200px。这样,三个浏览器都有自己的height属性了。

需要说明的是:*+html 对IE7的兼容 必须保证HTML顶部有如下声明: 

使用IE专用的条件注释

条件注释是IE特有的一种功能,能对IE系列产品进行单独的XHTML代码处理,注意,主要是针对XHTML,而非CSS。

条件注释能被IE判断是什么版本的浏览器,并在符合条件的情况下显示其中的内容,从IE5.0到7.0都支持注释功能,而且版本号精确到小数点后4位。

如: 

IE条件注释还支持感叹号非操作:

如:

IE的if条件Hack 

1. 除IE外都可识别

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

注: 

gt = Great Then 大于

> = > 大于号

lt = Less Then 小于

< = < 小于号

gte = Great Then or Equal 大于或等于

lte = Less Then or Equal 小于或等于 

FLOAT闭合(clearing float) 

网页在某些浏览器上显示错位很多时候都是因为使用了float浮动而没有真正闭合,这也是div无法自适应高度的一个原因。如果父div没有设 float而其子div却设了float的话,父div无法包住整个子DIV,这种情况一般出现在一个父DIV下包含多个子DIV。解决办法:

1、给父DIV也设上float。

2、在所有子DIV后新加一个空DIV(不推荐,有些浏览器可以看见空DIV产生的空隙)

比如:

.parent{width:100px;}

.son1{float:left;width:20px;}

.son2{float:left;width:80px;}

.clear{clear:both;margin:0;parding0;height:0px;font-size:0px;}

3、overflow:auto

只要在父DIV的CSS中加上overflow:auto就搞定。

举例:

.parent{width:100px;overflow:auto }

.son1{float:left;width:20px;}

.son2{float:left;width:80px;}

原理是,外围元素之所以不能很好的延伸,问题出在了overflow上,因为overflow不可见。现在只要将给外围元素添加一个“overflow:auto”,就可以解决问题,结果是除了IE,真的可以解决。下来就要解决IE的问题了,再加上“_height:1%”,这个问题就完全解决了。

需要注意的一些兼容细节

1, FF下给 div 设置 padding 后会导致 width 和 height 增加(DIV的实际宽度=DIV宽+Padding), 但IE不会。

解决办法:给DIV设定IE、FF两个宽度,在IE的宽度前加上IE特有标记" * "号。

2, 页面居中问题. 

body {TEXT-ALIGN: center;} 在IE下足够了,但FF下失效。

解决办法:加上"MARGIN-RIGHT: auto; MARGIN-LEFT: auto; " 

3, 有的时候在IE6上看见一些奇怪的间隙,可我们高度明明设好了呀。

解决办法:试试在有空隙的DIV上加上"font-size:0px;" 

4, 浮动IE6产生的双倍距离 

#box{ float:left; 

          width:100px; 

          margin:0 0 0 100px;

}

这种情况之下IE6会产生200px的距离

解决办法:加上display:inline,使浮动忽略

这里细说一下block,inline两个元素,Block元素的特点是:总是在新行上开始,高度,宽度,行高,边距都可以控制(块元素);Inline元素的特点是:和其他元素在同一行上,…不可控制(内嵌元素); 

#box{ display:block; //可以为内嵌元素模拟为块元素 display:inline; //实现同一行排列的的效果

5、页面的最小宽度 

min-width是个非常方便的CSS命令,它可以指定元素最小也不能小于某个宽度,这样就能保证排版一直正确。但IE不认得min-这个定义,但实际上它把正常的width和height当作有min的情况来使。这样问题就大了,如果只用宽度和高度,正常的浏览器里这两个值就不会变,如果只用min-width和min-height的话,IE下面根本等于没有设置宽度和高度。比如要设置背景图片,这个宽度是比较重要的。

解决办法:为了让这一命令在IE上也能用,可以把一个 放到 标签下,然后为div指定一个类: 

然后CSS这样设计:

#container{ 

min-width: 600px; 

width:e­xpression(document.body.clIEntWidth < 600? “600px”: “auto” ); 

第一个min-width是正常的;但第2行的width使用了Javascript,这只有IE才认得,这也会让你的HTML文档不太正规。它实际上通过Javascript的判断来实现最小宽度。

6、UL和FORM标签的padding与margin   

ul标签在FF中默认是有padding值的,而在IE中只有margin默认有值。FORM标签在IE中,将会自动margin一些边距,而在FF中margin则是0;

解决办法:css中首先都使用这样的样式ul,form{margin:0;padding:0;}给定义死了,后面就不会为这个头疼了.  

7 ,DIV浮动IE文本产生3象素的bug

左边对象浮动,右边采用外补丁的左边距来定位,右边对象内的文本会离左边有3px的间距。

#box{ 

float:left; 

width:800px;} 

#left{ 

float:left; 

width:50%;} 

#right{ 

width:50%; 

*html #left{ 

margin-right:-3px; 

//这句是关键 

HTML代码 

上面这段代码的理解:

第一、只要right定义了width属性,在FF下绝对就会两行显示

第二、两个width都定义为百分比的话,就算都为100%在IE下也会一行显示。所以上面那句所谓“这句是关键”根本没用,不加也在一行,除非width定义的是数值才用得上。

所以说上面这段代码其实用处不大,至少在FF下不行。其实只要只定义left的width就行了,right不定义width就不管在IE还是FF 下都能成功,但这样的话父DIV BOX并没有真正的包含LEFT和RIGHT两子DIV。最简单的办法就是在RIGHT中加上float:left就 OK了。

8,截字省略号 

.hh { -o-text-overflow:ellipsis; 

        text-overflow:ellipsis; 

        white-space:nowrap;

        overflow:hidden;

这个是在越出长度后会自行的截掉多出部分的文字,并以省略号结尾。技术是好技术,很多人都喜欢乱用,但注意Firefox并不支持。

9、DOCTYPE声明的重要性

DOCTYPE是document type(文档类型)的简写,在web设计中用来说明你用的XHTML或者HTML是什么版本。

要建立符合标准的网页,DOCTYPE声明是必不可少的关键组成部分;除非你的XHTML确定了一个正确的DOCTYPE,否则你的标识和CSS都不会生效。

其中的DTD(例如上例中的xhtml1-transitional.dtd)叫文档类型定义,里面包含了文档的规则,浏览器就根据你定义的DTD来解释你页面的标识,并展现出来。

XHTML 1.0 提供了三种DTD声明可供选择:

* 过渡的(Transitional):要求非常宽松的DTD,它允许你继续使用HTML4.01的标识(但是要符合xhtml的写法),完整代码如下:

* 严格的(Strict):要求严格的DTD,你不能使用任何表现层的标识和属性,例如
,完整代码如下:

* 框架的(Frameset):专门针对框架页面设计使用的DTD,如果你的页面中包含有框架,需要采用这种DTD,完整代码如下:

理想情况当然是严格的DTD,但对于我们大多数刚接触web标准的设计师来说,过渡的DTD(XHTML 1.0 Transitional)是目前理想选择。因为这种DTD还允许我们使用表现层的标识、元素和属性,也比较容易通过W3C的代码校验。

注:上面说的"表现层的标识、属性"是指那些纯粹用来控制表现的tag,例如用于排版的表格、背景颜色标识等。在XHTML中标识是用来表示结构的,而不是用来实现表现形式,我们过渡的目的是最终实现数据和表现相分离。

DOCTYPE声明必须放在每一个XHTML文档最顶部,在所有代码和标识之上。下载本文

显示全文
专题