现在的位置: 首页 > 综合 > 正文

CSS简单的兼容问题(收集)

2013年01月05日 ⁄ 综合 ⁄ 共 4485字 ⁄ 字号 评论关闭

 对于前端的切图代码,最理想的是代码只写一次,且在各个浏览器中跑出来的效果是一致的。

 其实作为不是专业的学者,我们没有必要去从根本上解决那些所谓的BUG,也就是说我们在平日去布局或实现某个效果时,可以采取多种方法
很多的兼容问题是可以从代码上去避免的。

       所 谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。在大多数情况下,我们的需求是,无论用户用什么浏 览器来查看我们的网站或者登陆我们的系统,都应该是统一的显示效果。所以浏览器的兼容性问题是前端开发人员经常会碰到和必须要解决的问题。
  前端开发人员一般划分为两类:
  第一类是精确按照设计图开发的前端开发人员,可以说是精确到1px的,他们很容易就会发现设计图的不足,并且在很少的情况下会碰到浏览器的兼容性问题,而这些问题往往都死浏览器的bug,并且他们制作的页面后期易维护,代码重用问题少,可以说是比较牢固放心的代码。
   第二类是基本按照设计图来开发的前端开发人员,很多细枝末节差距很大,不如间距,行高,图片位置等等经常会差几px。某种效果的实现也是反复调试得到, 具体为什么出现这种效果还模模糊糊,整体布局十分脆弱。稍有改动就乱七八糟。代码为什么这么写还不知所以然。这类开发人员往往经常为兼容性问题所困。修改 好了这个浏览器又乱了另一个浏览器。改来改去也毫无头绪。其实他们碰到的兼容性问题大部分不应该归咎于浏览器,而是他们的技术本身了。
   我这篇文章主要针对的是第一类,严谨型的开发人员,因此这里主要从浏览器解析差异的角度来分析兼容性问题。(第二类开发人员写得代码怪毛病多多,自己写 的都看不懂,怎么能祈望浏览器看懂。请多练习基本的float clear等css属性的使用。)
浏览器兼容问题一:
        不同浏览器的标签默认的外补丁和内补 丁不同问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。

  碰到频率解决方案:css里备注:这个是最常见的也是最易解决的一个浏览器兼容性问题,几乎所有的css文件开头都会用通配符*来设置各个标签的内外补丁是0。  因为IE会给某些标签默认的值(html,body,ul,ol,li,div,p,h1,h2,h3,h4,h5,h6,dl,dt,dd,form,fieldset,table,td,th,img{margin:0;padding:0;border:0;}
select,input,textarea,td,input,p{font-size:12px;}select,input,img{vertical-align:middle;}h1,h2,h3,h4,h5,h6,th{font-weight:normal;}ul,ol{ list-style:none;}
body{color:#666;background:#fff;font-size:12px;}
a{color:#666;text-decoration:none;font-size:12px;}a:hover,.uLine,a.uLine{text-decoration:underline;}a.more{color:#58c1f1;}
.fl{float:left;}.fr{float:right;}.ti{text-indent:2em;}
.clear{clear:both;}.clr{height:0;font-size:0;line-height:0;clear:both;overflow:hidden;}.clear-div{height:0;overflow:hidden;})

浏览器兼容问题二:
    块属性标签float后,又有横行的margin情况下,在ie6显示margin比设置的大问题症状:常见症状是ie6中后面的一 块被顶到下一行碰到频率:90%(稍微复杂点的页面都会碰到,float布局最常见的浏览器兼容问题)解决方案:在float的标签样式控制中加入  display:inline;将其转化为行内属性备注:我们最常用的就是div+css布局了,而div就是一个典型的块属性标签,横向布局的时候我们 通常都是用div float实现的,横向的间距设置如果用margin实现,这就是一个必然会碰到的兼容性问题。
浏览器兼容问题三:
    设置较小高度标签(一般小于10px),在ie6,ie7,遨游中高度超出自己设置高度问题症状:ie6、7和遨游里这个标签的高度不受控制,超出自己设置的高度
  解决方案:给超出高度的标签设置overflow:hidden;或者设置行高line-height 小于你设置的高度。
  备注:这种情况一般出现在我们设置小圆角背景的标签里。出现这个问题的原因是ie8之前的浏览器都会给标签一个最小默认的行高的高度。即使你的标签是空的,这个标签的高度还是会达到默认的行高。
浏览器兼容问题四:
    行内属性标签,设置display:block后采用float布局,又有横行的margin的情况,ie6间距bug(类似第二种)问题症状:ie6里的间距比超过设置的间距
   解决方案:在display:block;后面加入备注:行内属性标签,为了设置宽高,我们需要设置display:block;(除了input标签 比较特殊)。在用float布局并有横向的margin后,在ie6下,他就具有了块属性float后的横向margin的bug。不过因为它本身就是行 内属性标签,所以我们再加上display:inline的话,它的高宽就不可设了。这时候我们还需要在display:inline后面加入 display:talbe。
浏览器兼容问题五:
    图片默认有间距问题症状:几个img标签放在一起的时候,有些浏览器会有默认的间距,加了问题一中提到的通配符也不起作用。
   解决方案:使用float属性为img布局备注:因为img标签是行内属性标签,所以只要不超出容器宽度,img标签都会排在一行里,但是部分浏览器的 img标签之间会有个间距。去掉这个间距使用float是正道。(我的一个学生使用负margin,虽然能解决,但负margin本身就是容易引起浏览器 兼容问题的用法,所以我禁止他们使用)
浏览器兼容问题六:
    标签最低高度设置min-height不兼容问题症状:因为min-height本身就是一个不 兼容的css属性,所以设置min-height时不能很好的被各个浏览器兼容
  解决方案:如果我们要设置一个标签的最小高度200px,需要进行的设置为:
  备注:在B/S系统前端开时,有很多情况下我们又这种需求。当内容小于一个值(如300px)时。容器的高度为300px;当内容高度大于这个值时,容器高度被撑高,而不是出现滚动条。这时候我们就会面临这个兼容性问题。
浏览器兼容问题七:
    透明度的兼容css设置备注:这个问题我在前面的文章提到过,讲的比较详细(http://hi。baidu。 com/kuntakinte/blog/item/258fe2fa1021ad9d59ee90ef。html)做兼容页面的方法是:每写一小段代码 (布局中的一行或者一块)我们都要在不同的浏览器中看是否兼容,当然熟练到一定的程度就没这么麻烦了。建议经常会碰到兼容性问题的新手使用。很多兼容性问 题都是因为浏览器对标签的默认属性解析不同造成的,只要我们稍加设置都能轻松地解决这些兼容问题。如果我们熟悉标签的默认属性的话,就能很好的理解为什么 会出现兼容问题以及怎么去解决这些兼容问题我很少使用hacker的,可能是个人习惯吧,我不喜欢写的代码ie不兼容,然后用hack来解决。不过 hacker还是非常好用的。

   使用hacker 我可以吧浏览器分为3类:ie6 ;ie7和遨游;其他(ie8 chrome ff safari opera等)认识的 hacker 是下划线_ 和星号遨游认识的hacker是星号 * (包括上面问题6中的 !important也算是hack的一种。不过实用性较 小。)比如这样一个css设置浏览器在读到 height:300px的时候会认为高时300px;继续往下读,他也认识*heihgt, 所以当ie6 读到*height:200px的时候会覆盖掉前一条的相冲突设置,认为高度是200px。继续往下读,ie6还认识_height,所以他又会覆盖掉 200px高的设置,把高度设置为100px;和遨游也是一样的从高度300px的设置往下读。当它们读到*height200px的时候就停下了,因为 它们不认识_height。所以它们会把高度解析为200px;剩下的浏览器只认识第一个height:300px;所以他们会把高度解析为300px。

补充:

CSS hack:针对IE6IE7firefox显示不同效果

做网站时经常会用到,衡量一个DIV+CSS架构师的水平时,这个也很重要。

区别不同浏览器的CSS hack写法:

区别IE6FF
        background:orange;*background:blue;

区别IE6IE7
        background:green !important;background:blue;

区别IE7FF
        background:orange; *background:green;

区别FFIE7IE6
        background:orange;*background:green !important;*background:blue;

注:IE都能识别*;标准浏览器(FF)不能识别*

IE6能识别*,但不能识别 !important,
IE7能识别*,也能识别!important;
FF不能识别*,但能识别!important;

 

IE6

IE7

FF

*

×

!important

×

------------------------------------------------------
另外再补充一个,下划线"_",
IE6支持下划线,IE7firefox均不支持下划线。

 

IE6

IE7

FF

*

×

!important

×

_

×

×

于是大家还可以这样来区分IE6IE7firefox
: background:orange;*background:green;_background:blue;

注:不管是什么方法,书写的顺序都是firefox的写在前面,IE7的写在中间,IE6的写在最后面。

  因为优先级相同且想冲突的属性设置后一个会覆盖掉前一个,所以书写的次序是很重要的。

自己点积:

1、页面整体结构追求“由外而内,粗中有细”。

2、样式上秉承“封装+继承+多态”原则。

3、初始时尽量调至各浏览器一致,然后再追加新的样式属性。

4、遇到所谓的兼容问题,可以换一种实现方式试试。

抱歉!评论已关闭.