珠峰培训

浏览器内核 及兼容问题

作者:fandonglai

2017-01-15 23:26:18

567

浏览器内核

    -moz-对应 Firefox, 
-webkit-对应 Safari and Chrome
-o- for Opera
-ms- for Internet Explorer

兼容写法

1.css 内部 hack

-(1)前缀

*、+ 、_ ———————— ie6
*、+ —————————— ie7

  • ———————————— ie8
    *> ————————————firefox

-(2)后缀

“-″减号是IE6专有的hack —待验证
“\9″ IE6/IE7/IE8/IE9/IE10都生效,11不生效
“\0″ IE8/IE9/IE10都生效,是IE8/9/10/11的hack
“\9\0″ 只对IE8/IE9/IE10生效hack

2.css选择器hack=选择器前缀

IE6能识别html .class{},IE7能识别+html .class{}或者*:first-child+html .class{}。

3.css html头部判断

    <!--[if !IE]> 除IE外都可识别  <!--<![endif]-->

<!--[if IE]> 所有的IE可识别 <![endif]-->

<!--[if IE 5.0]> 只有IE5.0可以识别 <![endif]-->

<!--[if IE 5]> 仅IE5.0与IE5.5可以识别 <![endif]-->

<!--[if gt IE 5.0]> IE5.0以及IE5.0以上版本都可以识别 <![endif]-->

<!--[if IE 6]> 仅IE6可识别 <![endif]-->

<!--[if lt IE 6]> IE6以及IE6以下版本可识别 <![endif]-->

<!--[if gte IE 6]> IE6以及IE6以上版本可识别 <![endif]-->

<!--[if IE 7]> 仅IE7可识别 <![endif]-->

<!--[if lt IE 7]> IE7以及IE7以下版本可识别 <![endif]-->

<!--[if gte IE 7]> IE7以及IE7以上版本可识别<![endif]-->


样式识别

    IE都能识别*;标准浏览器(如FF)不能识别*
IE6能识别*;不能识别 !important;
IE7能识别*,能识别!important;
FF不能识别*,但能识别!important;

IE兼容性常见问题

块属性标签float后,又有横行的margin情况下,在IE6显示margin比设置的大
  问题症状:常见症状是IE6中后面的一块被顶到下一行
  碰到频率: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是正道。
css布局中的居中问题
主要的样式定义如下:

    body {TEXT-ALIGN: center;} 
.center { MARGIN-RIGHT: auto; MARGIN-LEFT: auto; }

说明:
首先在父级元素定义TEXT-ALIGN: center;这个的意思就是在父级元素内的内容居中;对于IE这样设定就已经可以了。

min-属性
.Container{ 
min-width: 600px;
width:e-xpression(document.body.clientWidth < 600? “600px”: “auto” );
}

min-width是个非常方便的CSS命令,它可以指定元素最小也不能小于某个宽度,这样就能保证排版一直正确。但IE不认得这个,而它实际上把 width当做最小宽度来使。

其他兼容技巧(相当有用)

1, FF下给 div 设置 padding 后会导致 width 和 height 增加, 但IE不会.(可用!important解决)
2, 居中问题.
1).垂直居中.将 line-height 设置为当前 div 相同的高度, 再通过 vetical-align: middle.( 注意内容不要换行.)
2).水平居中. margin: 0 auto;(当然不是万能)
3, 若需给 a 标签内内容加上 样式, 需要设置 display: block;(常见于导航标签)
4, FF 和 IE 对 BOX 理解的差异导致相差 2px 的还有设为 float的div在ie下 margin加倍等问题.
5, ul 标签在 FF 下面默认有 list-style 和 padding . 最好事先声明, 以避免不必要的麻烦. (常见于导航标签和内容列表)
6, 作为外部 wrapper 的 div 不要定死高度, 最好还加上 overflow: hidden.以达到高度自适应.
7, 关于手形光标. cursor: pointer. 而hand只适用于 IE.
万能float

<style> 

.clearfix:after {
content:".";
display:block;
height:0;
clear:both;
visibility:hidden;
}

.clearfix {
display:inline-block;
}


.clearfix {display:block;}


</style>

截字省略号
select { 
-o-text-overflow:ellipsis;
text-overflow:ellipsis;
white-space:nowrap;
overflow:hidden;
width:100%;
}


这个是在越出长度后会自行的截掉多出部分的文字,并以省略号结尾,很好的一个技术。
FF不兼容可以调用jQuery ellipsis plugin

如何定义1px左右高度的容器?
IE6下这个问题是因为默认的行高造成的,解决的方法例如:overflow:hidden | zoom:0.08 | line-height:1px