各个浏览器之间的兼容性问题,同样的HTML5和CSS5样式,但是浏览器表现的效果不一样。
一,什么兼容性问题,不正常的原因是什么?,应该怎么样让浏览器显示正常。
二,为什么浏览器会存在兼容性的问题?
1,同一个浏览器,版本越老存在的bug越多,越新的版本,对新标签和新的属性,新的特性支持越少。
2,不同的浏览器,核心技术不一样,标准不同,实现的方式也有差异,最终的效果也有差异。
三,处理兼容性问题的思路
one,要不要做?
1,从产品的角度,(产品的受欢迎程度,受欢迎浏览器的比例,效果优先还是基本功能优先?)
2,成本的角度,(有没有必要做一些功能?)
two,做到什么程度?
1,让那些浏览器支持那些效果?
three,如何做?
1,根据兼容需求选择技术框架,(jquery)等。
2,根据兼容需求选择兼容工具:html5shiv,Respond.js,CSS Reset,normalize.css,Modernizr.js,postcss,
3,条件注释,CSS hack,js能力检测做一些修补。
四,渐进增强和优雅降级
1,渐进增强:针对低版本的浏览器构建页面,保证基本功能,对高版本的浏览器,进行效果交互,和追加功能达到最好的用户体验。
2,优雅降级:一开始就构造完整的功能,然后对低版本的浏览器进行兼容处理。
。。。。。。
具体方法如下:
1,IE条件注释 (conditional comment) 是于HTML源码中被IE有条件解释的语句。条件注释可被用来向IE提供及隐藏代码,注意:只有IE9以下的浏览器才能识别这种语法,其他浏览器仅仅认为是普通注释。
<!--[if IE 6]>
<p>IE6下 这句生效,在其他浏览器下认为是普通注释</p>
<![endif]-->
<!--[if !IE]><!-->
<script>alert("在 IE 下条件语法生效,但script不执行。在非 IE 下上下两句都被当做注释所以当前 script 会执行");</script>
<!--<![endif]-->
<!--[if IE 8]>
<link href="ie8only.css" rel="stylesheet">
<![endif]-->
使用了条件注释的页面在IE9 及以前 中可正常工作,但在IE10 以后不再支持。
。。。。。。
2,CSS hack是利用浏览器遗留 bug 的原理来识别旧的浏览器。
.box{
color: red;
color: blue; /只有IE6认识/
color: pink; /只有IE67认识/
color: yellow\9; /IE浏览器都能识别/
}
以下是一些常见属性的兼容情况
inline-block: >=IE8
min-width/min-height: >=IE7
:before,:after: >=IE8
div:hover: >=IE7
inline-block: >=IE8
background-size: >=IE9
圆角: >= IE9
阴影: >= IE9
动画/渐变: >= IE10
一些兼容写法范例:
.clearfix:after{
content: '';
display: block;
clear: both;
}
.clearfix{
zoom: 1; / 仅对IE6/IE7有效,zoom:1触发hasLayout,起到类似BFC的效果 /
}
.target{
display: inline-block;
display: inline; /仅对IE67生效/
zoom: 1; /仅对IE67生效/
}
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<!DOCTYPE html>
<!--[if lt IE 7 ]> <html class="no-js ie6"> <![endif]-->
<!--[if IE 7 ]> <html class="no-js ie7"> <![endif]-->
<!--[if IE 8 ]> <html class="no-js ie8"> <![endif]-->
<!--[if (gte IE 9)|!(IE)]><!--><html class="no-js"><!--<![endif]-->
。。。。。。
⑴可以针对不同的浏览器写CSS,针对不同的浏览器写不同的CSS 代码的过程,就叫CSS hack
CSS Hack的原理是什么?由于不同的浏览器对CSS的支持及解析结果不一样,还由于CSS中的优先级的关系。我们就可以根据这个来针对不同的浏览器来写不同的CSS。
比如 IE6能识别下划线""和星号" ",IE7能识别星号" ",当不能识别下划线"_",而firefox两个都不能认识。等等
举个例子吧,设置背景颜色的代码,区别FF,IE7,IE6:background:orange,background:green !important,background:blue;
注:IE都能识别,标准浏览器(如FF)不能识别;
IE6能识别,但不能识别 !important,
IE7能识别,也能识别!important;
FF不能识别*,但能识别!important;
所以,FIREFOX中是橙色,IE7是绿色,IE6中是蓝色。
最后说一句,浏览器优先级别:FF<IE7<IE6,CSS hack书写顺序一般为FF IE7 IE6。
多研究css标准,不写不规范的代码,规范的css是不可能出问题的。「做出来的页面在不同浏览器上显示效果有差距」这个有很多原因。
各浏览器默认的样式不一样,比如 h 元素的 margin、字号,列表元素的缩进是 margin 还是 padding 等。需要先把这些默认样式覆盖掉,也叫初始化或 Reset。建议用 YUI 的 Reset CSS,应该是目前比较全的了 http://developer.yahoo.com/yui/reset/。
各浏览器对同一个属性的理解不一样或 bug,比如最烦人的 font-family,这个多找相关的文章看看,一般可以总结出来一个比较好的解决方案。针对 IE 的 bug,万不得已可以用 hack,我还从来没用过…… 某个属性浏览器压根不支持,这个就需要积累了。开发的时候最好在 Firefox 下进行(Chrome 也行,但是总感觉 Chrome 会把人惯坏),然后在 IE6 下调整一下(如果还需要考虑 IE6 的话),最后可以在 Opera 下看看行不行
⑵最直接的方法就是用第三方的插件.像bootstrap,compasser等,这些插件基本都处理了这种不兼容的问题。
css虽然简单,但是也不是知道语法就可以走天下的东西。
最容易出错的,float和position,其间涉及到文档流、视觉格式化的很多抽象概念。
还有例如margin的垂直压缩,都是需要学习理论的。
至于浏览器的兼容,实际上,已经存在的bug基本就那么多了(主要就是IE6/IE7/IE8),所以多做多搜索答案就没什么太难的东西。
所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们的系统,都应该是统一的显示效果。所以浏览器的兼容性问题是前端开发人员经常会碰到和必须要解决的问题。
在学习浏览器兼容性之前,我想把前端开发人员划分为两类:
第一类是精确按照设计图开发的前端开发人员,可以说是精确到1px的,他们很容易就会发现设计图的不足,并且在很少的情况下会碰到浏览器的兼容性问题,而这些问题往往都死浏览器的bug,并且他们制作的页面后期易维护,代码重用问题少,可以说是比较牢固放心的代码。
第二类是基本按照设计图来开发的前端开发人员,很多细枝末节差距很大,不如间距,行高,图片位置等等经常会差几px。某种效果的实现也是反复调试得到,具体为什么出现这种效果还模模糊糊,整体布局十分脆弱。稍有改动就乱七八糟。代码为什么这么写还不知所以然。这类开发人员往往经常为兼容性问题所困。修改好了这个浏览器又乱了另一个浏览器。改来改去也毫无头绪。其实他们碰到的兼容性问题大部分不应该归咎于浏览器,而是他们的技术本身了。
文章主要针对的是第一类,严谨型的开发人员,因此这里主要从浏览器解析差异的角度来分析兼容性问题。(相关文章推荐:主流浏览器CSS 3和HTML 5兼容清单)
浏览器兼容问题一:不同浏览器的标签默认的外补丁和内补丁不同
问题症状:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大。
碰到频率:100%
解决方案:CSS里 {margin:0;padding:0;}
备注:这个是最常见的也是最易解决的一个浏览器兼容性问题,几乎所有的CSS文件开头都会用通配符来设置各个标签的内外补丁是0。
浏览器兼容问题二:块属性标签float后,又有横行的margin情况下,在IE6显示margin比设置的大
问题症状:在IE6中块元素浮动后,会出现横向双倍margin现象。
碰到频率: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;}。为IE6单独设置hack,即_height:最小高度值;_width:最小宽度值(对于IE6,当实际宽高超出定义的宽高时,元素会自动调整 宽高)。对于最大高度和最大宽度,没有必要设置兼容,当前对于开发者来说,只需要保证IE6下正常显示即可,无需在它身上花费太多功夫。
备注:在B/S系统前端开时,有很多情况下我们又这种需求。当内容小于一个值(如300px)时。容器的高度为300px;当内容高度大于这个值时,容器高度被撑高,而不是出现滚动条。这时候我们就会面临这个兼容性问题。
浏览器兼容问题七:透明度的兼容CSS设置
问题症状:IE6/IE7/IE8不支持rgba与opacity两种透明的设置方法;
解决方案:使用IE6当中的滤镜filter替代掉,如:opacity:0.6,filter:alpha(opacity=60)。
备注:IE TESTER测试IE6不支持上面解决方案。
浏览器兼容问题八:img外部的border
问题症状:img外部有a标签,即img标签有链接时。
解决方案:设置img边框border:0;
备注:在用IE TESTER测试时,IE6-IE9都存在上述兼容问题,IE11时就ok。
浏览器兼容问题九:空div默认行高
问题症状:清除浮动的时候,有些人会采取一种清浮动的方法,使用一个空的div,然后为这个div设置{clear:both}。在大部分浏览器当中,这样做是没有任何问题的,但是在IE6浏览器当中,div即使是空的,也会存在默认行高。
解决方案:设置其高度为0,并设置overflow:hidden。
1 .clearfix{ zoom: 1; }
2 .clearfix:after{clear: both; height: 0;overflow: hidden; content: "";display: block;}
选择清浮动位置时应注意以下:
1、清浮动一定要在浮动标签完成浮动布局以后添加,否则会影响到浮动标签布局;
2、清除浮动必须与前面的标签属于同级关系。
①clear属性定义了元素某个方向上不允许出现浮动元素:none(允许两边都可以有浮动对象)/left(…)/right(不允许右边有浮动对象)/both(不允许有浮动对象);
②空标签清除浮动:在HTML页面中加入一个空标签用来清除浮动。
HTML:
1 <div class=clear> </div>
CSS:
1 .clear{clear:both;hegiht:0;overflow:hidden;}
clear:both;是清除所有浮动;height:0;overflow:hidden;是用来改变IE6下标签有默认的低于10px的行高时将以10px的高度显示的bug。但是空标签清浮动会增加多余的代码
③overflow:在需要清除浮动的腹肌标签中加入overflow即可,在IE6中不认识此属性则加入zoom:1;或者height:1%;css样式改为:.out{overflow:auto;zoom:1;}该属性对于父标签设置的高度小于子标签时,IE6/7、遨游则以下拉框形式出现,而火狐、谷歌、欧鹏、IE8会将子标签超出部分隐藏掉。
overflow:visible属性只能对IE6/7、遨游起作用,对火狐、谷歌、欧鹏、IE8无清浮作用。
overflow:visible(不剪切内容也不添加滚动条)/auto(是body对象和textarea的默认值,在需要时剪切内容并添加滚动条)/hidden(超出部分隐藏)/scroll(总是显示滚动条);
④after清浮动:css样式为:
.out{zoom:1;}/==for IE6/7 Maxthon2==/
outer:after {clear:both;content:"";visible:hidden;display:block;}/==for FF/chrome/opera/IE8==/
其中clear:both;只清除所有浮动;content:"";display:block;对于FF/chrome/opera/IE8不能缺少,content()可以取空值。
⑤子标签浮动时,给父标签浮动
⑥下一标签直接清浮动:兄弟标签浮动时,下一标签直接写入清除clear:both;就可以。
⑦使用position:absolute;清除浮动。
浏览器兼容问题十:空div默认行高
问题症状:IE6浏览器中hover只支持a标签的使用,不支持一切其它标签使用;
HTML:
<div class="div1">
<h3 class="hh">我是第一标题</h3>
<a href="#"><h3 class="h">我是第二标题</h3></a>
<a href="#">我是第二标题</a>
</div>
CSS:
1 *{ margin: 0; padding: 0; }
2 .div1{ width: 600px; height: 200px; background-color: #ccc; border: 1px solid #ff9673; margin: 100px auto 0; }
3 h3:hover{ color: red; }
4 a{ float: left; width: 200px; height: 30px; background: yellow; text-decoration: none; }
5 a:hover{ font-size: 50px; }
6 a:hover .h{ color: red; }
解决方案:解决办法:合理用a标签嵌套其他行内标签或者用javascript模拟a的hover效果;
备注:a{float:left}将a标签转化成块元素,这样可以设置宽和高。a:hover b{}当鼠标放在a标签上时,只是将a标签的b的内容隐藏掉,而不是将a隐藏掉。如果将a标签隐藏掉的,hover效果将消失,使display:none;失效。
浏览器兼容问题十一:子选择器在IE6中不能使用
问题症状:在IE6中,使用E>F子选择器无效果。
解决方案:采用其他选择器或者后代选择器进行控制。
浏览器兼容问题十二:input聚焦框颜色与样式不同
问题症状:各个浏览器表现不同。
解决方案:使用outline:none,清除默认样式之后再统一设置。
备注:使用上述方法可以清除IE和chrome浏览器默认样式,Firefox还是原样。
做兼容页面的方法是:每写一小段代码(布局中的一行或者一块)我们都要在不同的浏览器中看是否兼容,当然熟练到一定的程度就没这么麻烦了。建议经常会碰到兼容性问题的新手使用。很多兼容性问题都是因为浏览器对标签的默认属性解析不同造成的,只要我们稍加设置都能轻松地解决这些兼容问题。如果我们熟悉标签的默认属性的话,就能很好的理解为什么会出现兼容问题以及怎么去解决这些兼容问题。
/ CSS hack/
我很少使用hacker的,可能是个人习惯吧,我不喜欢写的代码IE不兼容,然后用hack来解决。不过hacker还是非常好用的。使用hacker我可以把浏览器分为3类:IE6 ;IE7和遨游;其他(IE8 chrome ff safari opera等)
IE6认识的hacker 是下划线_ 和星号
IE7 遨游认识的hacker是星号
比如这样一个CSS设置:
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。因为优先级相同且想冲突的属性设置后一个会覆盖掉前一个,所以书写的次序是很重要的。】
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。