资源列表
编写跨浏览器兼容的 CSS 代码的金科玉律 |
http://www.cnbeta.com/articles/113378.htm |
|
|
1. 在书写html代码时,最好在头部加上文档声明
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2. 关于FF高度自适应的问题,在标签结束之前加入
<div style="clear:both"></div>
既可解决问题。完成代码如下:
<div style="width:500px;padding:0;margin:0;border:1px dotted red;height:100%; overflow:auto;">
<div style="display:inline;width:120px;border:20px solid #000000;float:left;margin:20px;padding:25px;">
块级元素之间的竖直margin,为两个块级元素margin的最大值,
</div>
<div style="width:248px;border:1px solid #000000;float:left;margin:0;height:100%; overflow:auto;">
</div>
<div style="clear:both"></div>
</div>
3. 对于imporant这个属性,对IE5,6无效,但是对IE7以后及其他FF等浏览器有效
.imp{
color:red!important; /*IE 5,6不认识这个属性,但IE7以后和其他标准浏览器有效*/
color:blue;
}
以下代码属于转载
所有浏览器通用(市面上主要用到的IE6IE7FF)
height:100px;
IE6专用
_height:100px;
IE6专用
*height:100px;
IE7专用
*+height:100px;
IE7、FF共用
height:100px!important;
一、CSS兼容
以下两种方法几乎能解决现今所有兼容.
1,!important(不是很推荐,用下面的一种感觉最安全)
随着IE7对!important的支持,!important方法现在只针对IE6的兼容.(注意写法.记得该声明位置需要提前.)
代码:
<style>
#wrapper{
width:100px!important;/*IE7+FF*/
width:80px;/*IE6*/
}
</style>
2,IE6/IE77对FireFox<from针对firefoxie6ie7的css样式>
*+html与*html是IE特有的标签,firefox暂不支持.而*+html又为IE7特有标签.
代码:
<style>
#wrapper{width:120px;}/*FireFox*/
*html#wrapper{width:80px;}/*ie6fixed*/
*+html#wrapper{width:60px;}/*ie7fixed,注意顺序*/
</style>
注意:
*+html对IE7的兼容必须保证HTML顶部有如下声明:
代码:
<!DOCTYPE HTML PUBLIC“-//W3C//DTD HTML4.01 Transitional//EN””http://www.w3.org/TR/html4/loose.dtd“>
二、万能float闭合(非常重要!)可以用这个解决多个div对齐时的间距不对,
关于clearfloat的原理可参见[How To Clear Floats Without Structural Markup]
将以下代码加入Global CSS中,给需要闭合的div加上class=”clearfix”即可,屡试不爽.
代码:
<style>
/*ClearFix*/
.clearfix:after{
content:”.”;
display:block;
height:0;
clear:both;
visibility:hidden;
}
.clearfix{
display:inline-block;
}
/*HidefromIEMac*/
.clearfix{display:block;}
/*EndhidefromIEMac*/
/*endofclearfix*/
</style>
三、其他兼容技巧(相当有用)
1,FF下给div设置padding后会导致width和height增加,但IE不会.(可用!important解决)
2,居中问题.
1).垂直居中.将line-height设置为当前div相同的高度,再通过vetical-align:middle.(注意内容不要换行.)
2).水平居中.margin:0auto;(当然不是万能)
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.贴上代码:
8、IE6的双倍边距BUG
<styletype=”text/css”>
body{margin:0}
div{float:left;margin-left:10px;;height:200px;border:1pxsolidred}
</style>
浮动后本来外边距10px,但IE解释为20px,解决办法是加上display:inline
9、为什么FF下文本无法撑开容器的高度?
标准浏览器中固定高度值的容器是不会象IE6里那样被撑开的,那我又想固定高度,又想能被撑开需要怎样设置呢?办法就是去掉height设置min-height:200px;这里为了照顾不认识min-height的IE6可以这样定义:
div{height:auto!important;height:200px;min-height:200px;}
兼容代码:兼容最推荐的模式。
/*FF*/
.submitbutton{
float:left;
width:40px;
height:57px;
margin-top:24px;
margin-right:12px;
}
/*IE6*/
*html.submitbutton{
margin-top:21px;
}
/*IE7*/
*+html.submitbutton{
margin-top:21px;
}
什么是浏览器兼容:当我们使用不同的浏览器(Firefox IE7 IE6)访问同一个网站,或者页面的时候,会出现一些不兼容的问题,有的显示出来正常,有的显示出来不正常,我们在编写CSS的时候会很恼火,刚修复了这个浏览器的问题,结果另外一个浏览器却出了新问题。而兼容就是一种办法,能让你在一个CSS里面独立的写支持不同浏览器的样式。这下就和谐了。呵呵!
程序代码
第一个兼容,IEFF所有浏览器公用(其实也不算是兼容)
height:100px;
第二个兼容IE6专用
_height:100px;
第三个兼容IE6 IE7公用
*height:100px;
height:100px;
*height:120px;
_height:150px;
在FF下,第2、3个属性FF不认识,所以它读的是height:100px;
在IE7下,第三个属性IE7不认识,所以它读第1、2个属性,又因为第二个属性覆盖了第一个属性,所以IE7最终读出的是第2个属性*height:120px;
在IE6下,三个属性IE6都认识,所以三个属性都可以读取,又因为第三个属性覆盖掉前2个属性,所以IE6最终读取的是第三个属性。
1针对firefox ie6 ie7的css样式
现在大部分都是用!important来兼容,对于ie6和firefox测试可以正常显示,但是ie7对!important可以正确解释,会导致页面没按要求显示!找到一个针对IE7不错的兼容方式就是使用“*+html”,现在用IE7浏览一下,应该没有问题了现在写一个CSS可以这样:
#1{color:#333;}/*Moz*/
*html#1{color:#666;}/*IE6*/
*+html#1{color:#999;}/*IE*/
那么在firefox下字体颜色显示为#333,IE6下字体颜色显示为#666,IE7下字体颜色显示为#999。
2css布局中的居中问题
主要的样式定义如下:
body{TEXT-ALIGN:center;}
#center{MARGIN-RIGHT:auto;MARGIN-LEFT:auto;}
说明:
首先在父级元素定义TEXT-ALIGN:center;这个的意思就是在父级元素内的内容居中;对于IE这样设定就已经可以了。
但在mozilla中不能居中。解决办法就是在子元素定义时候设定时再加上“MARGIN-RIGHT:auto;MARGIN-LEFT:auto;”
需要说明的是,如果你想用这个方法使整个页面要居中,建议不要套在一个DIV里,你可以依次拆出多个div,只要在每个拆出的div里定义MARGIN-RIGHT:auto;MARGIN-LEFT:auto;就可以了。
3盒模型不同解释.
#box{
width:600px;
//forie6.0-width:500px;
//forff+ie6.0
}
#box{
width:600px!important
//forff
width:600px;
//forff+ie6.0
width/**/:500px;
//forie6.0-
}
4浮动ie产生的双倍距离
#box{float:left;width:100px;margin:000100px;//这种情况之下IE会产生200px的距离display:inline;//使浮动忽略}
这里细说一下block,inline两个元素,Block元素的特点是:总是在新行上开始,高度,宽度,行高,边距都可以控制(块元素);Inline元素的特点是:和其他元素在同一行上,…不可控制(内嵌元素);
#box{display:block;//可以为内嵌元素模拟为块元素display:inline;//实现同一行排列的的效果diplay:table;
5IE与宽度和高度的问题
IE不认得min-这个定义,但实际上它把正常的width和height当作有min的情况来使。这样问题就大了,如果只用宽度和高度,正常的浏览器里这两个值就不会变,如果只用min-width和min-height的话,IE下面根本等于没有设置宽度和高度。比如要设置背景图片,这个宽度是比较重要的。要解决这个问题,可以这样:
#box{width:80px;height:35px;}html>body#box{width:auto;height:auto;min-width:80px;min-height:35px;}
6页面的最小宽度
min-width是个非常方便的CSS命令,它可以指定元素最小也不能小于某个宽度,这样就能保证排版一直正确。但IE不认得这个,而它实际上把 width当做最小宽度来使。为了让这一命令在IE上也能用,可以把一个<div>放到<body>标签下,然后为div指定一个类:
然后CSS这样设计:
#container{
min-width:600px;
width:expression(document.body.clientWidth<600?“600px”:“auto”);
}
第一个min-width是正常的;但第2行的width使用了Javascript,这只有IE才认得,这也会让你的HTML文档不太正规。它实际上通过Javascript的判断来实现最小宽度。
7清除浮动
.兼容box{
display:table;
//将对象作为块元素级的表格显示
}
或者
.兼容box{
clear:both;
}
或者加入:after(伪对象),设置在对象后发生的内容,通常和content配合使用,IE不支持此伪对象,非Ie浏览器支持,所以并不影响到IE/WIN浏览器。这种的最麻烦的
……#box:after{
content:“.”;
display:block;
height:0;
clear:both;
visibility:hidden;
}
8DIV浮动IE文本产生3象素的bug
左边对象浮动,右边采用外补丁的左边距来定位,右边对象内的文本会离左边有3px的间距.
#box{
float:left;
width:800px;}
#left{
float:left;
width:50%;}
#right{
width:50%;
}
*html#left{
margin-right:-3px;
//这句是关键
}
HTML代码
<DIVid=box>
<DIVid=left></DIV>
<DIVid=right></DIV>
</DIV>
9属性选择器(这个不能算是兼容,是隐藏css的一个bug)
p[id]{}div[id]{}
p[id]{}div[id]{}
这个对于IE6.0和IE6.0以下的版本都隐藏,FF和OPera作用
属性选择器和子选择器还是有区别的,子选择器的范围从形式来说缩小了,属性选择器的范围比较大,如p[id]中,所有p标签中有id的都是同样式的.
10IE捉迷藏的问题
当div应用复杂的时候每个栏中又有一些链接,DIV等这个时候容易发生捉迷藏的问题。
有些内容显示不出来,当鼠标选择这个区域是发现内容确实在页面。
解决办法:对#layout使用line-height属性或者给#layout使用固定高和宽。页面结构尽量简单。
11高度不适应
高度不适应是当内层对象的高度发生变化时外层高度不能自动进行调节,特别是当内层对象使用
margin或paddign时。例:
<divid=”box”>
<p>p对象中的内容</p>
</div>
CSS:
#box{background-color:#eee;}
#boxp{margin-top:20px;margin-bottom:20px;text-align:center;}
解决方法:在P对象上下各加2个空的div对象CSS代码:.1{height:0px;overflow:hidden;}或者为DIV加上border属性。
屏蔽IE浏览器(也就是IE下不显示)
*:lang(zh)select{font:12px!important;}/*FF,OP可见*/
select:empty{font:12px!important;}/*safari可见*/
这里select是选择符,根据情况更换。第二句是MAC上safari浏览器独有的。
仅IE7识别
*+html{…}
当面临需要只针对IE7做样式的时候就可以采用这个兼容。
IE6及IE6以下识别
*html{…}
这个地方要特别注意很多地主都写了是IE6的兼容其实IE5.x同样可以识别这个兼容。其它浏览器不识别。
html/**/>bodyselect{……}
这句与上一句的作用相同。
仅IE6不识别
select{display/*IE6不识别*/:none;}
这里主要是通过CSS注释分开一个属性与值,流释在冒号前。
仅IE6与IE5不识别
select/**/{display/*IE6,IE5不识别*/:none;}
这里与上面一句不同的是在选择符与花括号之间多了一个CSS注释。
仅IE5不识别
select/*IE5不识别*/{display:none;}
这一句是在上一句中去掉了属性区的注释。只有IE5不识别
盒模型解决方法
selct{width:IE5.x宽度;voice-family:”"}”";voice-family:inherit;width:正确宽度;}
盒模型的清除方法不是通过!important来处理的。这点要明确。
清除浮动
select:after{content:”.”;display:block;height:0;clear:both;visibility:hidden;}
在Firefox中,当子级都为浮动时,那么父级的高度就无法完全的包住整个子级,那么这时用这个清除浮动的兼容来对父级做一次定义,那么就可以解决这个问题。
截字省略号
select{-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrapoverflow:hidden;}
这个是在越出长度后会自行的截掉多出部分的文字,并以省略号结尾,很好的一个技术。只是目前Firefox并不支持。
只有Opera识别
@mediaalland(min-width:0px){select{……}}
针对Opera浏览器做单独的设定。
以上都是写CSS中的一些兼容,建议遵循正确的标签嵌套(divulli嵌套结构关系),这样可以减少你使用兼容的频率,不要进入理解误区,并不是一个页面就需要很多的兼容来保持多浏览器兼容),很多情况下也许一个兼容都不用也可以让浏览器工作得非常好,这些都是用来解决局部的兼容性问题,如果希望把兼容性的内容也分离出来,不妨试一下下面的几种过滤器。这些过滤器有的是写在CSS中通过过滤器导入特别的样式,也有的是写在HTML中的通过条件来链接或是导入需要的补丁样式。
IE5.x的过滤器,只有IE5.x可见
@mediatty{
i{content:”";/*”“*/}}@import’ie5win.css’;/*”;}
}/**/
IE5/MAC的过滤器,一般用不着
/**//*/
@import“ie5mac.css”;
/**/
IE的if条件兼容自己可以灵活使用参看这篇IE条件注释
OnlyIE
所有的IE可识别
只有IE5.0可以识别
OnlyIE5.0+
IE5.0包换IE5.5都可以识别
仅IE6可识别
OnlyIE7/-
IE6以及IE6以下的IE5.x都可识别
OnlyIE7/-
仅IE7可识别
Css当中有许多的东西不不按照某些规律来的话,会让你很心烦,虽然你可以通过很多的兼容,很多的!important来控制它,但是你会发现长此以往你会很不甘心,看看许多优秀的网站,他们的CSS让IE6,Ie7,Firefox,甚至Safari,Opera运行起来完美无缺是不是很羡慕?而他们看似复杂的模版下面使用的兼容少得可怜。其实你要知道IE和Firefox并不不是那么的不和谐,我们找到一定的方法,是完全可以让他们和谐共处的。不要你认为发现了兼容的办法,你就掌握了一切,我们并不是兼容的奴隶。
div ul li的嵌套顺序
具体嵌套写法
遵循上面得嵌套方式,<div><ul><li></li></ul></div> 然后在CSS里面告诉ul{Margin:0px;Padding:0px;list-style:none;},其中list-style:none是不让<li>标记的最前方显示圆点或者数字等目录类型的标记,因为IE和Firefox显示出来默认效果有些不一样。因此这样不需要做任何手脚,你的IE6、和IE7、Firefox显示出来的东西(外距,间距,高度,宽度)就几乎没什么区别了,也许细心的你会在某一个时刻发现一、两个象素的差别,但那已经很完美了,不需要你通过调整大片的CSS来控制它们的显示了,你愿意,你可以仅仅兼容一两个地方,而且通常这种兼容可以适应各种地方,不需要你重复在不同的地方调试不同的兼容方式–减轻你的烦。你可以ul.class1,ul.class2,ul.class3{xxx:xxxx}的方式方便的整理出你要兼容的地方,而统一兼容。尝试一下吧,再也不要乱嵌套了,虽然在Div+CSS的方式下你几乎可以想怎么嵌套就怎么嵌套,但是按照上面的规律你将轻松很多,从而事半功倍!