css hack 问题(转)

 

一,由于不同的浏览器,比如Internet Explorer 6,Internet Explorer 7,Mozilla Firefox等,对CSS的解析认识不一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。 ­

  这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。 ­

  这个针对不同的浏览器写不同的CSS code的过程,就叫CSS hack,也叫写CSS hack。 ­

  CSS Hack的原理是什么 ­

  由于不同的浏览器对CSS的支持及解析结果不一样,还由于CSS中的优先级的关系。我们就可以根据这个来针对不同的浏览器来写不同的CSS。 ­

  比如 IE6能识别下划线"_"和星号" * ",IE7能识别星号" * ",当不能识别下划线"_",而firefox两个都不能认识。等等 ­

  书写顺序,一般是将识别能力强的浏览器的CSS写在后面。下面如何写里面说得更详细些。 ­

  如何写CSS Hack ­

  比如要分辨IE6和firefox两种浏览器,可以这样写: ­

  <style> ­

  div{ ­

  background:green; /* for firefox */ ­

  *background:red; /* for IE6 */ ­

  } ­

  </style> ­

  我在IE6中看到是红色的,在firefox中看到是绿色的。 ­

  解释一下: ­

  上面的css在firefox中,它是认识不了后面的那个带星号的东东是什么的,于是将它过滤掉,不予理睬,解析得到的结果是:div{background:green},于是理所当然这个div的背景是绿色的。 ­

  在IE6中呢,它两个background都能识别出来,它解析得到的结果是:div{background:green;background:red;},于是根据优先级别,处在后面的red的优先级高,于是当然这个div的背景颜色就是红色的了。 ­

  CSS hack:区分IE6,IE7,firefox ­

  区别不同浏览器,CSS hack写法: ­

  区别IE6与FF: ­

  background:orange;*background:blue; ­

  区别IE6与IE7: ­

  background:green !important;background:blue; ­

  区别IE7与FF: ­

  background:orange; *background:green; ­

  区别FF,IE7,IE6: ­

  background:orange;*background:green;_background:blue; ­

  background:orange;*background:green !important;*background:blue; ­

  注:IE都能识别*;标准浏览器(如FF)不能识别*; ­

  IE6能识别*,但不能识别 !important, ­

  IE7能识别*,也能识别!important; ­

  FF不能识别*,但能识别!important; ­

           IE6 IE7 FF ­

     *       √   √   × ­

  !important ×   √   √ ­

  浏览器优先级别:FF<IE7<IE6,CSS hack书写顺序一般为FF IE7 IE6 ­

  : " #demo {width:100px;} "为例; ­

  #demo {width:100px;} /*FIREFOX,IE6,IE7执行.*/ ­

  * html #demo {width:120px;} /*会被IE6执行,之前的定义会被后来的覆盖,所以#demo的宽度在IE6就为120px; */ ­

  *+html #demo {width:130px;} /*会被IE7执行*/ ­

  --------------- ­

  所以最后,#demo的宽度在三个浏览器的解释为: ­

  FIREFOX:100px; ­

  ie6:120px; ­

ie7:130px; ­

二,对于ul   form等在浏览器中是有默认属性的。IE中默认的是margin,但是FIREFOX中默认的是padding。所以在进行定义的时候,为了防止页面结构在不同浏览器中有变化,对ul   form等进行设置时应该有如下设置ulform{ margin0padding0} ­

三,IE条件注释功能 ­

1,如果想让html页面中的某一块只在ie中显示可以 ­

<!--[ifIE]>只有IE能显示此块<![endif]--> ­

那么里边的内容只有在IE浏览器中才能被显示,但是在FF或其他浏览器中显示不出来。 ­

那么<!--[ifIE6.0]>只有IE6能显示此块<![endif]--> ­

IE6中两个浮动DIV中加注释或者JS代码,出现文字溢出问题­

IE6文字溢出问题­

出现情况:­­

a.两个浮动DIV之间有注释或者JS代码­

b.hidden的input直接放在form下­

c.display为none的div也有可能引发此bug

b,c可以通过外面再包一次DIV解决 ­

a 解决办法: ­­

1、不放置注释。最简单、最快捷的解决方法; ­

2、注释不要放置于2个浮动的区块之间; ­

3、将文字区块包含在新的<div></div>之间,如:<div style="float:right;width:400px"><div>文字</div></div>; ­

4、去除文字区块的固定宽度,与3有相似之处; ­

5、在后面加一个­

或者空格;(不推荐) ­

6、使用IE注释格式,如:<!--[if IE]>注释文字<![endif]--> ­

7、给盒子加position:relative;属性

代码要规范,不必要的代码不要,用不到float:left;最好不加,否则有bug问题。

 

IE系列

  selector { +property:value; } 在属性名前加上加号"+",这个Hack只有IE系列可以识别.
  selector { *property:value; } 在属性名前加上星号"*",这个Hack只有IE系列可以识别.
  selector { _property:value; } 在属性名前加上下划线"_",这个Hack只有IE系列 (除IE7外) 识别.
  * html selector{ property:value; } 在选择器上运用继承法 * html selector, 这个Hack只有IE系列 (除IE7外) 可以识别.
  html/**/ >body selector { property:value; } 在选择器上运用继承法 html/**/ >body selector ,这个Hack只有IE系列 (除IE7外) 可以识别.
  selector { property/**/:value; } 在属性名和冒号":"之间加入注释,屏蔽IE6用.
  selector/**/ { property/**/:value; } 在选择器和花括号"{"之间以及在属性名和冒号":"之间加入注释,屏蔽IE5和IE6用 (不屏蔽IE5.5) .
  select/**/ { property:value; } 在选择器和花括号"{"之间加入注释,屏蔽IE5用.
  *+html selector { property:value !important; } 在选择器上运用继承法 *+html selector 再加上 !important, 这个Hack只有IE7可以识别.

2,从IE5.0IE7都能支持此注释功能。并且可精确到小数点后四位。如 ­

<!--[ifIE5.1000]>只有IE5.1能显示此块<![endif]--> ­

3,条件注释前可加前缀,用于判断更高或更低版本。如: ­

<!--[if gt IE5]>只有IE5以上版本能显示此块(不包括IE5<![endif]--> ­

<!--[if gte IE5]>只有IE5及以上版本能显示此块(包括IE5<![endif]--> ­

<!--[if lt IE7]>只有IE7以下版本能显示此块(不包括IE7<![endif]--> ­

<!--[if lte IE7]>只有IE7及以下版本能显示此块(包括IE7<![endif]--> ­

注意:此注释写在html文件中,而不是css文件中 ­

四,CSS Hack [/B]汇总快查[/B] ­

屏蔽IE浏览器(也就是IE下不显示) ­

*:lang(zh) select {font:12px   !important;} /*FF,可见,特别提醒:由于Opera最近的升级,目前此句只为FF所识别*/ ­

select:empty {font:12px   !important;} /*safari可见*/ ­

这里select是选择符,根据情况更换。第二句是MAC上safari浏览器独有的。 ­

仅IE7与IE5.0可以识别 ­

*+html  select {} ­

当面临需要只针对IE7与IE5.0做样式的时候就可以采用这个HACK。 ­

仅IE7可以识别 ­

*+html  select {…!important;} ­

当面临需要只针对IE7做样式的时候就可以采用这个HACK。 ­

IE6及IE6以下识别 ­

* html  select {} ­

这个地方要特别注意很多博客都写成了是IE6的HACK其实IE5.x同样可以识别这个HACK。其它浏览器不识别。 ­

html/**/ >body  select {} ­

这句与上一句的作用相同。 ­

仅IE6不识别,屏蔽IE6 ­

select { display /*屏蔽IE6*/:none;} ­

这里主要是通过CSS注释分开一个属性与值,注释在冒号前。 ­

仅IE6与IE5不识别,屏蔽IE6与IE5 ­

select/**/ { display /*IE6,IE5不识别*/:none;} ­

这里与上面一句不同的是在选择符与花括号之间多了一个CSS注释。不屏蔽IE5.5 ­

仅IE5不识别,屏蔽IE5 ­

select/*IE5不识别*/ {} ­

这一句是在上一句中去掉了属性区的注释。只有IE5不识别,IE5.5可以识别。 ­

盒模型解决方法 ­

selct {width:IE5.x宽度; voice-family :"/"}/""; voice-family:inherit; width:正确宽度;} ­

盒模型的清除方法不是通过!important来处理的。这点要明确。 ­

清除浮动 ­

select:after {content:"."; display:block; height:0; clear:both; visibility:hidden;} ­

在Firefox中,当子级都为浮动时,那么父级的高度就无法完全的包住整个子级,那么这时用这个清除浮动的HACK来对父级做一次定义,那么就可以解决这个问题。 ­

截字省略号 ­

select { -o-text-overflow:ellipsis; text-overflow:ellipsis; white-space:nowrap; overflow:hidden; } ­

这个是在越出长度后会自行的截掉多出部分的文字,并以省略号结尾,很好的一个技术。只是目前Firefox并不支持。 ­

只有Opera识别 ­

@media all and (min-width: 0px){ select {……} } ­

针对Opera浏览器做单独的设定。 ­

以上都是写CSS中的一些HACK,这些都是用来解决局部的兼容性问题,如果希望把兼容性的内容也分离出来,不妨试一下下面的几种过滤器。这些过滤器有的是写在CSS中通过过滤器导入特别的样式,也有的是写在HTML中的通过条件来链接或是导入需要的补丁样式。 ­

IE5.x的过滤器,只有IE5.x可见 ­

@media tty { ­

i{content:"/";/*" "*/}} @import 'ie5win.css'; /*";} ­

}/* */ ­

IE5/MAC的过滤器,一般用不着 ­

/*/*//*/ ­

     @import "ie5mac.css"; ­

/**/ ­

如果背景颜色不显示,在属性中加overflow:auto(自动)。 ­

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值