hack书写规范
因为不同浏览器对W3C标准的支持不一样,各个浏览器对于页面的解释呈视也不尽相同,比如IE在很多情况下就与FF 存在3px的差距,对于这些差异性,就需要利用css 的hack来进行调整,当然在没有必要的情况下,最好不要写hack来进行 调整,避免因为hack而导致页面出现问题。
IE6、IE7、Firefox之间的兼容写法:
写法一:
IE都能识别*;标准浏览器(如FF)不能识别*;
IE6能识别*,但不能识别 !important, I
E7能识别*,也能识别!important; FF不能识别*,但能识别!important;
根据上述表达,同一类/ID下的CSS
hack可写为:
.searchInput {
background-color:#333;/*三者皆可*/
*background-color:#666 !important; /*仅IE7*/
*background-color:#999; /*仅IE6及IE6以下*/
}
一般三者的书写顺序为:FF、IE7、IE6.
写法二:
IE6可识别“_”,而IE7及FF皆不能识别,所以当只针对IE6与IE7及FF之间的区别时,
可这样书写:
.searchInput {
background-color:#333;/*通用*/
_background-color:#666;/*仅IE6可识别*/ }
写法三:
*+html 与 *html 是IE特有的标签, Firefox 暂不支持。
.searchInput {background-color:#333;}
*html .searchInput {background-color:#666;}/*仅IE6*/
*+html .searchInput {background-color:#555;}/*仅IE7*/
屏蔽IE浏览器: select是选择符,根据情况更换。
第二句是MAC上safari浏览器独有的。
*:lang(zh) select {font:12px !important;} /*FF的专用*/
select:empty {font:12px !important;} /*safari可见*/
IE6可识别: 这里主要是通过CSS注释分开一个属性与值,注释在冒号前。
select { display /*IE6不识别*/:none;}
IE的if条件hack写法:
所有的IE可识别:
<!–[if IE]> Only IE <![end if]–> 只有IE5.0可以识别: <!–[if IE 5.0]> Only IE 5.0 <![end if]–>
IE5.0包换IE5.5都可以识别: <!–[if gt IE 5.0]> Only IE 5.0+ <![end if]–>
仅IE6可识别: <!–[if lt IE 6]> Only IE 6- <![end if]–>
IE6以及IE6以下的IE5.x都可识别: <!–[if gte IE 6]> Only IE 6/+ <![end if]–>
仅IE7可识别: <!–[if lte IE 7]> Only IE 7/- <![end if]–>
清除浮动
在Firefox中,当子级都为浮动时,那么父级的高度就无法完全的包住整个子级,那么这时用这个清除浮动的HACK来对父级 做一次定义,那么就可以解决这个问题。
select:after {
content:”.”;
display:block;
height:0;
clear:both;
visibility:hidden;
}
利用border属性确定出错元素的布局特性
使用float属性布局一不小心就会出错。
这时为元素添加border属性确定元素边界,错误原因即水落石出。
float:
float元素的父元素不能指定clear属性
MacIE下如果对float的元素的父元素使用clear属性,周围的float元素布局就会混乱。
这是MacIE的著名的bug,倘若不知道就会走弯路。
float元素务必指定width属性
很多浏览器在显示未指定width的float元素时会有bug。
所以不管float元素的内容如何,一定要为其指定width属性。
另外指定元素时尽量使用em而不是px做单位。
float元素不能指定margin和padding等属性
IE在显示指定了margin和padding的float元素时有bug。
因此不要对float元素指定margin和padding属性(可以在float元素内部嵌套一个div来设置margin和padding)。
也可以使用hack方法为IE指定特别的值。
float元素的宽度之和要小于100%
如果float元素的宽度之和正好是100%,某些古老的浏览器将不能正常显示。因此请保证宽度之和小于99%。
float的div一定要闭合
例如:(其中floatA、floatB的属性已经设置为float:left;)
程序代码
<#div id="floatA" ></#div>
<#div id="floatB" ></#div>
<#div id="NOTfloatC" ></#div>
这里的NOTfloatC并不希望继续平移,而是希望往下排。
这段代码在IE中毫无问题,问题出在FF。
原因是NOTfloatC并非float标签,必须将float标签闭合。
在程序代码
<#div class="floatB"></#div>
<#div class="NOTfloatC"></#div>
之间加上 程序代码
<#div class="clear"></#div>
这个div一定要注意声明位置,一定要放在最恰当的地方,
而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。
并且将clear这种样式定义为为如下即可:
程序代码 .clear{ clear:both; }
此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden;
当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。
例如某一个wrapper如下定义: 程序代码 .colwrapper{ overflow:hidden; zoom:1; margin:5px auto; }
margin加倍的问题
设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。
解决方案是在这个div里面加上display:inline;
例如:
<#div id="imfloat"></#div>
相应的css为 程序代码
#IamFloat{ float:left; margin:5px;/*IE下理解为10px*/ display:inline;/*IE下再理解为5px*/ }
常见兼容问题:
(1)DOCTYPE 影响 CSS 处理
(2)FF:div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行
(3)FF:body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中
(4)FF:设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width
(5)FF:支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式
(6)div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行
(7)cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以
(8)FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一 个空格。
(9)、在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法: div{margin:30px!important;margin:28px;}
注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器可以识别。
所以在IE下其实解释成这样: div{maring:30px;margin:28px} 重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important;
(10)IE5 和IE6的BOX解释不一
IE5下 程序代码 div{300px;margin:0 10px 0 10px;}
div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,
而在IE6和其他浏览器上宽度则是以300px+10px(右填充)+10px(左填充)=320px来计算的。
这时我们可以做如下修改 div{300px!important;width /**/:340px;margin:0 10px 0 10px}
关于这个/**/是什么我也不太明白,只知道IE5和firefox都支持但IE6不支持,如果有人理解的话,请告诉我一声,谢了!:)
(11)ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值所以先定义 程序代码ul{margin:0;padding:0;}
一定要注意缩进,对齐。要有良好的编程习惯。