web前端的兼容性问题总结
1、Html对象获取问题
统一使用:document.getElementById("idName");
2、const问题
统一使用var关键字来定义
3、event.x与event.y问题
ie下没有page.x,page.y属性,有x,y属性
firifox下,有page.x,page.y属性,但是没有x,y属性
4、window.location.href问题
用window.location来代替window.location.href.
5、frame问题
(1)、访问iframe对象
统一使用:window.document.getElementById("testFrame")
(2)、切换iframe内容
ie和ff:window.document.getElementById("testFrame").src = "xxx.html"或者
window.frameName.location = "xxx.html" 来切换frame的内容
如果需要将iframe中的参数传回父窗口,可以在frame中使用patent来访问父窗口
parent.document.form1.filename.value = 'Aqing';
6、模态和非模态窗口问题
直接使用window.open(pageURL,name,parameters)打开新窗口
可以在子窗口中使用window.opener来访问父窗口
7、ff和ie的父元素的区别
统一使用obj.parentNode
8、document.form.Name.item('itemName')的问题
统一使用:document.formName.elements['elementName'].
9、集合类对象问题
统一使用【】获取集合类对象
10、自定义属性
统一:getAttribute()获取自定义属性
11、event.srcElement问题
使用:srcObj = event.srcElement?event.srcElement:event.target;
12、事件委托方法
document.body.onload = new Function('inject()');或者document.body.onload = function(){/这里是代码/}
13、table操作的问题
ie中不允许对table和tr的innerHTML赋值,使用js增加一个tr时,使用appendChild方法也不管用。
var row = otable.insertRow(-1);
var cell = document.createElement("td");
cell.innerHTML = ""
cell.className = "xxx";
row.appendChild(cell);
一般用框架操作表格
CSS
1、innerText在IE中能正常工作,但是在Ff中却不行。
解决办法:
if(navigator.appName.indexOf("Exploror") > -1){
document.getElementById("element").innerText = 'my text';
}else{
document.getElementById('element').textContent = "my text";
}
4、css中的width和padding
ie7和ff中的width不包括padding,在ie6中包括padding.
5、ff和ie BOX模型解释不一致导致相差2px
box.style{width:100;border 1px}
ie:box.width = 100
ff: box.width = 100 + 1*2 = 102 (加边框)
解决办法:div{margin:30px!important;margin:28px}
6、IE5和IE6的box解释不一样
div{width:300px !important;width:/**/:340px;margin:0 10px 0 10px}
7、消除ull和ol的缩进问题
样式:list-style:none;margin:0px;padding:0px;
8、水平居中:
ff:margin:0 auto;
ie:父级:{text-align:center}
9、div的垂直居中问题
vertical-align:middle; line-height:200px;缺点:要控制内容不能换行
10、margin加倍问题
设置float的div在ie下设置的margin会加倍。解决在div里面加display:inline;
11、IE与宽度和高度的问题
IE不认识min-这个定义
#box{width:80px;height:35px;} html>body #box{width:auto;height:auto;min-width:80px;min-height:35px;}
12、页面的最小宽度
#container{min-width:600px;width:expression(document.body.clienWidth < 600?"600px":"auto")}
第一个min-width正常,第二行的width使用了js,这只是IE才认得,这也会让你的HTML文旦不太正规
13、div 浮动ie文本产生3像素的bug
左边对象浮动,右边采用不定的左边距来定位,右边对象内的文本会离左边有3px的间距
#box{float:left;width:800px}
#left{float:left;width:50%}
#right{width:50%}
#left{margin-left:-3px}
14、ie的捉迷藏问题
div复杂的时候,div容易发生捉迷藏问题
解决办法:使用line-height属性或者给固定宽高
15、float的div闭合;清除浮动,自适应高度
(1)、<div id="floatA"> <div id="floatB"> <div id="NOTfloatC">
这里的c希望往下排,需要在floatB和NOTfloatC中间添加<div class="clear">
.cleat{clear:both;}
(2)作为外部的wrapper 的div 不要定死高度,为了让高度自适应,要给wrapper里面加上overflow:hidden;当包含float 的box的时候,高度自适应在IE下无效,这时候应该出发IE的layout私有属性用zoom:1,可以达到兼容
.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 centerright的向下拉长,而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 ClearFloats 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; //将对象作为块元素级的表格显示}
16. 高度不适应
高度不适应是当内层对象的高度发生变化时外层高度不能自动进行调节,特别是当内层对象使用margin 或padding时。
例:
#box { }
#box p {margin-top: 20px;margin-bottom: 20px; text-align:center; }
<div id="box">
<p>p对象中的内容</p>
</div>
解决技巧:在P对象上下各加2个空的div对象CSS代码{height:0px;overflow:hidden;}或者为DIV加上border属性。
17. IE6下图片下有空隙产生
解决这个BUG的技巧有很多,可以是改变html的排版,或者设置img为display:block或者设置vertical-align属性为vertical-align:top/bottom/middle/text-bottom都可以解决.
18. 对齐文本与文本输入框
加上vertical-align:middle;
<style type="text/css">
<!--
input {
width:200px;
height:30px;
border:1px solid red;
vertical-align:middle;
}
-->
</style>
经验证,在IE下任一版本都不适用,而ff、opera、safari、chrome均OK!
19. LI中内容超过长度后以省略号显示
此技巧适用与IE、Opera、safari、chrom浏览器,FF暂不支持。
<style type="text/css">
<!--
li {
width:200px;
white-space:nowrap;
text-overflow:ellipsis;
-o-text-overflow:ellipsis;
overflow: hidden;
}
-->
</style>
20. 为什么web标准中IE无法设置滚动条颜色了
解决办法是将body换成html
<!DOCTYPEhtml 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>
21. 为什么无法定义1px左右高度的容器
IE6下这个问题是因为默认的行高造成的,解决的技巧也有很多:
例如:overflow:hidden zoom:0.08 line-height:1px
16.怎么样才能让层显示在FLASH之上呢
解决的办法是给FLASH设置透明
<paramname="wmode" value="transparent" />
22. 链接(a标签)的边框与背景
a链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照menubar, 给 a 和menubar设置高度是为了避免底边显示错位, 若不设 height, 可以在menubar中插入一个空格。
23. 超链接访问过后hover样式就不出现的问题
被点击访问过的超链接样式不在具有hover和active了,很多人应该都遇到过这个问题,解决技巧是改变CSS属性的排列顺序: L-V-H-A
Code:
<style type="text/css">
<!--
a:link {}
a:visited {}
a:hover {}
a:active {}
-->
</style>
24. FORM标签
这个标签在IE中,将会自动margin一些边距,而在FF中margin则是0,因此,如果想显示一致,所以最好在css中指定margin和 padding,针对上面两个问题,我的css中一般首先都使用这样的样式ul,form{margin:0;padding:0;}。
25. 属性选择器(这个不能算是兼容,是隐藏css的一个bug)
p[id]{}div[id]{}
这个对于IE6.0和IE6.0以下的版本都隐藏,FF和OPera作用.属性选择器和子选择器还是有区别的,子选择器的范围从形式来说缩小了,属性选择器的范围比较大,如p[id]中,所有p标签中有id的都是同样式的.
26. 为什么FF下文本无法撑开容器的高度
标准浏览器中固定高度值的容器是不会象IE6里那样被撑开的,那我又想固定高度,又想能被撑开需要怎样设置呢?办法就是去掉height设置min-height:200px; 这里为了照顾不认识min-height的IE6 可以这样定义:
{
height:auto!important;
height:200px;
min-height:200px;
}
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.最被痛恨的,double-margin bug。ie6下给浮动容器定义margin-left 或者margin-right 实际效果是数值的2倍。解决方案,给浮动容器定义display:inline。
5.mirror margin bug,当外层元素内有float元素时,外层元素如定义margin-top:14px,将自动生成margin-bottom:14px。 padding也会出现类似问题,都是ie6下的特产,该类bug 出现的情况较为复杂,远不只这一种出现条件,还没系统整理。解决方案:外层元素设定border 或 设定float。
6. 吞吃现象。还是ie6,上下两个div,上面的div设置背景,却发现下面没有设置背景的div 也有了背景,这就是吞吃现象。对应上面的背景吞吃现象,还有滚动下边框缺失的现象。解决方案:使用zoom:1。这个zoom好象是专门为解决ie6 bug而生的。
8.img 下的留白,大家看这段代码有啥问题:
<div>
<img src=”” mce_src=”” />
</div>
把div的border打开,你发现图片底部不是紧贴着容器底部的,是img后面的空白字符造成,要消除必须这样写
<div>
<img src=”” mce_src=”” /></div>
后面两个标签要紧挨着。ie7下这个bug 依然存在。解决方案:给img设定 display:block。
9. 失去line-height。<div style=”line-height:20px”><img />文字</div>,很遗憾,在ie6下单行文字 line-height 效果消失了。。。,原因是<img />这个inline-block元素和inline元素写在一起了。解决方案:让img 和文字都 float起来。
10.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>
11.ie 下overflow:hidden对其下的绝对层position:absolute或者相对层 position:relative无效。解决方案:给overflow:hidden加position:relative或者position: absolute。另,ie6支持overflow-x或者overflow-y的特性,ie7、ff不支持。
12.ie6下严重的bug,float元素如没定义宽度,内部如有div定义了height或zoom:1,这个div就会占满一整行,即使你给了宽度。float元素如果作为布局用或复杂的容器,都要给个宽度的。
13.ie6下的bug,绝对定位的div下包含相对定位的div,如果给内层相对定位的div高度height具体值,内层相对层将具有100%的width值,外层绝对层将被撑大。解决方案给内层相对层float属性。
14.width:100%这个东西在ie里用很方便,会向上逐层搜索width值,忽视浮动层的影响,ff下搜索至浮动层结束,如此,只能给中间的所有浮动层加width:100%才行,累啊。opera这点倒学乖了跟了ie。
15,有时候加上div{overflow:hidden}这个样式那三个浏览器就会相同了