浏览器兼容问题是指,不同厂商开发的浏览器针对同一段代码的不同解析,造成页面展示效果出现差异的情况,很多时候为了追求显示效果的一直,前端开发人员就要针对不同兼容问题应用相应的方法处理,达到效果一致的目的。
下面这些是平时开发过程中遇到的,做个汇总,方便查阅。
1、<!DOCTYPE HTML>文档类型的声明
产生条件:IE6浏览器,当我们没有书写这个文档声明的时候,会触发IE6浏览器的怪异解析现象;
解决办法:书写文档声明。
2、横向双外边距
产生条件:在IE6中块元素浮动后(左浮左margin,右浮右margin),会出现横向双倍margin现象。
解决办法:在float标签的样式控制中加入display:inline,或者左幅右margin,右浮左margin。
3、默认行高
产生条件:IE6IE7遨游浏览器;设置的文字高度超出盒模型内容区域设置的高度时会影响布局。
解决办法:给超出高度的标签设置overflow:hidden;或将文字的行高line-height设置为小于块的高度
4、不同浏览器当中,很多的标签的默认样式不同,如默认的外补丁内补丁。
产生条件:不同浏览器
解决方法:利用CSS reset文件进行样式的清除,然后在根据需要进行设置。
5、img外部的border
产生条件:img外部有a标签,即img标签有链接时
解决办法:设置img边框border:0;
6、经典3像素bug
产生条件:IE6浏览器,浮动块元素与未浮动块元素处于同一行,有默认的3px间距。
解决办法:设置非浮动元素浮动。
7、png格式图片
产生条件:IE6浏览器,不支持透明;
解决办法:使用JavaScript进行处理;或者使用GIF、JPG图像替代掉png图片的使用。
8、默认行高
产生条件:清浮动的时候,有些人会采取一种清浮动的方法,使用一个空的div,然后为这个div设置{clear:both}。在大部分浏览器当中,这样做是没有任何问题的,但是在IE6浏览器当中,div即使是空的,也会存在默认行高。
解决方法:设置其高度为0,并设置overflow:hidden。{height:0;overflow:hidden;clear:both;}
9、图片默认有间距
产生条件:img标签(每个标签后敲了回车)
解决方法:为img设置float的浮动布局方式。
10、a标签hover不适用于所有标签
产生条件:IE6浏览器中hover只支持a标签的使用,不支持一切其它标签使用;
解决办法:合理用a标签嵌套其它行内标签或者用JavaScript模拟a的hover效果;
11、table标签当中border-color属性设置无效
产生条件:IE6中table设置属性border-color无效;
解决办法:运用CSS样式进行控制,而不是使用属性进行样式的处理。
12、透明rgba与opacity
产生条件:IE6不支持此两种特命的设置方法;
解决办法:使用IE6当中的滤镜filter替代掉,如:opacity:0.6;filter:alpha(opacity=60)
13、子选择器在IE6中不能使用
产生条件:IE6浏览器,使用E>F子选择器;
解决办法:采用其他选择器或者采用后代选择器进行控制,如div p{margin:10px;} div p p {margin:0;}替代掉div>p {margin:10px;}
14、不支持最大最小宽度
产生条件:IE6浏览器,标签的最小高度、宽度设置(min/max-height)
解决办法:为IE6单独设置hack,即_height:最小高度值;_width:最小宽度值(对于IE6,当实际宽高超出定义的宽高时,元素会自动调整宽高)。对于最大高度和最大宽度,没有必要设置兼容,当前对于开发者来说,只需要保证IE6下正常显示即可。无需在它身上花费太多功夫
.target{ min-height:100px; height:auto!important; height:100px; // IE6下内容高度超过会自动扩展高度 }
15、纵向居中,IE6不支持display:table-cell
产生条件:IE6浏览器,设置一个元素在另一个元素中垂直方向上居中对齐,不能够支持以单元格的方式来显示元素;
解决办法:如果是单行文本,采用line-height和height的配合使得文本垂直居中,如果中间是其他元素或者多行文本,采用其他方法进行居中处理。
16、input聚焦框颜色与样式不同
产生条件:各个浏览器表现不同;
处理方法:使用outline:none,清除默认样式之后再统一设置
17、鼠标移上小手效果
产生条件:IE6,cursor:hand :IE完全支持。但是在Firefox是不支持的,没有效果。cursor:pointer:是CSS2.0的标注。所以Firefox是支持的,但是IE5.0即之前版本不支持。
IE6开始支持。
解决办法:设置两种cursor:pointer;cursor:hand.
18、子标签无法撑开父标签的高度
产生条件:父标签内部含一个或多个子标签,父标签没有设置浮动,而子标签发生浮动:
处理方法:方法1:在子标签最后添加清除浮动的设置<div style="height:0;clear:both"></div>;方法2:为父标签添加{overflow:hidden}的样式;方法3:为父标签设置固定高度
19、li的间距问题
产生条件:IE6浏览器li标签设置宽高,且li里面的元素发生了浮动;
处理方法:方法1:li不设置宽高;方法2:li内部的标签不进行浮动。
ol
内li
的序号全为1,不递增。解决方法:为li设置样式
display: list-item;
20、行内元素布局混了
产生条件:行内元素为包含框时,如果包含框包含的绝对定位元素以百分比单位进行定位;
处理方法:在行内元素当中加入{zoom:1},出发IE的haslayout。
21、多显示一个字
产生条件:多个浮动元素中间夹杂HTML注释语句,浮动元素宽度设置为100%;则在下一行多显示一个上一行的最后一个字符;
处理方法:果断删掉注释!
22、CSS优先级 !important
产生条件:IE6当中,在同一组CSS属性中,!important不起作用;
处理方法:单独设置
23、img图片下部高度多余5px
产生条件:IE6浏览器;
处理方法:将图片转化为块级对象,即display:block。还有四种其他方法,详细解释参见日志:IE6BUG图片元素img下高度超出,出现多余空白。
- 将图片转换为块级对象
即,设置img为“display:block;”。
- 设置图片的垂直对齐方式
即设置图片的vertical-align属性为“top,text-top,bottom,text-bottom”也可以解决。
- 设置父对象的文字大小为0px
即,在代码中添加一行:“font-size:0;”可以解决问题。但这也引发了新的问题,在父对象中的文字都无法显示。就算文字部分被子对象括起来,设置子对象文字大小依然可以显示,但在CSS效验的时候会提示文字过小的错误。
- 改变父对象的属性
如果父对象的宽、高固定,图片大小随父对象而定,那么可以设置“overflow:hidden;”来解决。
- 设置图片的浮动属性
即在本例中增加一行CSS代码: img {float:left;}”。如果要实现图文混排,这种方法是很好的选择。
24、hack技术:
hack主要针对IE浏览器,如果想对某一款或某几款浏览器的样式进行调整,我们可以使用hack技术
_IE6
*IE6 IE7
+IE6 IE7
9 IE6 IE7 IE8 IE9 IE10