css兼容
1.width:在html文档没有DTD声明时,IE6会按照怪异解析的模式去解析我们设置标签的宽,高则不变。(例如:正常声明下的盒模型解析是width+margin+padding+border的值,但是怪异解析下就是将这些所有的设置全计算到我们设置
的宽内。{div width:400px;border:100px;padding:0 50px;在加了DTD声明或未加声明正常浏览器下的解析宽度是600px;,但是在没有DTD声明的IE6下却还是400px;因为这些除了宽之外的设置都算在了我们设置的宽之内。这就
是IE6未加DTD声明的怪异解析})
2、height:a、最小高度问题,设置较小的高度标签(一般小于10px),在IE6,IE7,遨游中高度超出自己设置高度解决方案;给超出高度的标签设置overflow:hidden;或者设置行高line-height小于你设置的高度。备注:这种情况
一般出现在我们设置小圆角背景的标签里。出现这个问题是IE8之前的浏览器都会给标签一个最小默认的行高的高度。即使你的标签是空的,这个标签的高度还是会达到默认的行高。
b、IE6内容撑开高度。
3、border:a、a标签嵌套下的img标签,IE和FF会带有边框。解决-- a img{border:none;}这条命令我们一般都写在初始化里,一是因为样式上一般不需要这样的效果,再者a标签中的字体颜色尚且解析不同,边框的颜色也一样不同。
b、去掉input边框问题,正常浏览器border:none;便可解决,但是IE6的默认CSS样式,涉及到border的有border-style:inset;border-width:2px;必须对border的width和style进行全部设置方可消除IE6下
的border。因为浏览器是先解析自身的默认CSS,在解析开发者书写的CSS,所以当有border-width或border-color设置的时候才会令IE6去解析border-style:none;目前所遇情况都能解释。因此想要去除
input的border就只有使用border:0 none;虽然但看命令有些说法说不过去,但是这也是浏览器解析存在问题时较好的解决办法。
4、margin:a、默认内外补丁,各个浏览器对标签默认的内外补丁都是不同的,若想在正常情况下设置我们想要的样式,就必须把那些存在内外补丁差异的标签初始化。通常在公共样式上加 margin:0;
b、横向双倍margin:快属性标签float后,又对其设置横行margin情况下,在IE6显示margin比设置的大,通常是标准浏览器的二倍,常见症状是IE6中后面的一块被顶到下一行,解决--将其 display:inline。
那么行内属性标签设置display:block;后采用float布局,也有横向margin的情况,IE6间距bug,解决--在display:block;后面加display:inline;display:table;因为:行内属性标签,为了设置宽高,我
们需要设置display:block;(除input、img、textares标签比较特殊)。再用float布局并有横向的margin后,在IE6下,他就具备了块状属性float后的横向margin的bug。但因为它本身就是行内属性标签,所
以我们再加上display:inline的话,它的高度就不可设了。这时候我们还需要display:inline后面加入display:table。方可解决。
c、父子标签之间控制间距最好用padding,因为我们经常会遇上这样的情况,子标签margin时父标签也跟着margin了,因此父子关系最好用padding,兼容性好,兄弟之间用margin。
5、background:a、在我们用a标签的伪类在tab切换效果时,发现凡事对背景(或颜色或背景图)的标签使用了position定位控制其位置后,切换时在IE6和遨游下就会有遗留背景,其他浏览器正常。
b、在background-position的x或y轴上使用百分比控制时,IE6的计算方式也不同。(banner部分每小格的下方都有一个小箭头,为了拓展性效果好,我们尝试过使用背景图的百分比控制他在无论多
宽的小格子下方都能居中,但是标准浏览器都是以当前格子的为基准的,IE6却是以当前至最后一个这一长短距离为基准的。)
6、font-size: UE内核不支持单数。
7、line-height: IE6中行高也能撑开高度,解决-- overflow:hidden,并且IE6中标签的默认行高也能通过此方法解决。
8、float:a、IE6浮动后横向margin换行的问题
b、假设两块div,第一块浮动而第二块没有浮动,IE6下第二块就会跑到第一块边上,并且二者之间还留有间距,但标准浏览器中是第二块重合于第一块。 解决-- 将第二块clear:both(清除浮动)
c、父子关系的标签,子标签浮动导致父标签不再包裹子标签,对父标签设置clear或overflow:hidden。
9、position:a、使用psoition定位做重叠但超出其父标签范围的效果时,做完后一定要清除浮动,否侧要么不显示,要么下面内容会乱,总之清除浮动很重要。
b、absolute,父子关系的标签,父标签使用overflow:hidden;后正常浏览器子标签都不显示了,IE6下还是显示的状态。
10、overflow:父子关系的标签,子标签浮动导致父标签不再包裹子标签,标准浏览器中使用overflow:hidden;便可解决,但IE6下却必须要父标签也浮动方可解决。
1、input:a、border方面在上述中已经说到。
b、line-height的问题也就是行高撑开高度
c、随便写几个input标签看,其宽高、行高及间距在不同浏览器下都是不同的。css对其进行样式控制。
2、li:li标签中包裹的内容如有浮动现象那么li标签的行与行之间就会产生上下间距,解决办法,将其浮动,但在没有固定宽限制就不免还会存在下一行挤到上一行句尾的问题,这时可以将其宽设为
100%,并overflow:hidden;
3、select:a、在标准浏览器中可以设置背景色,IE6下不可以。
由于HTML排版中将多个img标签换行书写,导致其产生间距。解决--- float。
1. 居中问题
div里的内容,IE默认为居中,而FF默认为左对齐,可以尝试增加代码margin:auto
Div居中问题 div设置 margin-left, margin-right 为 auto 时已经居中,IE 不行,IE需要设定body居中,首先在父级元素定义text-algin: center;这个的意思就是在父级元素内的内容居中。
div的垂直居中问题 vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行
2. 高度问题
两上下排列或嵌套的div,上面的div设置高度(height),如果div里的实际内容大于所设高度,在FF中会出现两个div重叠的现象;但在IE中,下面的div会自动给上面的div让出空间所以为避免出现层的重叠,高度一定要控制恰当,或者
干脆不写高度,让他自动调节,比较好的方法是 height:100%;但当这个div里面一级的元素都float了的时候,则需要在div块的最后,闭和前加一个沉底的空div,对应CSS是:.float_bottom {clear:both;height:0px;font-
size:0px;padding:0;margin:0;border:0;line-height:0px;overflow:hidden;}
IE与宽度和高度的问题 IE 不认得min-这个定义,但实际上它把正常的width和height当作有min的情况来使。这样问题就大了,如果只用宽度和高度,正常的浏览器里这两个值就不会变,如果只用min-width和min-height的话,IE下
面根本等于没有设置宽度和高度。 比如要设置背景图片,这个宽度是比较重要的。要解决这个问题,可以这样: #box{ 80px; height: 35px;}html>body #box{ auto; height: auto; min- 80px;
min-height: 35px;}
页面的最小宽度 min -width是个非常方便的CSS命令,它可以指定元素最小也不能小于某个宽度,这样就能保证排版一直正确。但IE不认得这个,而它实际上把width当做最小宽度来使。为了让这一命令在IE上也能用,可以把
一个<div> 放到 <body> 标签下,然后为div指定一个类, 然后CSS这样设计: #container{ min- 600px; expression(document.body.clientWidth < 600? "600px": "auto" );} 第一个min-width是正常的;
但第2行的width使用了Javascript,这只有IE才认得,这也会让你的HTML文档不太正规。它实际上通过Javascript的判断来实现最小宽度。
2. 浮动问题
DIV浮动IE文本产生3象素的bug 左边对象浮动,右边采用外补丁的左边距来定位,右边对象内的文本会离左边有3px的间距. #box{ float:left; 800px;} #left{ float:left; 50%;} #right{
50%;} *html #left{ margin-right:-3px; //这句是关键} <div id="box"> <div id="left"></div> <div id="right"></div> </div>
float的div闭合;清除浮动;自适应高度;
① 例如:<#div id=”floatA” ><#div id=”floatB” ><#div id=” NOTfloatC” >这里的NOTfloatC并不希望继续平移,而是希望往下排。(其中floatA、floatB的属性已经设置为 float:left;) 这段代码在IE中毫无问题,问题
出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。在 <#div class=”floatB”> <#div class=”NOTfloatC”>之间加上 < #div class=”clear”>这个div一定要注意位置,而且必须与两个具有float属性的div同级,
之间不能存在嵌套关系,否则会产生异常。 并且将clear这种样式定义为为如下即可: .clear{ clear:both;}
②作为外部 wrapper 的 div 不要定死高度,为了让高度能自动适应,要在wrapper里面加上overflow:hidden; 当包含float的 box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以
做到,这样就达到了兼容。 例如某一个wrapper如下定义: .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 center right的向下拉长,而 page居然保存高度不变,问题来了,原因在于page不是
float属性,而我们的page由于要居中,不能设置成float,所以我们应该这样解决 <div id=”page”> <div id=”bg” style=”float:left;100%”> <div id=”left”></div> <div
id=”center”></div> <div id=”right”></div> </div> </div> 再嵌入一个float left而宽度是100%的DIV解决之
④万能float 闭合(非常重要!) 关于 clear float 的原理可参见 [How To Clear Floats 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; //将对象作为块元素级的表格显示}
padding,marign,height,width 的傻瓜式解决技巧 注意是技巧,不是方法:
写好标准头
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
高尽量用padding,慎用margin,height尽量补上100%,父级height有定值子级height不用100%,子级全为浮动时底部补个空clear:both的div
宽尽量用margin,慎用padding,width算准实际要的减去padding
列表类
1. ul 标签在FF中默认是有 padding 值的,而在IE中只有margin有值
先定义 ul {margin:0;padding:0;}
2. ul和ol列表缩进问题
消除ul、ol等列表的缩进时,样式应写成: {list-style:none;margin:0px;padding:0px;}
显示类
1. display:block,inline 两个元素
display:block; //可以为内嵌元素模拟为块元素
display:inline; //实现同一行排列的的效果
display:table; //for FF,模拟table的效果
display:block 块元素,元素的特点是:
总是在新行上开始;
高度,行高以及顶和底边距都可控制;
宽度缺省是它的容器的100%,除非设定一个宽度
<div>,<p>,<h1>,<form>,<ul> 和 <li> 是块元素的例子
display:inline 就是将元素显示为行内元素,元素的特点是:
和其他元素都在一行上;
高,行高及顶和底边距不可改变;
宽度就是它的文字或图片的宽度,不可改变。
<span>,<a>,<label>,<input>,<img>,<strong> 和 <em> 是 inline 元素的例子
2. 鼠标手指状显示
全部用标准的写法 cursor: pointer;
背景、图片类
1. background 显示问题
全部注意补齐 width,height 属性
2. 背景透明问题
IE: filter: progid: DXImageTransform.Microsoft.Alpha(style=0,opacity=60);
IE: filter: alpha(opacity=10);
FF: opacity:0.6;
FF: -moz-opacity:0.10;
IE捉迷藏的问题
当div应用复杂的时候每个栏中又有一些链接,DIV等这个时候容易发生捉迷藏的问题。有些内容显示不出来,当鼠标选择这个区域是发现内容确实在页面。 解决办法:对#layout使用line-height属性 或者给#layout使用固定高和宽。
页面结构尽量简单。
高度不适应
高度不适应是当内层对象的高度发生变化时外层高度不能自动进行调节,特别是当内层对象使用margin 或paddign 时。 例: #box {background-color:#eee; } #box p {margin-top: 20px;margin-bottom:
20px; text-align:center; } <div id="box"> <p>p对象中的内容</p> </div> 解决方法:在P对象上下各加2个空的div对象CSS代码:.1{height:0px;overflow:hidden;}或者为DIV加上border属性。
IE6下为什么图片下有空隙产生
解决这个BUG的方法也有很多,可以是改变html的排版,或者设置img 为display:block 或者设置vertical-align 属性为 vertical-align:top | bottom |middle |text-bottom 都可以解决.
如何对齐文本与文本输入框
加上 vertical-align:middle; <style type="text/css"> <!-- input { 200px; height:30px; border:1px solid red; vertical-align:middle; } --> </style>
LI中内容超过长度后以省略号显示的方法
<style type="text/css"> <!-- li { 200px; white-space:nowrap; text-overflow:ellipsis; { -o-text-overflow:ellipsis;9与IE与OP浏览器0 } overflow:
hidden; } --> </style>
为什么web标准中IE无法设置滚动条颜色了
解决办法是将body换成html <!DOCTYPE html 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>
怎么样才能让层显示在FLASH之上呢 解决的办法是给FLASH设置透明 <param name="wmode" value="transparent" />
怎样使一个层垂直居中于浏览器中 这里我们使用百分比绝对定位,与外补丁负值的方法,负值的大小为其自身宽度高度除以二 <style type="text/css"> <!-- div { position:absolute; top:50%;
lef:50%; margin:-100px 0 0 -100px; 200px; height:200px; border:1px solid red; } --> </style>
链接(a标签)的边框与背景 a 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入
一个空格。
超链接访问过后hover样式就不出现的问题 被点击访问过的超链接样式不在具有hover和active了,很多人应该都遇到过这个问题,解决方法是改变CSS属性的排列顺序: L-V-H-A Code: <style type="text/css"> <!-- a:link {}
a:visited {} a:hover {} a:active {} --> </style>
FORM标签 这个标签在IE中,将会自动margin一些边距,而在FF中margin则是0,因此,如果想显示一致,所以最好在css中指定margin和 padding,针对上面两个问题,我的css中一般首先都使用这样的样式
ul,form{margin:0;padding:0;}给定义死了,所以后面就不会为这个头疼了.
BOX模型解释不一致问题 在FF和IE 中的BOX模型解释不一致导致相差2px解决方法:div{margin:30px!important;margin:28px;} 注意这两个 margin的顺序一定不能写反, important这个属性IE不能识别,但别的浏览器可以识别
。所以在IE下其实解释成这样: div {maring:30px;margin:28px}重复定义的话按照最后一个来执行,所以不可以只写margin:xx px!important; #box{ 600px; //for ie6.0- w\idth:500px; //for ff+ie6.0}
#box{ 600px!important //for ff 600px; //for ff+ie6.0 width /**/:500px; //for ie6.0-}
BOX模型解释不一致问题 在FF和IE 中的BOX模型解释不一致导致相差2px解决方法:div{margin:30px!important;margin:28px;} 注意这两个 margin的顺序一定不能写反, important这个属性IE不能识别,但别的浏览器可以识别
。所以在IE下其实解释成这样: div {maring:30px;margin:28px}重复定义的话按照最后一个来执行,所以不可以只写margin:xx px!important; #box{ 600px; //for ie6.0- w\idth:500px; //for ff+ie6.0}
#box{ 600px!important //for ff 600px; //for ff+ie6.0 width /**/:500px; //for ie6.0-}
为什么FF下文本无法撑开容器的高度 标准浏览器中固定高度值的容器是不会象IE6里那样被撑开的,那我又想固定高度,又想能被撑开需要怎样设置呢?办法就是去掉height设置min-height:200px; 这里为了照顾不认识min-
height的IE6 可以这样定义: { height:auto!important; height:200px; min-height:200px; }
FireFox下如何使连续长字段自动换行 众所周知IE中直接使用 word-wrap:break-word 就可以了, FF中我们使用JS插入 的方法来解决 <style type="text/css"> <!-- div { 300px; word-
wrap:break-word; border:1px solid red; } --> </style> <div id="ff">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div> <scrīpt type="text/javascrīpt"> /* <![CDATA[ */ function toBreakWord(el, intLen){ var ōbj=document.getElementById(el);
var strContent=obj.innerHTML; var strTemp=""; while(strContent.length>intLen){ strTemp+=strContent.substr(0,intLen)+" ";
strContent=strContent.substr(intLen,strContent.length); } strTemp+=" "+strContent; obj.innerHTML=strTemp; } if(document.getElementById &&
!document.all) toBreakWord("ff", 37); /* ]]> */ </scrīpt>
IE6、IE7的hasLayout问题:很多时候,CSS在IE下的解析十分奇怪,明明在Firefox中显示得非常正确,但到了IE下却出现了问题,有的时候,这些问题甚至表现得非常诡异。
例如一个比较经典的Bug就是设置border的时候,有时候border会断开,刷新页面或者拖下滚动条的时候,断掉的部分又会连接起来。
再比如在IE6&IE7中对元素设置浮动后,其后的元素并未占据这部分空间,造成了IE6&IE7中浮动元素未脱离文档流的假象。也就是说,实际上IE6&IE7浮动元素也脱离了文档流,只是由于其后元素的hasLayout被自动触发而导致的。这里说
的hasLayout被触发,即指元素的hasLayout属性为true。
下列元素默认hasLayout="true":
<html>, <body>
- <table>, <tr>, <th>, <td>
- <img>
- <hr>
- <input>, <button>, <select>, <textarea>, <fieldset>, <legend>
- <iframe>, <embed>, <object>, <applet>
- <marquee>
下列 CSS 属性和取值将会自动让一个元素的hasLayout="true":
- position: absolute
- 绝对定位元素的包含区块(containing block)就会经常在这一方面出问题。
- float: left|right
- 由于 layout 元素的特性,浮动模型会有很多怪异的表现。
- display: inline-block
- 当一个内联级别的元素需要 layout 的时候往往就要用到它,这也可能也是这个 CSS 属性的唯一效果–让某个元素拥有 layout。"inline-block行为"在IE中是可以实现的,但是需要注意的是: IE/Win: inline-block and hasLayout 。
- 除 “auto" 外的任意值
- 很多人遇到 layout 相关问题发生时,一般都会先尝试用这个来修复。
- height: 除 “auto" 外的任意值
- height: 1% 就在 Holly Hack 中用到。
- zoom: 除 “normal" 外的任意值
- IE专有属性。不过 zoom: 1 可以临时用做调试。
- writing-mode: tb-rl
- MS专有属性。
- overflow: hidden|scroll|auto
- 在 IE7 中,overflow 也变成了一个 layout 触发器,这个属性在之前版本 IE 中没有触发 layout 的功能。
- overflow-x|-y: hidden|scroll|auto
- overflow-x 和 overflow-y 是 CSS3 盒模型中的属性,尚未得到浏览器的广泛支持。他们在之前版本IE中没有触发 layout 的功能。
- 另外 IE7 的荧幕上又新添了几个 haslayout 的演员,如果只从 hasLayout 这个方面考虑,min/max 和 width/height 的表现类似,position 的 fixed 和 absolute 也是一模一样。
- position: fixed
- min- 任意值
- 就算设为0也可以让该元素获得 layout。
- max- 除 “none" 之外的任意值
- min-height: 任意值。即使设为0也可以让该元素的 haslayout=true
- max-height: 除 “none" 之外的任意值
如果BUG是由于hasLayout未触发所引起的,则可采用手动触发hasLayout来解决:办法是使用一个生僻的CSS属性zoom来触发,引用样式.zoom{zoom:1}。
如果BUG是hasLayout被自动触发而引起的,则要看触发是什么引起的,若这元素本身就会自动触发hasLayout,可以考虑换一个元素。若是对于这元素设置的某个CSS属性引起的,则可以考虑删除这属性,倘若这属性又是必要的,则就需要自己根据
具体情况去编写CSS Hack,因为hasLayout是只读的,一旦hasLayout="true"后,便不可逆转。
IE6下select元素显示问题:浏览器解析页面时,会先判断元素的类型,如果是窗口类型的,会优先于非窗口类型的元素,显示在页面最顶端,如果同属于非窗口类型的,才会去判断z-index的大小。select元素在IE6下是以窗口形式显示的,这是
IE6的一个Bug。导致的情况是往往想要弹出一个层,结果select元素出现在层上方。 解决--给div position:absolute;后面+ z-index:88;
IE6断头台问题:断头台问题是国外的CSS设计者给这个问题起的一个非常形象的名字,与之相反的,被切断的不是对象的头部,而是对象的底部 对链接加上个div,并设置浮动#right{float:left}。这样使得两个对象都成为浮动对象,不会引发问题。
也可以在#layout底部增加一个div来强制IE浏览器重新计算高度<div style="clear:both;"></div>,这个清除浮动内容的div会帮助浏览器重新找到合适的高度,从而解决断头台问题。
容器不扩展问题:容器不扩展问题是我们经常遇到的。比如我们创建了一个div嵌套结构 可见外层的高度并没有随着子容器的高度自动扩展,却是形成了一条线。这是因为当子容器成为浮动元素后,并脱离了文档流。因此父容器认为自己内容为空,
从而造成了这样的结果。 解决--清除浮动 如果还想防止这个元素占据父元素的高度,可以进一步优化成<div style="clear:both;display:block;font:0px/0px sans-serif;"> </div>,这样这个清除浮动的容器被认为是个不占任何高度的空格字
符。在网页中的任何地方,当遇到容器不扩展时,只需加入此段便能修复问题。
IE8和FireFox父子元素上下margin叠加问题: 蓝色div和黑色div是灰色div的子元素,三个div的margin都是20,但是我们看到蓝色div与其父元素的上边界并没有20px的间隙,黑色div与其父元素的下边界也没有20px的间隙,也就是说蓝色div的上外边
距与其父元素的上外边距叠加在了一起,就好像是蓝色div的上外边距跑出去了一样。黑色div也是同理。这就是父元素与子元素的边距叠加效果,叠加后的取值取的是两者中较大的那个。经测试,只要父元素有border或padding,就不会触发这个问题。然而
刻意给父元素设置border或padding又会带来位移。可采用如下方法来根本解决问题: 解决问题:给父元素设置overflow:hidden;即可解决。
IE6高度不固定问题:
典型BUG1:IE6下,即使给父元素设了固定高度,子元素还是会将其撑开。
典型BUG2:如果一个元素没有子元素,而这个元素设置的length又小于div默认高度,则这个元素在IE6里显示的高度仍然是div的默认高度。
引发以上2个BUG的原因在于length属性在IE6里被当作min-length(最小高度)解析了,(换句话说,你压根在IE6中就没设置过固定高度,因为你设置的是最小高度)
解决办法是再给父元素设置overflow:hidden;
全屏遮罩后居中显示一个对话层: 这里的提示层不要嵌套在遮罩层里面,否则也会受影响,变成半透明的了。要让提示层跟遮罩层并列。
这里还有2个问题:
1.单单对遮罩层使用height:100%,只有IE6会达到效果,而其他浏览器一旦只会是当前可见区域遮上了,如果拖动纵向滚动条,发现下方还有没遮盖上。
2.用户电脑分辨率不同,而绝对定位的提示层使用margin:300px auto也无效。
为了达到各浏览器网页可见区域全部遮盖的效果,这里用了下jquery脚本,解决以上2个问题:
$(document).ready(function(){ $("div[class='cover']").height($(document).height());//将可见区域都遮罩起来 $("div[class='confirm']").css("left",($(document).width()-($("div[class='confirm']").width()))/2+"px");//提示层居中 }); 最佳实践: 1.写DTD声明:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2.引入base.css重置各浏览器默认属性值:
html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0px;padding:0px;} table{border-collapse:collapse;border-spacing:0px;} fieldset,img,abbr,acronym{border:0px;} address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;} ol,ul{list-style:none;} caption,th{text-align:left;} h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;} q:before,q:after{content:'';}
3.同时为一个元素写float和margin-left(margin-right)的时候,习惯性地想到IE6会双倍边距,用display:inline解决。
4.为子元素写margin-top或margin-bottom的时候,习惯性的去思考父元素是否有padding或border属性,从而断定是否会在IE6&IE7上产生上下外边距重合问题。如果有问题用overflow:hidden;解决。
5.给元素设了固定高度后,习惯性地再设个overflow:hidden;从而避免IE6上高度继续扩展的问题。
6.必要时候要clear,<div style="clear:both;"></div>。
7.对于文本,在使用margin-left、padding-left、margin-top、padding-top之前优先考虑是否可用text-indent和line-height代替。因为计算尺寸的代价相对来说要大些。
Javascript兼容性
一、document.formName.item(”itemName”) 问题
问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document.formName.elements ["elementName"];Firefox 下,只能使用document.formName.elements["elementName"]。 解决方法:统一使用document.formName.elements["elementName"]。
二、集合类对象问题
问题说明:IE下,可以使用 () 或 [] 获取集合类对象;Firefox下,只能使用 [ ]获取集合类对象。 解决方法:统一使用 [] 获取集合类对象。
三、自定义属性问题
问题说明:IE下,可以使用获取常规属性的方法来获取自定义属性,也可以使用 getAttribute() 获取自定义属性;Firefox下,只能使用 getAttribute() 获取自定义属性。 解决方法:统一通过 getAttribute() 获取自定义属性。
四、eval(”idName”)问题
问题说明:IE下,可以使用 eval(”idName”) 或 getElementById(”idName”) 来取得 id 为 idName 的HTML对象;Firefox下,只能使用 getElementById(”idName”) 来取得 id 为 idName 的HTML对象。 解决方法:统一用 getElementById(”idName”) 来取得 id 为 idName 的HTML对象。
五、变量名与某HTML对象ID相同的问题
问题说明:IE下,HTML对象的ID可以作为 document 的下属对象变量名直接使用,Firefox下则不能;Firefox下,可以使用与HTML对象ID相同的变量名,IE下则不能。 解决方法:使用 document.getElementById(”idName”) 代替 document.idName。最好不要取HTML对象ID相同的变量名,以减少错误;在声明变量时,一律加上var关键字,以避免歧义。
六、const问题
问题说明:Firefox下,可以使用const关键字或var关键字来定义常量;IE下,只能使用var关键字来定义常量。 解决方法:统一使用var关键字来定义常量。
七、input.type属性问题
问题说明:IE下 input.type 属性为只读;但是Firefox下 input.type 属性为读写。 解决办法:不修改 input.type 属性。如果必须要修改,可以先隐藏原来的input,然后在同样的位置再插入一个新的input元素。
八、window.event问题
问题说明:window.event 只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用。 解决方法:在事件发生的函数上加上event参数,在函数体内(假设形参为evt)使用 var myEvent = evt?evt:(window.event?window.event:null) 示例:
<input type="button" onclick="doSomething(event)"/> <script language="javascript"> function doSomething(evt) { var myEvent = evt?evt:(window.event?window.event:null) ... }
九、event.x与event.y问题
问题说明:IE下,even对象有x、y属性,但是没有pageX、pageY属性;Firefox下,even对象有pageX、pageY属性,但是没有x、y属性。 解决方法:var myX = event.x ? event.x : event.pageX; var myY = event.y ? event.y:event.pageY; 如果考虑第8条问题,就改用myEvent代替event即可。
十、event.srcElement问题
问题说明:IE下,even对象有srcElement属性,但是没有target属性;Firefox下,even对象有target属性,但是没有srcElement属性。 解决方法:使用srcObj = event.srcElement ? event.srcElement : event.target; 如果考虑第8条问题,就改用myEvent代替event即可。
十一、window.location.href问题
问题说明:IE或者Firefox2.0.x下,可以使用window.location或window.location.href;Firefox1.5.x下,只能使用window.location。 解决方法:使用 window.location 来代替 window.location.href。当然也可以考虑使用 location.replace()方法。
十二、模态和非模态窗口问题
问题说明:IE下,可以通过showModalDialog和showModelessDialog打开模态和非模态窗口;Firefox下则不能。 解决方法:直接使用 window.open(pageURL,name,parameters) 方式打开新窗口。 如果需要将子窗口中的参数传递回父窗口,可以在子窗口中使用window.opener来访问父窗口。如果需要父窗口控制子窗口的话,使用 var subWindow = window.open(pageURL,name,parameters); 来获得新开的窗口对象。
十三、frame和iframe问题
以下面的frame为例:
(1)访问frame对象 IE:使用window.frameId或者window.frameName来访问这个frame对象; Firefox:使用window.frameName来访问这个frame对象; 解决方法:统一使用 window.document.getElementById(”frameId”) 来访问这个frame对象; (2)切换frame内容 在IE和Firefox中都可以使用 window.document.getElementById(”frameId”).src = “webjx.com.html”或 window.frameName.location = “webjx.com.html”来切换frame的内容; 如果需要将frame中的参数传回父窗口,可以在frame中使用parent关键字来访问父窗口。
十四、body载入问题
问题说明:Firefox的body对象在body标签没有被浏览器完全读入之前就存在;而IE的body对象则必须在body标签被浏览器完全读入之后才存在。 [注] 这个问题尚未实际验证,待验证后再来修改。 [注] 经验证,IE6、Opera9以及FireFox2中不存在上述问题,单纯的JS脚本可以访问在脚本之前已经载入的所有对象和元素,即使这个元素还没有载入完成。
十五、事件委托方法
问题说明:IE下,使用 document.body.onload = inject; 其中function inject()在这之前已被实现;在Firefox下,使用 document.body.onload = inject(); 解决方法:统一使用 document.body.onload=new Function(’inject()’); 或者 document.body.onload = function(){/* 这里是代码 */} [注意] Function和function的区别
十六、访问的父元素的区别
问题说明:在IE下,使用 obj.parentElement 或 obj.parentNode 访问obj的父结点;在firefox下,使用 obj.parentNode 访问obj的父结点。 解决方法:因为firefox与IE都支持DOM,因此统一使用obj.parentNode 来访问obj的父结点。
十七、innerText的问题.
问题说明:innerText在IE中能正常工作,但是innerText在FireFox中却不行。 解决方法:在非IE浏览器中使用textContent代替innerText。 示例:
if(navigator.appName.indexOf("Explorer") >-1){ document.getElementById('element').innerText = "my text"; } else{ document.getElementById('element').textContent = ";my text"; }
[注] innerHTML 同时被ie、firefox等浏览器支持,其他的,如outerHTML等只被ie支持,最好不用。
十八、Table操作问题
问题说明:ie、firefox以及其他浏览器对于 table 标签的操作都各不相同,在ie中不允许对table和tr的innerHTML赋值,使用js增加一个tr时,使用appendChild方法也不管用。 document.appendChild在往表里插入行时FIREFOX支持,IE不支持 解决办法:把行插入到TBODY中,不要直接插入到表 解决方法:
//向table追加一个空行:
var row = otable.insertRow(-1); var cell = document.createElement("td"); cell.innerHTML = ""; cell.className = "XXXX"; row.appendChild(cell);
[注] 建议使用JS框架集来操作table,如JQuery。
十九、对象宽高赋值问题
问题说明:FireFox中类似 obj.style.height = imgObj.height 的语句无效。 解决方法:统一使用 obj.style.height = imgObj.height + ‘px’;
二十、setAttribute(’style’,'color:red;’) FIREFOX支持(除了IE,现在所有浏览器都支持),IE不支持 解决办法:不用setAttribute(’style’,'color:red’) 而用object.style.cssText = ‘color:red;’(这写法也有例外) 最好的办法是上面种方法都用上,万无一失
二一、类名设置 setAttribute(’class’,’styleClass’) FIREFOX支持,IE不支持(指定属性名为class,IE不会设置元素的class属性,相反只使用setAttribute时IE自动识CLASSNAME属性) 解决办法: setAttribute(’class’,’styleClass’)
setAttribute(’className’,’styleClass’)
或者直接 object.className=’styleClass’;
IE和FF都支持object.className。
二二、用setAttribute设置事件 var bj = document.getElementById(’objId’); obj.setAttribute(’onclick’,'funcitonname();’); FIREFOX支持,IE不支持 解决办法: IE中必须用点记法来引用所需的事件处理程序,并且要用赋予匿名函数 如下: var bj = document.getElementById(’objId’); obj.onclick=function(){fucntionname();}; 这种方法所有浏览器都支持
二三、建立单选钮 IE以外的浏览器 var rdo = document.createElement(’input’); rdo.setAttribute(’type’,'radio’); rdo.setAttribute(’name’,'radiobtn’); rdo.setAttribute(’value’,'checked’);
IE: var rdo =document.createElement(”<input name=”radiobtn” type=”radio” value=”checked” />”); 解决办法: 这一点区别和前面的都不一样。这次完全不同,所以找不到共同的办法来解决,那么只有IF-ELSE了 万幸的是,IE可以识别出document的uniqueID属性,别的浏览器都不可以识别出这一属性。问题解决。