浏览器的兼容性
浏览器的五大厂商:IE 火狐 谷歌 苹果 欧朋
不同的浏览器有不同的版本;不同的版本有不同的兼容性
IE的兼容性要求:实际工作一般要求兼容到IE8,IE6的兼容性问题特别喜欢问。
IE6的兼容性处理好,面试官会认为你的工作经验丰富。
hack
hacker:黑客的意思 hack的分两类
1. HTML hack
同一套代码为了让不同的浏览器显示相同的效果,需要加hack来处理浏览器的兼容性问题。
针对不同的浏览器在同一个html文件里,去写不同的html结构。
IE浏览器有很多兼容性问题,给我们提供了一些接口
<!--[if lte IE 9]>
<h3>您的浏览器版本太低,请升级高版本</h3>
<![endif]-->
高级浏览器显示没有效果
lte:小于或等于该版本
lt:小于该版本
gt:大于该版本的显示
gte:大于或等于该版本
html hack表示低版本浏览器会认识这个hack,会正常渲染,高版本会认为这个hack是注释
针对IE6有固定的一个hack
<!--[if IE 6]>
<script type="text/javascript" src="js/png.js"></script>
<![endif]-->
表示,只有IE6浏览器可以看到里面的内容,其他浏览器会认为是注释
2. CSS hack
css hack包括值的hack和选择器的hack
CSS值的hack
/* IE 6 */
.selector { _color: blue; }
.selector { -color: blue; }
.box{
width: 300px;
height: 300px;
background: pink;
color:#000;
-color:#fff;/* 这个属性只有IE6能认识*/
font-size: 30px;8
}
Hack符:-、_
在属性名的前面加下划线或横线。
表示这个属性只有IE6认识,其他的都不认识这个属性。
/* IE 6/7 */
Hack符:! $ & * ( ) = % + @ , . / ` [ ] # ~ ? : <> |
.box{
width: 300px;
height: 300px;
background: pink;
color:#000;
/*这个属性只能IE6/7可以正常加载*/
!color:#fff;
font-size: 30px;9
}
表示这个属性只有IE6/7认识,其他的都不认识这个属性。
/* IE 8/9 */
.selector { color: blue\0/; } Hack符:\0/。
需要写在属性值的后面。
只在IE8、9里认识。
/* IE 6/7/8/9/10 */
.selector { color: blue\9; }
.box{
width: 300px;
height: 300px;
background: pink;
color:#000;
font-size: 20px;
/*这个属性只能IE6/7/8/9/10可以正常加载*/
background-color:lightblue\9;9
}
Hack符:\9.
需要写在属性值的后面,分号前。
选择器的hack
低于IE 6
/* IE 6 and below */
* html .selector {}
这种选择器只在IE6里加载,其他的浏览器认为你的选择器是错的。
高级浏览器认为html已经是根标签,*不是他的祖先元素。
* html .box{
width: 300px;
height: 300px;
background: lightblue;
color:#000;
font-size: 20px;7
} 等价写法:
.box{
-width: 300px;
-height: 300px;
_color:#000;
_font-size: 20px;
-background-color:lightblue;7
}
低于IE 7
/* IE 7 and below */
.selector, {}
这种选择器只在IE7及以下版本里加载,其他的浏览器认为你的选择器是错的。
.box,{
width: 300px;
height: 300px;
background: pink;
color:#000;
font-size: 20px;
background-color:lightblue\9;8
}
等价写法:
.box{
!width: 300px;
!height: 300px;
!color:#000;
!font-size: 20px;
!background-color:lightblue;7
}
除了IE 6
/* 除了IE 6 */
html > body .selector {}
这个>子级选择器:只选择儿子级,后代其他级别不选。
IE6不认识子级选择器。
除了IE6都能正常加载。
html>body .box{
width: 300px;
height: 300px;
background: pink;
color:#000;
font-size: 20px;
}
IE6的兼容性
IE 6的选择器的兼容性
之前的7种选择器:
通配符,标签选择器,类选择器,id选择器,(基本选择器)
后代选择器,交集选择器(div.box),并集选择器。(高级选择器)
IE6支持以上7种选择器,但是不支持交集选择器中连续类名的书写。
这种写法IE6不认识;
div.box.cl{
color:orange;
font-size: 30px;
}
解决办法:不写连续类名的选择器
div.box{}
盒模型的兼容问题
-
DTD问题
如果IE不写DTD他的盒模型是内减的。
解决办法:必须DTD
-
最小高度
如果盒子高度小于默认字号,不会正常显示。高度会是最小的字号。
解决方法:
单独给IE6浏览器,强制给个很小的字号。
.box{ width: 200px; height: 4px; background: pink; -font-size:0; }
-
浮动的盒子不会钻到底下
情况:一个盒子浮动,一个盒子不浮动,在IE6里,不浮动的盒子不会钻到浮动盒子的下面占领它原来的标准流位置。
.box1{ width: 100px; height: 100px; background: lightblue; float: left; } .box2{ width: 200px; height: 200px; background: pink;11 }
解决办法:同级的元素,要么都浮动要么都不浮动。
制作压盖效果必须用定位来实现。
-
像素的bug
情况:一个浮动,一个不浮动,IE6里两个盒子之间会出现3px的间距。
解决办法:给左边的盒子加负数的margin-right
.box1{ width: 100px; height: 100px; background: lightblue; float: left; margin-right:-3px; }
-
双倍margin问题
情况:一些元素浮动,有一个与浮动方向相同的方向的margin,第一个元素会出现双倍边距的问题。
.box p{ float: left; margin-left: 20px; width: 100px; height: 100px; background: pink; }
-
overflow:hidden失效
IE6不认识overflow:hidden;引申作用,没法帮我们清浮动,自动撑高盒子。
IE浏览器加载机制:
布局:layout
有布局:盒子本身加载的时候,根据自身内容来加载,会强制检测里面的元素,通过里面的元素性质进行自身布局。
没有布局:盒子本身加载的时候,根据祖先元素来加载,不会去管内部的元素。
IE里有很多属性可以触发有布局的机制。触发hasLayout机制,就可以让overflowhidden生效。
有一个属性永远触发hasLayout机制。
_zoom: 1;