IE6IE7Firefox浏览器不兼容原因及解决办法 一、IE6IE7Firefox浏览器不兼容原因及解决办法 1.文字 本身的大小不兼容。同样是font-size:14px的宋体文字,在不同浏览器下占的空间是不一样的,ie下实际占 高16px,下留白3px,ff下实际占高17px,上留白1px,下留白3px,opera下就更不一样了。 解决方案:给文字设定 line-height 。确保所有文字都有默认的 line-height 值。这点很重要,在高度上我们 不能容忍1px 的差异。 2.ff 下容器高度限定,即容器定义了height之后,容器边框的外形就确定了,不会被内容撑大,而ie下是会被内容撑大 ,高度限定失效。所以 不要轻易给容器定义height。 3.还讨论内容撑破容器问题,横向上的。如果float 容器未定义宽度,ff下内容会尽可能撑开容器宽度,ie下则会优先 考虑内容折行。 故,内容可能撑破的浮动容器需要定义width。 4.浮动 的清除,ff下不清除浮动是不行的。 5.double-margin bug。ie6下给浮动容器定义margin-left 或者margin-right 实际效果是数值的2倍。 解决方案,给浮动容器定义display:inline。 6.mirrormargin bug,当外层元素内有float元素时,外层元素如定义margin-top:14px,将自动生 成margin-bottom:14px。padding也会出现类似问题,都是ie6下的特产,该类bug 出现的情况较为复杂,远不只这一种 出现条件,还没系统整理。 解决方案:外层元素设定border 或 设定float。 引申:ff 和ie 下对容器的margin-bottom,padding-bottom的解释有时不一致,似乎与之相关。 7.吞吃 现象,还是ie6,上下两个div,上面的div设置背景,却发现下面没有设置背景的div 也有了背景,这就是吞吃 现象。对应上面的背景吞吃现象,还有滚动下边框缺失的现象。 解决方案:使用zoom:1。这个zoom好象是专门为解决ie6 bug而生的。 8.注释也能产生bug~~~“多出来的一只猪。”这是前人总结这个bug使用的文案,ie6的这个bug 下,大家会在页面看到 猪字出现两遍,重复的内容量因注释的多少而变。 解决方案:用“<!–[if !IE]> picRotate start <![endif]–>”方法写注释。 9.img下的留白,大家看这段代码有啥问题: <div> <img src=”” mce_src=”” /> </div> 把div的border打开,你发现图片底部不是紧贴着容器底部的,是img后面的空白字符造成,要消除必须这样写 <div> <img src=”” mce_src=”” /></div> 后面两个标签要紧挨着。ie7下这个bug 依然存在。 解决方案:给img设定 display:block。 10.失去line-height。<div style=”line-height:20px”><img />文字</div>,很遗憾,在ie6下单行文字 line-height 效果消失了。。。,原因是<img />这个inline-block元素和inline元素写在一起了。 解决方案:让img 和文字都 float起来。 引申:大家知道img 的align 有 text-top,middle,absmiddle啊什么的,你可以尝试去调整img 和文字让他们在ie 和ff下能一致,你 会发现怎么调都不会让你满意。索性让img 和文字都 f 11.链接的hover状态。a:hover img{width:300px} 我们想让鼠标hover时,链接里包含的图片宽度变化,可惜在ie6下无 效,ie7、ff下有效。loat起来,用margin 调整。 12.非链接的hover状态。div:hover{} 这样的样式ie6是不认的,在ie7、ff下才有效果。 13.block化的a链接,其内套absolute层,absolute层内放置img,ie下,鼠标点击img不会有链接效果,ff、op下正常。 14.无法彻底清除的float。如果让ul下的li具有了float属性,如何clear浮动的li呢?<ul><li class=”c”></li></ul> 或者 <ul><li><div>class=”c”></div></li></ul> 或者 <ul><li></li><div>class=”c”></div></ul> 或者 <ul><li></li></ul><div>class=”c”></div> 或者上述的组合? 这个问题,我无法给出解答。下面有个例子与此相关 <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd> <style type=text/css> .c{clear:both;overflow:hidden;+overflow:visible} .bd{border:1px solid red} ul.ex{list-style:none;} ul.ex li{float:left;border:1px solid green;} </style> <ul class="ex"> <li>sfsdfsfdf</li> <li>sfsdfsfdf</li> </ul> <div class="c"></div> <div class="bd" style=margin-top:19px>sfsdfsfdf</div> 请在ie下 测试,仅仅将 margin-top:19px 改为margin-top:20px 你发现什么了?要素:doctype必须 有,ie6、ie7下margin-top:19px还好好的,margin-top:20px 就出问题了,无法解释。。。大家还可以将 clear 层换 不同的位置测试。 解决方案:给ul 属性zoom:1 (给li 加zoom:1 没用) 引申:clear层应该单独使用。也许你为了节省代码把clear属性直接放到下面的一个内容层,这样有问题,不仅仅是 ff和op下失去margin效果,ie下某些margin值也会失效<div style=”background:red;float:left;”>dd</div> <div style=”clear:both;margin-top:18px;background:green”>ff</div> 15.ie下overflow:hidden对其下的绝对层position:absolute或者相对层position:relative无效。解决方 案:给overflow:hidden加position:relative或者position:absolute。另,ie6支持overflow-x或者overflow-y的特性 ,ie7、ff不支持。 16.ie6下严重的bug,float元素如没定义宽度,内部如有div定义了height或zoom:1,这个div就会占满一整行,即使你 给了宽度。float元素如果作为布局用或复杂的容器,都要给个宽度的。 17.ie6下的bug,绝对定位的div下包含相对定位的div,如果给内层相对定位的div高度height具体值,内层相对层将具 有100%的width值,外层绝对层将被撑大。解决方案给内层相对层float属性。 18.ie6下的bug,<head></head>内有<base target=”_blank”/>的情况下,position:relative层下的float层内文字无 法选中。这个bug迫使我修公用样式库。 19.ff的缺点。width:100%这个东西在ie里用很方便,会向上逐层搜索width值,忽视浮动层的影响,ff下搜索至浮动层 结束,如此,只能给中间的所有浮动层加width:100%才行 二、用css hack解决IE5 IE5.5 IE6 Firefox浏览器兼容性 1. 区别FF和IE
1-1 首先,当然是!important大法,可以提升指定样式规则的应用优先权,如下面的例子:
插入代码: div{ background-color: red !important; background-color: blue; } 因为!important声明在IE6中并不是绝对的,它会被之后的同名属性定义所替换。也就是说在上面的例子中,IE6所应用 的是最后一个背景色的值,即“blue”;而在FF中背景色的值为“red”。
1-2 还有一种方法,就是IE浏览器可以识别“>”等一些符号,如“~”、“`”、“
插入代码: div{ background-color: red; >background-color: blue; } 在FF中得到的是背景色红色,而在IE中得到的背景色是蓝色,根据样式重定义的规则,如果浏览器可以识别“>”,则应 该得到的蓝色的背景,因此可以知道“>”只有IE可以识别。 这样,我们就可以把FF和IE的样式分离开。下面就是解决IE自己的问题了。
2. 完整的Hack 这样我们就可以为不同的浏览器定义不同的样式了。来看个完整的例子:
插入代码: div{ width: 500px; height: 50px; background-color: red !important;/*FF*/ background-color: blue;/*IE5*/ text-align:center; } div/*IE5.5+*/{ >/*IE only*/background-color: black;/*IE6*/ >/*IE only*/background-color /*IE5.5*/: green; }
需要注意的是,在上面例子中“background-color”定义的顺利不能改变,即FF-IE5-IE6-IE5.5。对于IE的定义在属性 前要加“>”,因为“div/**/{}”这个HACK在FF中可以识别。
鼠标手形:(兼容IE FF) hand等同于pointer,而后者可以兼容IE和FF。 三、 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同级,之间不能存在 嵌套关系,否则会产生异常。 并且将clear这种样式定义为为如下即可: .clear{clear:both;} 此外,为了让高度能自动适应,要在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; 例如: < #div id="imfloat"> 相应的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则会忽略.如 下 .tabd1{ background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/ background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */} 值得注意的是,一定要将xxxx !important 这句放置在另一句之上,上面已经提过 常见兼容问题: 1.DOCTYPE 影响 CSS 处理 2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行 3.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中 4.FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width 5.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式 6.div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入 文字,就垂直居中了。缺点是要控制内容不要换行 7.cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以 8.FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。 9.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法: div{margin:30px!important;margin:28px;} 注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器可以识别。 所以在IE下其实解释成这样: div{maring:30px;margin:28px} 重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important; 10.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} 关于这个/**/是什么我也不太明白,只知道IE5和firefox都支持但IE6不支持,如果有人理解的话,请告诉我一声, 谢了!:) 11.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值所以先定义ul{margin:0;padding: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同级,之间不能存在 嵌套关系,否则会产生异常。 并且将clear这种样式定义为如下即可:.clear{clear:both;} 此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden; 当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶 的IE啊!)用zoom:1;可以做到,这样就达到了兼容。 例如某一个wrapper如下定义:.colwrapper{ overflow:hidden; zoom:1; margin:5px auto;} 2、margin加倍的问题。 设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。 解决方案是在这个div里面加上display:inline; 例如: <#div id=\”imfloat\”> 相应的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则会忽略.如 下.tabd1{ background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/ background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */} 值得注意的是,一定要将xxxx !important 这句放置在另一句之上,上面已经提过; IE7.0出来了,对CSS的支持又有新问题。浏览器多了,网页兼容性更差了,疲于奔命的还是我们 ,为解决IE7.0的 兼容问题,找来了下面这篇文章: 现在写一个CSS可以这样: #example { color: #333; } /* Moz */ * html #example { color: #666; } /* IE6 */ *+html #example { color: #999; } /* IE7 */ 那么在firefox下字体颜色显示为#333,IE6下字体颜色显示为#666,IE7下字体颜色显示为#999,他们都互不干扰。 五、margin加倍的问题。 设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。 解决方案: 是在这个div里面加上display:inline; 例如: <#div id="imfloat"></#div> 相应的css为 以下为引用的内容: #IamFloat{ float:left; margin:5px;/*IE下理解为10px*/ display:inline;/*IE下再理解为5px*/} 六、 1.最简单的鼠标移过手变型的css要改了 cursor:pointer;/*ff不支持cursor:hand*/ dw8下面自动出来的也没有hand这 个属性了,标准的是pointer 2.ff不支持滤镜 最常见的半透明不支持。 filter: Alpha(Opacity=50); /* for IE */ opacity: .5;/* for Firefox */ style="-moz-opacity:0.5; filter:alpha(opacity=50);cursor:hand;" onmouseover="this.style.MozOpacity=1; this.filters.alpha.opacity=100" onmouseout="this.style.MozOpacity=0.5; this.filters.alpha.opacity=50" 3.ff不支持expression 例如去掉链接的边框要分别写不同的css a,area { blr:expression(this.onFocus=this.blur()) } /* for IE */ :focus { outline: none; } /* for Firefox */ 4.ff不支持div滚动条的颜色设置,目前还没有找到替换的好方法。 .contendiv { position: absolute; left: 0px; top: 10px; width: 580px;height: 135px; line-height:120%;text-align:left; font-family:"宋体";word-break : break-all; color:#6D6E71; OVERFLOW-Y:auto;OVERFLOW-X:no; SCROLLBAR-ARROW-COLOR: red; SCROLLBAR-TRACK-COLOR: F6F6F6;SCROLLBAR-FACE-COLOR:#F6F6F6;SCROLLBAR-SHADOW-COLOR:#F6F6F6; SCROLLBAR-DARKSHADOW-COLOR:#F6F6F6;SCROLLBAR-3DLIGHT-COLOR:#F6F6F6;SCROLLBAR-HIGHLIGHT-COLOR:#F6F6F6; } 这个在ff里面完全没有效果了。 5.ie下面显示在文字下面横线的border-width: 0px 0px 1px 0px;在ff里面跑到文字上面去了。 原来是ff的容错能力太差了,是下面的width: 186px;height: 0px;宽高 引起的,其实a:haver已经继承了上级的属 性了,只要定义不同的样式就可以了,看来ff有助于制作标准化,简洁化的网页,对css的理解也更深刻,对提供css来 说是个很好的帮助 .onelinksdiv a:hover { display: block;border-style: solid;color: #ff0000;border-width: 0px 0px 1px 0px; /* display: block;border-style: solid; border-width: 0px 0px 1px 0px; width: 186px;height: 0px; color: #ff0000; font-size: 14px;text-align: right; */ } //下面的写法在ie下面正常,但在ff下是错误的 .onelinksdiv a:hover { display: block;border: #ff0000 solid; border-width: 0px 0px 1px 0px; width: 186px;height: 0px; color: #ff0000; font-size: 14px;text-align: right; } 相关参考资料: border-width:border-top-width border-right-width border-bottom-width border-left-width; p#fourborders { border-width:thick medium thin 12px; } 如果定义四个值,那么这四个值就分别是上,右,下,左边框的宽度值(从上边框开始,以逆时针的顺序遍历). 等价于下面的定义 p#fourborders { border-top-width:thick; border-right-width:medium; border-bottom-width:thin; border-left-width:12px; } 6.ff不支持<body scroll="no" > scroll属性,必须定义overflow:hidden;而且要在html标签下,不能在body下 html{ overflow:hidden; } 7.ff不支持数据岛绑定<xml id="news" src="news.xml" ></xml>在ie下可以加载进数据,但到了火狐就加载不进数据了 ,开始以为可能是因为内容行文字太多导致不能断行不能加载,但删除只剩几个字以后一样不行。 8.style="word-break:break-all"在网页中的单元格里的内容超出一行时,在ie浏览器里定义的换行样式能够正常使用, 但在firefox里却不能被支持了.style="word-break:break-all" 是MS扩展的IE专有属性,并未成为W3C标准,因而 Firefox 还不能支持它。不过MS已经将其提交到了W3C,而在W3C的CSS3的候选方案中也能看到它。希望这个属性在被W3C 最终定案的为CSS3标准后,Firefox可以支持吧。这之前,可以试试 style="table-layout:fixed;word-wrap: break-word" (当它是英文的时候就不能正常换行了) 9.目前FF2.0为止都不支持IE的name锚点 像这种写法都是不支持的:<a href="###" onclick="history.Go(-1)">go back</a> 原来根据W3C的语法,<a>标签始终都会查找href地址并跳转过去,现在onclick事件与###这个地址又有冲突。 为了让Firefox与IE部分元素属性兼容,那个费劲,我无意中发现Firefox对空格敏感: <a onclick="window.location.href ='faq.PHP?page=messages#2'"> //有空格,锚点作用 <a onclick="window.location.href='faq.php?page=messages#2'"> //无空格,锚点无作用 锚点的写法又十分讲究,比如<a name=#1>,Firefox不支持锚点,得加上id=#1 静态同页面引用时必须这样写:<a href="#1"></a>,<a href="static.html#1"></a>就不行,动态页面要用JS 后遗症来了,考虑到鼠标样式和浏览器兼容又开始折腾: <a href="###" onclick=""> //不兼容 <a href="JavaScript:;" onclick=""> //不兼容 <a href="javascript:function();"> //没有{...},属于脚本的非法书写 <a style="cursor:hand" onclick=""> //没照顾到自定义系统鼠标样式的用户 <a href="javascript:onclick=''"> //状态栏会显现,href有多长显示多长 <a href=# onclick=""> //我用的 10.ff火狐下面不支持document.all属性的,必需用document.getElementById('idName'); 以下是我的动画切换效果,在ie下正常,到了火狐里面就不动了,修改后可以切换图片但渐隐渐现的效果就没有了。原 因是火狐不支持滤镜filter,只好用半透明的div来实现了。 /* company page */ function playcompanyimg() { window.setInterval('changecompanyimg();', interval); } function changecompanyimg() { /* 火狐下面不支持document.all属性的,必需用document.getElementById('idName'); */ //if (document.all) //{ /** 以下两句是在切换效果前切换背景图片的代码,number、image和idtemp要设置全局变量才可以 */ number = Math.floor(Math.random() * image.length); idtemp.src=image[number]; //alert(number+" ii "+idtemp.src) /** 以下两句是实现幻灯片切换效果的 */ //alert(do_transition); //document.all.companyimg.style.filter="progid:DXImageTransform.Microsoft.Fade(duration=2,overlap=0.4)"; /* document.all.companyimg.style.filter="progid:DXImageTransform.Microsoft.Fade(duration=1,overlap=1)"; document.all.companyimg.filters[0].Apply(); document.all.companyimg.filters[0].Play(); */ var companyimgidtmep = document.getElementById('companyimg'); companyimgidtmep.style.filter="progid:DXImageTransform.Microsoft.Fade(duration=1,overlap=1)"; companyimgidtmep.filters[0].Apply(); companyimgidtmep.filters[0].Play(); //} } 参考资料:核心:FILTER:revealTrans(duration=1,transition=23); 一个IE滤镜, 在其它的非IE浏览器虽然不支持这个滤镜,但是支持透明滤镜的,你可以分一下,IE下继续使用你这个效果,而在非IE 浏览器下用透明滤镜: style.opacity opacity = 0.5 CSS3 style.MozOpacity -moz-opacity: 0.5 Mozilla 里等同上面这个滤镜 这个滤镜也适用于Netscape style.KHTMLOpacity -khtml-opacity: 0.5 Safari 里的透明滤镜。 11.ff中div定位不能通过js初始化 必须先设定值并且要设定度量单位 top:80px;left:212px; 12.ff不能用.click();方法打开链接 <div><a href="#" onclick="test1(2)" id="a3_a">hello</a> </div> <div> <a href="" onclick ="test2(1)" id="b3">hello2</a></div> <div><a href="javascript:onclick =test2(1)" id="b3">hello3</a>触发事件放在href="javascript:onclick =test2(1)" 里面ff无效</div> <div onclick="test2(1)" id="b3">hello3</div> <script language="javascript"> <!-- function test1(num) { window.alert(num); } function test2(num) { var aaa_a = document.getElementById("a3_a"); if(document.all) {//if(getOs()=="MSIE"){//IE的处理 aaa_a.click(); } else { var evt = document.createEvent("MouseEvents"); evt.initEvent("click",true,true); aaa_a.dispatchEvent(evt); } } /* 判断浏览器类型 */ function getOs() { var OsObject = ""; if(navigator.userAgent.indexOf("MSIE")>0) { return "MSIE"; } if(isFirefox=navigator.userAgent.indexOf("Firefox")>0){ return "Firefox"; } if(isSafari=navigator.userAgent.indexOf("Safari")>0) { return "Safari"; } if(isCamino=navigator.userAgent.indexOf("Camino")>0){ return "Camino"; } if(isMozilla=navigator.userAgent.indexOf("Gecko/")>0){ return "Gecko"; } } //--> </script> <!-- 由于这里的链接是index的iframe用href="#" 在ie中无法正常显示, 而用href="javascript:onclick = display('whatwedo')"的方式火狐不支持打开第一个链接,火狐必须 用onclick="display('whoweare')" 本以为火狐浏览器使用的人很多,但从网站的统计分析来看火狐只有可怜的3.18%,但兼容他的标准确花费不少精力!不 过标准化有利于以后的维护和扩展,有利于技术的不断提示。 --> 13.OVERFLOW-Y:auto;OVERFLOW-X:hidden;在ie里面可以用no表示隐藏,但在ff里面必须用hidden IE6下靠边浮动的元素的margin加倍的问题 最左边的一个float:left;明明是margin-left:5px;却多出来了5px -- 解决答案 -- 这是ie6中一个十分经典的Bug,即:靠边浮动的元素的margin加倍。这时只要将此元素(背景色为红色的元 素)的display属性改为inline。 修改后的代码: <html> <div style="float:left;margin-left:10px;background:red;width:20px;height:20px;display:inline;"></div> <div style="float:left;background:green;width:20px;height:20px;"></div> <div style="float:left;background:blue;width:20px;height:20px;"></div> <div style="clear:left;margin-left:10px;background:black;width:20px;height:20px;"></div> </html> 七、CSS技巧 1.div的垂直居中问题 vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是 要控制内容不要换行 2. margin加倍的问题 设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。解决方案是在这个div里面加 上display:inline; 例如: <#div id=”imfloat”> 相应的css为 #IamFloat{ float:left; margin:5px;/*IE下理解为10px*/ display:inline;/*IE下再理解为5px*/} 3.浮动ie产生的双倍距离 #box{ float:left; width:100px; margin:0 0 0 100px; //这种情况之下IE会产生200px的距离 display:inline; //使 浮动忽略} 这里细说一下block与inline两个元素:block元素的特点是,总是在新行上开始,高度,宽度,行高,边距都可以控制(块元 素);Inline元素的特点是,和其他元素在同一行上,不可控制(内嵌元素); #box{ display:block; //可以为内嵌元素模拟为块元素 display:inline; //实现同一行排列的效果 diplay:table; 4 IE与宽度和高度的问题 IE 不认得min-这个定义,但实际上它把正常的width和height当作有min的情况来使。这样问题就大了,如果只用宽度和 高度,正常的浏览器里这两个值就不会变,如果只用min-width和min-height的话,IE下面根本等于没有设置宽度和高度 。 比如要设置背景图片,这个宽度是比较重要的。要解决这个问题,可以这样: #box{ width: 80px; height: 35px;}html>body #box{ width: auto; height: auto; min-width: 80px; min-height: 35px;} 5.页面的最小宽度 min -width是个非常方便的CSS命令,它可以指定元素最小也不能小于某个宽度,这样就能保证排版一直正确。但IE不认 得这个,而它实际上把width当做最小宽度来使。为了让这一命令在IE上也能用,可以把一个<div> 放到 <body> 标签下 ,然后为div指定一个类, 然后CSS这样设计: #Container{ min-width: 600px; width:expression(document.body.clientWidth < 600? "600px": "auto" );} 第一个min-width是正常的;但第2行的width使用了Javascript,这只有IE才认得,这也会让你的HTML文档不太正规。它 实际上通过Javascript的判断来实现最小宽度。 6.DIV浮动IE文本产生3象素的bug 左边对象浮动,右边采用外补丁的左边距来定位,右边对象内的文本会离左边有3px的间距. #box{ float:left; width:800px;} #left{ float:left; width:50%;} #right{ width:50%;} *html #left{ margin-right:-3px; //这句是关键} <div id="box"> <div id="left"></div> <div id="right"></div> </div> 7.IE捉迷藏的问题 当div应用复杂的时候每个栏中又有一些链接,DIV等这个时候容易发生捉迷藏的问题。 有些内容显示不出来,当鼠标选择这个区域是发现内容确实在页面。 解决办法:对#layout使用line-height属性 或者给#layout使用固定高和宽。页面结构尽量简单。 8.float的div闭合;清除浮动;自适应高度; ① 例如:<#div id=”floatA” ><#div id=”floatB” ><#div id=” NOTfloatC” >这里的NOTfloatC并不希望继续平 移,而是希望往下排。(其中floatA、floatB的属性已经设置为 float:left;) 这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。在 <#div class=”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 center right 的向下拉长,而 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 Clear Floats 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; //将对象作为块元素级的表格显示} 9.高度不适应 高度不适应是当内层对象的高度发生变化时外层高度不能自动进行调节,特别是当内层对象使用margin 或paddign 时。 例: #box {background-color:#eee; } #box p {margin-top: 20px;margin-bottom: 20px; text-align:center; } <div id="box"> <p>p对象中的内容</p> </div> 解决方法:在P对象上下各加2个空的div对象CSS代码:.1{height:0px;overflow:hidden;}或者为DIV加上border属性。 10 .IE6下为什么图片下有空隙产生 解决这个BUG的方法也有很多,可以是改变html的排版,或者设置img 为display:block 或者设置vertical-align 属性为 vertical-align:top | bottom |middle |text-bottom 都可以解决. 11.如何对齐文本与文本输入框 加上 vertical-align:middle; <style type="text/css"> <!-- input { width:200px; height:30px; border:1px solid red; vertical-align:middle; } --> </style> 12.web标准中定义id与class有什么区别吗 一.web标准中是不容许重复ID的,比如 div id="aa" 不容许重复2次,而class 定义的是类,理论上可以无限重复, 这样需要多次引用的定义便可以使用他. 二.属性的优先级问题 ID 的优先级要高于class,看上面的例子 三.方便JS等客户端脚本,如果在页面中要对某个对象进行脚本操作,那么可以给他定义一个ID,否则只能利用遍历页面 元素加上指定特定属性来找到它,这是相对浪费时间资源,远远不如一个ID来得简单. 13. LI中内容超过长度后以省略号显示的方法 此方法适用与IE与OP浏览器 <style type="text/css"> <!-- li { width:200px; white-space:nowrap; text-overflow:ellipsis; -o-text-overflow:ellipsis; overflow: hidden; } --> </style> 14.为什么web标准中IE无法设置滚动条颜色了 解决办法是将body换成html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <style type="text/css"> <!-- html { scrollbar-face-color:#f6f6f6; scrollbar-highlight-color:#fff; scrollbar-shadow-color:#eeeeee; scrollbar-3dlight-color:#eeeeee; scrollbar-arrow-color:#000; scrollbar-track-color:#fff; scrollbar-darkshadow-color:#fff; } --> </style> 15.为什么无法定义1px左右高度的容器 IE6下这个问题是因为默认的行高造成的,解决的方法也有很多,例如:overflow:hidden | zoom:0.08 | line-height:1px 16.怎么样才能让层显示在FLASH之上呢 解决的办法是给FLASH设置透明 <param name="wmode" value="transparent" /> 17.怎样使一个层垂直居中于浏览器中 这里我们使用百分比绝对定位,与外补丁负值的方法,负值的大小为其自身宽度高度除以二 <style type="text/css"> <!-- div { position:absolute; top:50%; lef:50%; margin:-100px 0 0 -100px; width:200px; height:200px; border:1px solid red; } --> </style> 八、FF与IE 1. Div居中问题 div设置 margin-left, margin-right 为 auto 时已经居中,IE 不行,IE需要设定body居中,首先在父级元素定 义text-algin: center;这个的意思就是在父级元素内的内容居中。 2.链接(a标签)的边框与背景 a 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。 3.超链接访问过后hover样式就不出现的问题 被点击访问过的超链接样式不在具有hover和active了,很多人应该都遇到过这个问题,解决方法是改变CSS属性的排列顺 序: L-V-H-A Code: <style type="text/css"> <!-- a:link {} a:visited {} a:hover {} a:active {} --> </style> 4. 游标手指cursor cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以 5.UL的padding与margin ul标签在FF中默认是有padding值的,而在IE中只有margin默认有值,所以先定义 ul{margin:0;padding:0;}就能解决大部 分问题 6. FORM标签 这个标签在IE中,将会自动margin一些边距,而在FF中margin则是0,因此,如果想显示一致,所以最好在css中指定margin和 padding,针对上面两个问题,我的css中一般首先都使用这样的样式ul,form{margin:0;padding:0;}给定义死了,所以后面 就不会为这个头疼了. 7. BOX模型解释不一致问题 在FF和IE 中的BOX模型解释不一致导致相差2px解决方法:div{margin:30px!important;margin:28px;} 注意这两个 margin的顺序一定不能写反, important这个属性IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样: div {maring:30px;margin:28px}重复定义的话按照最后一个来执行,所以不可以只写margin:xx px!important; #box{ width:600px; //for ie6.0- w\idth:500px; //for ff+ie6.0} #box{ width:600px!important //for ff width:600px; //for ff+ie6.0 width /**/:500px; //for ie6.0-} 8.属性选择器(这个不能算是兼容,是隐藏css的一个bug) p[id]{}div[id]{} 这个对于IE6.0和IE6.0以下的版本都隐藏,FF和OPera作用.属性选择器和子选择器还是有区别的,子选择器的范围从形式 来说缩小了,属性选择器的范围比较大,如p[id]中,所有p标签中有id的都是同样式的. 9.最狠的手段 - !important; 如果实在没有办法解决一些细节问题,可以用这个方法.FF对于”!important”会自动优先解析,然而IE则会忽略.如下 .tabd1{ background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/ background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */} 值得注意的是,一定要将xxxx !important 这句放置在另一句之上,上面已经提过
10.为什么FF下文本无法撑开容器的高度 标准浏览器中固定高度值的容器是不会象IE6里那样被撑开的,那我又想固定高度,又想能被撑开需要怎样设置呢?办法就 是去掉height设置min-height:200px; 这里为了照顾不认识min-height的IE6 可以这样定义: { height:auto!important; height:200px; min-height:200px; } 11.FireFox下如何使连续长字段自动换行 众所周知IE中直接使用 word-wrap:break-word 就可以了, FF中我们使用JS插入 的方法来解决 <style type="text/css"> <!-- div { width:300px; word-wrap:break-word; border:1px solid red; } --> </style> <div id="ff">aaaaaaaaaaaaaaaaaaaaa</div> <scrīpt type="text/javascrīpt"> /* <![CDATA[ */ function toBreakWord(el, intLen){ var ōbj=document.getElementById(el); var strContent=obj.innerHTML; var strTemp=""; while(strContent.length>intLen){ strTemp+=strContent.substr(0,intLen)+" "; strContent=strContent.substr(intLen,strContent.length); } strTemp+=" "+strContent; obj.innerHTML=strTemp; } if(document.getElementById && !document.all) toBreakWord("ff", 37); /* ]]> */ </scrīpt> 12.为什么IE6下容器的宽度和FF解释不同呢 <?xml version="1.0" encoding="gb2312"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <style type="text/css"> <!-- div { cursor:pointer; width:200px; height:200px; border:10px solid red } --> </style> <div ōnclick="alert(this.offsetWidth)">让FireFox与IE兼容</div> 问题的差别在于容器的整体宽度有没有将边框(border)的宽度算在其内,这里IE6解释为200PX ,而FF则解释为220PX,那 究竟是怎么导致的问题呢?大家把容器顶部的xml去掉就会发现原来问题出在这,顶部的申明触发了IE的qurks mode,关于 qurks mode、 standards mode的相关知识,请参考:http: //www.microsoft.com/china/msdn/library/webservices/asp.NET/ ASPNETusStan.mspx?mfr=true IE6,IE7,FF IE7.0 出来了,对CSS的支持又有新问题。浏览器多了,网页兼容性更差了,疲于奔命的还是我们 ,为解决IE7.0的兼容 问题,找来了下面这篇文章: 现在我大部分都是用!important来hack,对于ie6和firefox测试可以正常显示,但是ie7 对!important可以正确解释,会导致页面没按要求显示!下面是三个浏览器的兼容性收集. 第一种,是CSS HACK的方法 height:20px; /*For Firefox*/ *height:25px; /*For IE7 & IE6*/ _height:20px; /*For IE6*/ 注意顺序。 这样也属于CSS HACK,不过没有上面这样简洁。 #example { color: #333; } /* Moz */ * html #example { color: #666; } /* IE6 */ *+html #example { color: #999; } /* IE7 */
第二种,是使用IE专用的条件注释 <!--其他浏览器 --> <link rel="stylesheet" type="text/css" href="css.css" /> <!--[if IE 7]> <!-- 适合于IE7 --> <link rel="stylesheet" type="text/css" href="ie7.css" /> <![endif]--> <!--[if lte IE 6]> <!-- 适合于IE6及一下 --> <link rel="stylesheet" type="text/css" href="ie.css" /> <![endif]--> 第三种,css filter的办法,以下为经典从国外网站翻译过来的。. 新建一个css样式如下: #item { width: 200px; height: 200px; background: red; } 新建一个div,并使用前面定义的css的样式: <div id="item">some text here</div> 在body表现这里加入lang属性,中文为zh: <body lang="en"> 现在对div元素再定义一个样式: *:lang(en) #item{ background:green !important; } 这样做是为了用!important覆盖原来的css样式,由于:lang选择器ie7.0并不支持,所以对这句话不会有任何作用,于是也 达到了ie6.0下同样的效果,但是很不幸地的是,safari同样不支持此属性,所以需要加入以下css样式: #item:empty { background: green !important } :empty选择器为css3的规范,尽管safari并不支持此规范,但是还是会选择此元素,不管是否此元素存在,现在绿色会现在 在除ie各版本以外的浏览器上。 对IE6和FF的兼容可以考虑以前的!important 个人比较喜欢用第一种,简洁,兼容性比较好。 |