为何会有兼容性问题?
因为市场上浏览器种类众多,而不一样浏览器其内核亦不尽相同,因此各个浏览器对网页的解析就有必定出入,这也是致使浏览器兼容问题出现的主要缘由,咱们的网页须要在主流浏览器上正常运行,就须要作好浏览器兼容。css
使用Trident内核的浏览器:IE、Maxthon、TT; 使用Gecko内核的浏览器:Netcape6及以上版本、FireFox; 使用Presto内核的浏览器:Opera7及以上版本; 使用Webkit内核的浏览器:Safari、Chrome。
而我如今所说的兼容性问题,主要是说IE与几个主流浏览器如firefox,google等。而对IE浏览器来讲,IE7又是个跨度,由于以前的版本更新甚慢,bug甚多。从IE8开始,IE浏览器渐渐遵循标准,到IE9后因为你们都一致认为标准很重要,能够说在兼容性上比较好了,可是在中国来讲,因为xp的占有率问题,使用IE7如下的用户仍然不少,因此咱们不得不考虑低版本浏览器的兼容。html
对浏览器兼容问题,通常分,HTML,Javascript兼容,CSS兼容。 其中html相关问题比较容易处理,无非是高版本浏览器用了低版本浏览器没法识别的元素,致使其不能解析,因此平时注意一点就是。特别是HTML5增长了许多新标签,低版本浏览器有点影响时代进步啊前端
问题一:不一样浏览器的标签默认的外补丁和内补丁不一样
问题症状:随便写几个标签,不加样式控制的状况下,各自的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,遨游中高度超出本身设置高度
问题症状:ie六、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是正道
问题六:标签最低高度设置min-height不兼容
问题症状:由于min-height自己就是一个不兼容的css属性,因此设置min-height时不能很好的被各个浏览器兼容
碰到概率:5%
解决方案:若是咱们要设置一个标签的最小高度200px,须要进行的设置为:{min-height:200px; height:auto !important; height:200px; overflow:visible;}
备注:在B/S系统前端开时,有不少状况下咱们有这种需求。当内容小于一个值(如300px)时。容器的高度为300px;当内容高度大于这个值时,容器高度被撑高,而不是出现滚动条。这时候咱们就会面临这个兼容性问题。
问题七:透明度的兼容css设置
方法是:每写一小段代码(布局中的一行或者一块)咱们都要在不一样的浏览器中看是否兼容,固然熟练到必定的程度就没这么麻烦了。建议常常会碰到兼容性问题的新手使用。不少兼容性问题都是由于浏览器对标签的默认属性解析不一样形成的,只要咱们稍加设置都能轻松地解决这些兼容问题。若是咱们熟悉标签的默认属性的话,就能很好的理解为何会出现兼容问题以及怎么去解决这些兼容问题。chrome
技巧一:css hack浏览器
使用hacker 我能够把浏览器分为3类:ie6 ;ie7和遨游;其余(ie8 chrome ff safari opera等)app
ie6认识的hacker 是下划线_ 和星号 *
ie7 遨游认识的hacker是星号 * (包括上面问题6中的 !important也算是hack的一种。不过实用性较小。)
好比这样一个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。ide
由于优先级相同且相冲突的属性设置后一个会覆盖掉前一个,因此书写的次序是很重要的。布局
/* CSS属性级Hack */
color:red; /* 全部浏览器可识别*/
_color:red; /* 仅IE6 识别 */
*color:red; /* IE六、IE7 识别 */
+color:red; /* IE六、IE7 识别 */
*+color:red; /* IE六、IE7 识别 */
[color:red; /* IE六、IE7 识别 */
color:red\9; /* IE六、IE七、IE八、IE9 识别 */
color:red\0; /* IE八、IE9 识别*/
color:red\9\0; /* 仅IE9识别 */
color:red \0; /* 仅IE9识别 */
color:red!important; /* IE6 不识别!important 有危险*/
/* CSS选择符级Hack */
*html #demo { color:red;} /* 仅IE6 识别 */
*+html #demo { color:red;} /* 仅IE7 识别 */
body:nth-of-type(1) #demo { color:red;} /* IE9+、FF3.5+、Chrome、Safari、Opera 能够识别
*/
head:first-child+body #demo { color:red; } /* IE7+、FF、Chrome、Safari、Opera 能够识别 */
:root #demo { color:red\9; } : /* 仅IE9识别 */
google
越少的浮动,就会越少的代码,会有更灵活的页面,会有扩展性更强的页面。这很少说,归结为到必定水平了,浮动会用的较少。另外,您也会避免使用浮动+margin的用法。因此,越后来越不易遇到这种bug。spa
技巧二:padding,marign,height,width
注意是技巧,不是方法: 写好标准头 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> http://www.w3.org/1999/xhtml”> 尽可能用padding,慎用margin,height尽可能补上100%,父级height有定值子级height不用100%,子级全为浮动时底部补个空clear:both的div宽尽可能用margin,慎用padding,width算准实际要的减去padding。
技巧三:显示类(display:block,inline)
display:block,inline两个元素
display:block; //能够为内嵌元素模拟为块元素
display:inline; //实现同一行排列的的效果
display:table; //for FF,模拟table的效果
display:block块元素,元素的特色是: 老是在新行上开始;高度,行高以及顶和底边距均可控制;宽度缺省是它的容器的100%,除非设定一个宽度
display:inline就是将元素显示为行内元素,元素的特色是:和其余元素都在一行上;高,行高及顶和底边距不可改变;宽度就是它的文字或图片的宽度,不可改变。span,a,label,input,img,strong和em是 inline 元素的例子。
技巧四:怎样使一个div层居中于浏览器中?
1.
<style type="text/css">
<!-- div {
position:absolute;
top:50%;
left:50%;
margin:-100px 0 0 -100px;
width:200px;
height:200px;
border:1px solid red; } -->
</style>
2.div里的内容,IE默认为居中,而FF默认为左对齐,能够尝试增长代码margin: 0 auto;
技巧五:float的div闭合;清除浮动;自适应高度
① 例如:<div id="floatA"><div id="floatB"><div id="NOTfloatC">
这里的NOTfloatC并不但愿继续平移,而是但愿往下排。(其中floatA、floatB的属性已经设置为float:left;)
这段代码在IE中毫无问题,问题出在FF。缘由是NOTfloatC并不是float标签,必须将float标签闭合。在<divclass="floatB"><div class="NOTfloatC">之间加上<div class="clear">这个div必定要注意位置,并且必须与两个具备float属性的div同级,之间不能存在嵌套关系,不然会产生异常。而且将clear这种样式定义为为以下便可:.clear{clear:both;}
②做为外部 wrapper 的 div 不要定死高度,为了让高度能自适应,要在wrapper里面加上overflow:hidden; 当包含float的box的时候,高度自适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;能够作到,这样就达到了兼容。
例如某一个wrapper以下定义:
.colwrapper{overflow:hidden; zoom:1; margin:5px auto;}
③对于排版,咱们用得最多的css描述可能就是float:left.有的时候咱们须要在n栏的float div后面作一个统一的背景,譬如:
<div id=”page”>
<div id=”left”></div>
<div id=”center”></div>
<div id=”right”></div>
</div>
好比咱们要将page的背景设置成蓝色,以达到全部三栏的背景颜色是蓝色的目的,可是咱们会发现随着left centerright的向下拉长,而page竟然保存高度不变,问题来了,缘由在于page不是float属性,而咱们的page因为要居中,不能设置成float,因此咱们应该这样解决:
<div id=”page”>
<div id=”bg” style=”float:left;width:100%”>
<div id=”left”></div>
<div id=”center”></div>
<div id=”right”></div>
</div>
</div>
再嵌入一个float left而宽度是100%的DIV解决之。
④万能float 闭合(很是重要!)
关于 clear float 的原理可参见 [How To ClearFloats Without Structural Markup],将如下代码加入Global CSS 中,给须要闭合的div加上class=”clearfix”便可,屡试不爽。
/* Clear Fix */
.clearfix:after { content:"."; display:block; height:0; clear:both;visibility:hidden; }
.clearfix { display:inline-block; }
/* Hide from IE Mac */
.clearfix {display:block;}
/* End hide from IE Mac */
/* end of clearfix */
或者这样设置:.hackbox{display:table; //将对象做为块元素级的表格显示}
技巧六:div嵌套时 y轴上 padding和 marign的问题
FF里 y 轴上 子div 到 父div 的距离为 父padding + 子marign IE里 y 轴上 子div 到 父div 的距离为 父padding 和 子marign 里大的一个 FF里 y 轴上 父padding=0 且 border=0 时,子div 到 父div 的距离为0,子marign 做用到 父div 外面