作为一个初涉前端技术的IT菜鸟,IE浏览器的兼容问题是一个不得不跨越的坎。为了能够在不同浏览器达到同样的显示效果,就不得不花心思想出办法实现兼容。由于各大主流浏览器内核不同,各自的实现标准有所差异,因此同样的CSS样式表可能无法同时适应其它的浏览器,特别是IE6更是让人感觉崩溃。因此就需要用到CSS HACK技术。(针对不同浏览器写不同的CSS代码)

兼容IE6的第一步就是单独对IE进行兼容,你针对IE6所写的代码只影响IE6;有几种方法可以区

分开IE6:IE特有条件注释、CSS选择器、JavaScript,我们将逐一讨论。

一、使用IE特有条件注释

微软给IE添加了条件注释以区分不同版本,任何东西都可以塞进条件注释里:标签、JavaScript、js文件、css、内联样式。可以使用条件注释来针对某一个IE浏览器版本来编写代码。
规则如下:(译注:可参考IE 特有注释(hack))
<!--[if ie]>
这段文字会在所有IE浏览器显示
<![endif]--> <!--[if lte IE 6]>
这段文字仅显示在 IE6及IE6以下版本。
This message will only appear in versions of Internet Explorer less than or equal to version 6.
<![endif]--> <!--[if gte IE 6]>
这段文字仅显示在 IE6及IE6以上版本。
This message will only appear in versions of Internet Explorer greater than or equal to version 6.
<![endif]--> <!--[if gt IE 6]>
这段文字仅显示在 IE6以上版本(不包含IE6)。
This message will only appear in versions of Internet Explorer greater than version 6.
<![endif]--> <!--[if IE 5.5]>
这段文字仅显示在 IE5.5。
This message will only appear in Internet Explorer 5.5.
<![endif]--> <!--在 IE6及IE6以下版本中加载css-->
<!--[if lte IE 6]>
[*]
<![endif]--> 使用条件注释加载css的好处是这些样式是独立于其他css文件的,因此不会在编写兼容代码时弄 得一团糟;而且当IE6的市场份额降低到不需要兼容时,可以快速的清理掉。
使用条件注释的唯一缺点是在IE浏览器下会增加额外的HTTP请求数,所以需要权衡是否这样做 。但我不建议使用条件注释加载外部js文件,因为js文件会造成阻滞,在js未加载完之前其余文 件都不会被加载;对于js请使用JavaScript程序来区分浏览器而非条件注释。 二、使用CSS选择器区分开IE6 如果你不打算使用条件注释,CSS选择器是另外一个区分开IE6的办法,IE6不支持子选择器; 先针对IE6使用常规申明CSS选择器,然后再用子选择器针对IE7+及其他浏览器。
示例: <style type="text/css">
.content {color:red;}
div>p.content {color:blue;}
</style>
<div>
<p class="header">Some Header Text Here</p>
</div> 这个方法的缺点是容易把样式表弄得一团糟,所以一定要写好注释说明。
在示例中,针对IE6写的样式在其他浏览器中也会执行,但(标准浏览器中)之后的子选择器覆盖 了之前的申明,而IE6不支持子选择器所以忽略了它。 三、使用JavaScript区分开IE6 如果你想要使用JavaScript区分开IE6,请看示例: //原生JavaScript
if(typeof document.body.style.maxHeight === "undefined") {
alert('IE6 Detected');
}
//MooTools(框架)
if (Browser.Engine.trident4) {
alert('IE6 Detected');
}
//jQuery(框架)
if (($.browser.msie) && ($.browser.version == "6.0")){
alert('IE6 Detected');
}
解决IE6兼容性问题常见方法 1、使用声明 你必须经常在html网页头部放置一个声明,推荐使用严格的标准。例如 <!DOCTYPEHTMLPUBLIC“-//W3C//DTDHTML4.01//EN” "http://www.w3.org/TR/html4/strict.dtd”>
or,forXHTML:
<!DOCTYPEhtmlPUBLIC“-//W3C//DTDXHTML1.0Strict//EN” "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
最后你需要是IE6进入兼容模式,这已经足够兼容了。 2、使用position:relative 设置一个标签position:relative可以解决很多问题,特别是曾经有过看不见的经历或者奇怪布局的 框架。明显的,你需要小心,绝对位置放置的子元素是否都参照找到新位置。 3、为浮动元素使用display:inline IE6兼容性解决方案为浮动元素使用display:inline。浮动元素会有一个著名的IE6双边距 marginbug。假如你设置了左边距5px但实际上得到了10px左边距。display:inline可以解决这个 问题,尽管它不是必需的,但是css仍然有效。 4、设置元素启动hasLayout 大部分IE6(IE7)的渲染问题都可以通过起来元素的hasLayout属性来兼容。这是IE内置的设定 ,确定一个内容块相对其它内容块是有界限和位置的。当你需要设置一个行内元素例如一个连接 变成块状元素或者是透明效果,设置hasLayout也是必须的。 5、修复重复字符的bug IE6兼容性解决方案修复重复字符的bug。复杂的布局会触发一个bug:浮动对象的最后字符会出 现在已经清除浮动的元素后面。这里有几种解决的办法,部分是理想的,并且一些测试和出错是 必须的。
a、确保浮动元素都使用:display:inline;
b、最后一个浮动元素使用margin-right:-3px;
c、在浮动对象最后一个元素后使用一个条件注释。例如<!—>这里输入注释…<![endif]
d、在容器内的最后使用一个div空标签(它也必须设置90%宽度甚至更小) 6、使用a标签完成可点击和hover原理 IE6只支持a标签的css定义hover效果
你可以使用它去控制javascript启动的widgets,使得他们仍然保持键盘操作。这里有个二择一的 问题,但是a标签是所有解决方案中最可靠的。 区别不同浏览器的CSS hack写法: 区别IE6与FF:
background:orange;*background:blue;
区别IE6与IE7:
background:green !important;background:blue;
区别IE7与FF:
background:orange; *background:green;
区别FF,IE7,IE6:
background:orange;*background:green !important;*background:blue; 注:IE都能识别*;标准浏览器(如FF)不能识别*; IE6能识别*,但不能识别 !important,
IE7能识别*,也能识别!important;
FF不能识别*,但能识别!important; IE6 IE7 FF
_(下划线) √ × ×
*(星号) √ √ ×
!important × √ √ IE6支持下划线,IE7和firefox均不支持下划线。 于是大家还可以这样来区分IE6,IE7,firefox
background:orange;*background:green;_background:blue; 注:不管是什么方法,书写的顺序都是firefox的写在前面,IE7的写在中间,IE6的写在最后面。 1.css在不同浏览器下显示效果不同 firefox和IE对某些css样式的认定有不少区别,包括: -1 ul和ol的默认padding值是不一样的,在Firefox中,padding-left默认值为40px左右,而IE中为0,一般设置ul{margin:0;padding:0;}就能解决大部分问题 -2对字体大小small的定义不同,Firefox中为13px,而IE中为16px,差别挺大,也只能设置为14px了事;(暂时没有发现) -3 并列排列的多个元素(图片或者链接)的代码中的空格和回车会造成元素之间的间隙,而在firefox中和在IE中显示是不一样的,IE显示空格(约8px)、firefox显示空格(约4px) -4对不规范代码的兼容情况不同,IE中漏掉的关闭符号对显示不造成影响,而firefox中就会形成错乱的布局,而在ie中用到的padding和 margin的负值都会被firefox解析为0,易造成布局的混乱;(我觉得好像负值在firefox中也是有显示的) -5firefox对于长高尺寸的严格解析会造成与设置不匹配(超出)的图片或表格将原设置div撑大;
* !important属性可以在除IE浏览器的其他浏览器中起作用,因此有人利用这种差别来令一个CSS兼容多种浏览器; -6 未定义id的div,在IE中会与div属性中的其他设置有关,而在firefox中的位置会于div在文件中位置有关,紧随前一个div出现……(有待尝试) -7 设置为float的div在ie下设置的margin会加倍的,特别是margin-left,这是ie6的一个bug。解决的方法是在这个div里面加上display:inline; -8如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。(似乎有时候不会自动往下撑开,不知道具体怎么回事) -9 FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行。IE里设置text-align:center,就居中了,但在FF中不行。所以一般两个都要设置。 -10 FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width(也没感觉,觉得设了padding,大家的高宽都变了) -11在FF中可以实现的div 垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行。这种方法在IE中实现不了。(已试过!有用) -12FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。 -13 在浮动(float)的div后加clear属性,这可以解决背景的自适应高度问题。怎么加才能让不同浏览器都好使?IE中有默认行高,这是要解决的问题。 -14FF中不支持文字的自动转行;什么word-wrap:break-word;word-break:break-all都是IE搞的鬼,根本就不符合css标准。(现在看到的解决办法都是通过编程实现) 2.css解决不同浏览器的兼容问题的方法 (不是我们需要的方法,我们要达到的要求是尽量不写!important也能解决) 解决这种问题可以通过规范css代码,使其符合两种规范的标准样式,也可以在差别处利用!important对firefox设置属性,或者针对多种浏览器分别各自配置合适的CSS文件,再通过判断浏览器选择不同CSS实现兼容性。 代码如下:
<!--[if IE]>
#example { color: #333; } /* FF*/
* html #example { color: #666; } /* IE6 */
*+html #example { color: #999; } /* IE7 */
<![endif]--> 这样在IE6中显示字体颜色是#666;在IE7中显示的字体颜色是#999;在FF中显示的颜色是#333 3.FF解决背景的自适应高度问题 ①对于背景不能自动延伸的原因上面说的很清楚,解决方法是多嵌套一个层,这个层设置浮动,并承担背景,就ok了。
下面就简单示意一下 本行代码就是让背景颜色自动延续 可以这么理解:float使得层自动获得宽和高 但是有了第三种方法,这种方法好像并不值得推荐。 ②另一种方法就是给第一个div赋予属性值:display:table;但这种方法会造成另外一些布局上的错误。可以考虑使用,但不建议使用。 ③我想这是最重要的一种方法,但是中间问题很多。方法就是clear:both。 .clear{clear:both}可以使高度向下延续,但是会自动产生行高; .clear{clear:both;height:0}在FF中清除了行高,但是IE里不认; .clear{clear:both;height:1%}在FF和IE中仍然不认; 像之前写的.clear{clear:both;height:1%;font-size:0px;overflow:hidden}在IE中好使,但在FF中却不能让背景颜色延续,除非加上边框。! IE里面有默认的行高,必须把行高给清掉,可以用font-size:0px或line-height:0px;但是这里又有一个问题,就是height的值不要用百分数,没有用! 补充: 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.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值所以先定义 ul{margin:0;padding:0;}就能解决大部分问题 注意事项:
1、float的div一定要闭合。 例如:(其中floatA、floatB的属性已经设置为float:left;) <#div id=”floatA” ></#div> <#div id=”floatB” ></#div> <#div id=”NOTfloatC” ></#div>这里的NOTfloatC并不希望继续平移,而是希望往下排。这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。在 <#div class=”floatB”></#div> <#div class=”NOTfloatC”></#div>之间加上 <#div class=”clear”></#div>这个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”></#div> 相应的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的兼容问题,找来了下面这篇文章: 现在我大部分都是用!important来hack,对于ie6和firefox测试可以正常显示,但是ie7对!important可以正确解释,会导致页面没按要求显示!搜索了一下,找到一个针对IE7不错的hack方式就是使用“*+html”,现在用IE7浏览一下,应该没有问题了。 现在写一个CSS可以这样: #example { color: #333; } /* Moz */ * html #example { color: #666; } /* IE6 */ *+html #example { color: #999; } /* IE7 */ 那么在firefox下字体颜色显示为#333,IE6下字体颜色显示为#666,IE7下字体颜色显示为#999
解决IE中设了高度的LI间距问题
vertical-align:bottom;
上边的方法一般都会解决问题,但是许多时候许多未知的原因,还会导致间距问题的出现。试试以下方法:
1.定义行高 line-height
2.设置隐藏 overflow:hidden
3.li增加浮动属性 float 解决IE下hr显示有边距的问题
.hr1{ height:1px;border:none;border-top:1px solid Black;margin:0;*margin:0 0 -14px 0;float:none;*float:left;display:block;}
<hr class="hr1" />太牛了:
document.getElementById("return_no").getElementsByTagName("li"); 附刚做的一个简单CSS+DIV布局网页,在其它浏览器上面运行都没有问题,就IE6、IE7出现页面错乱,让人情何以堪啊。

IE6浏览器兼容问题及部分解决方案(网上整理)的更多相关文章

  1. IE浏览器兼容的常见问题及解决方案

    常见6个问题及解决方案 1 IE6/IE7对display:inline-block的支持还欠缺 就是我们做导航栏时通常会用到<ul><li>标签去写,在现在一些主流的浏览器中 ...

  2. ie6的兼容问题及解决方案

    1.png24位的图片在ie6浏览器上会出现背景,解决方案是做成png8位: 2.浏览器默认的margin和padding不同,解决方法是用全局重置来统一,即是*{margin:0;padding:0 ...

  3. 模态窗口showModalDialog的浏览器兼容解决方案【改】

    将代码中原来的 window.showModalDialog 全部替换成: showModalDialogN 然后增加方法: function showModalDialogN(uri, args, ...

  4. IE6 浏览器常见兼容问题 大汇总(23个)

    IE6以及各个浏览器常见兼容问题 大汇总 综述:虽然说IE6在2014年4月将被停止支持,但是不得不说的是,IE6的市场并不会随着支持的停止而立刻消散下去,对于WEB前端开发工程师来说,兼容IE6 兼 ...

  5. 仿淘宝头像上传功能(三)——兼容 IE6 浏览器。

    前两篇目录: 仿淘宝头像上传功能(一)——前端篇. 仿淘宝头像上传功能(二)——程序篇. 仿淘宝头像上传功能(三)——兼容 IE6 浏览器 之前的这两篇虽然实现了功能,但不兼容低版本浏览器,而且有些浏 ...

  6. IE浏览器兼容问题(下)——IE6的常见问题

    IE6常见兼容性问题 1.盒模型问题 (1)DTD问题 DTD:文档定义类型,规定了要遵循的书写规范. 如果不写DTD,高级浏览器还是可以正常加载,IE6会以怪异模式进行加载. 盒模型:正常应该是外扩 ...

  7. 前端编程提高之旅(三)----浏览器兼容之IE6

    在爱奇艺实习期间,乐帝主要负责移动端活动页面的制作,因为移动浏览器是随着智能手机兴起的,这就决定了移动端不会重蹈浏览器兼容问题的覆辙.一開始就比較好的支持web标准,而纵观整个互联网行业,移动web开 ...

  8. IE6 浏览器常见兼容问题 大汇总(23个)[转载]

    IE6以及各个浏览器常见兼容问题 大汇总 综述:虽然说IE6在2014年4月将被停止支持,但是不得不说的是,IE6的市场并不会随着支持的停止而立刻消散下去,对于WEB前端开发工程师来说,兼容IE6 兼 ...

  9. 怎么用css hack处理各浏览器兼容IE6,IE7,IE8,IE9/ FF

    第一:什么事浏览器兼容性 浏览器兼容性问题又被称为网页兼容性或网站兼容性问题,指网页在各种浏览器上的显示效果可能不一致而产生浏览器和网页间的兼容问题.在网站的设计和制作中,做好浏览器兼容,才能够让网站 ...

随机推荐

  1. Delphi新语法

    http://www.cnblogs.com/hnxxcxg/category/456344.html

  2. SPFA 最短路径打印方法

    #include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> ...

  3. POJ 1511 SPFA+邻接表 Invitation Cards

    题目大意: 计算从 1 点 到 其他所有点的 往返距离之和, 因为是 有向图, 所以我们需要将图反存 一次, 然后求两次单源最短路, 结果就出来了. #include <iostream> ...

  4. 调试makefile—subst函数

    操作系统:ubuntu10.04 Makefile里的subst用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO Makefile中的字符串处理函数格式:    ...

  5. sql server 修改字段大小

    alter table AAA ALTER COLUMN BBBvarchar(100);  这种语法只适合把字段往大了设置,  如果更新的字段大小比实际的要小时,并且数据库已存在比要更新的数据大时, ...

  6. Delphi自定义消息应用及delphi托盘实现

    Delphi自定义消息应用及delphi托盘实现interfaceuses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Co ...

  7. lr 增强窗格中,如何生成调试信息?

    我是根据电子书来操作的, 如何生成调试信息?在测试运行的某些时候,经常需要向输出设备发送消息,指出当前位置和其他信息.这些输出消息会出现在回放日志和 Controller 的输出窗口中.可以发送标准输 ...

  8. 怎么都没人提 google 加密搜索呢? google如何稳定打开

    1. 使用smarthosts提供的hosts文件 https://smarthosts.googlecode.com/svn/trunk/hosts2. 修改浏览器默认搜索引擎为 https://e ...

  9. MySQL如何利用索引优化ORDER BY排序语句 【转载】

    本文转载自:http://blog.csdn.net/ryb7899/article/details/5580624  .感谢相关作者. MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执 ...

  10. java.lang.UnsatisfiedLinkError: Native method not found 三种可能解决方案

    so文件编译生成后,运行时,有时候会遇到java.lang.UnsatisfiedLinkError: Native method not found问题,有可能是以下三种因素: 一.Jni方法头部大 ...