CSS中加号、星号及其他符号的作用

转自:http://blog.sina.com.cn/s/blog_6790717801011dx8.html

首先,什么是CSS hack?
  针对不同的浏览器写不同的CSS code的过程,就叫CSS hack!

  CSS hack由于不同的浏览器,比如Internet Explorer
6,Internet Explorer 7,Mozilla
Firefox等,对CSS的解析认识不一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。
  这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。

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

  CSS Hack大致有3种表现形式,CSS类内部Hack、选择器Hack以及HTML头部引用(if IE)Hack,CSS
Hack主要针对IE浏览器。
  类内部Hack:比如 IE6能识别下划线"_"和星号" * ",IE7能识别星号" *
",但不能识别下划线"_",而firefox两个都不能认识。
  选择器Hack:比如 IE6能识别*html .class{},IE7能识别*+html
.class{}或者*:first-child+html .class{}。
  HTML头部引用(if IE)Hack:针对所有IE:<!--[if
IE]><!--您的代码--><![endif]-->,针对IE6及以下版本:<!--[if
lt IE
7]><!--您的代码--><![endif]-->,这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效。

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

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

<style>
   div{
   background:green;
   *background:red;
   }

</style>

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

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

在理想世界里,正确的CSS应该在任何支持CSS的浏览器里工作良好。不幸的是,我
们并不是生活在理想的世界里,浏览器们布满了BUG和不一致。创建一个跨浏览器并且显示一致的页面,CSS开发者必须想尽办法。通过使用BUG和未实现的
CSS,开发者就能够为不同的浏览器应用不同的规则。HACK和FILTER是开发者强有力的武器。了解各种常用的HACKS以及它们如何工作,是件重要
的事,但什么时候用和什么时候不用它们,也是件同等重要的事情。

  CSS
filter或者hack是一种代码,用来根据浏览器类型,版本号显示或隐藏CSS标签。浏览器们对CSS行为有不同的解释,对W3C标准的支持程度也不
相同。CSS
过滤器经常用于在多个浏览器中实现一致的布局外观,因为某些浏览器无法渲染。HACK(黑客)这样的称呼多少有点消极,实质上属于个人对CSS代码非官方
的修改,误导人们以为还有更好的方法达到目的,但其实我们没有,有的人喜欢用patch(补丁)来称呼它,这样人们就能知道这本是浏览器造成的错误。

  反斜线符号

  这种hack利用了一个在Mac平台上的IE的bug。以\*/结束的注释在IE
Mac上是不正确关闭的,所以那些需要被忽略的语句可以放在这种注释后面。

  

  selector { ...styles...
}

  

  盒模型hack

  (适用于IE6以下版本)

  叫它“盒模型hack”是因为它经常被用于解决IE的盒模型错误,这个hack可以为IE和其它浏览器设置不同的属性。(在版本6时,IE已经修正了这个盒模型错误。)

  #elem {

  width: [IE 中的宽度];

  voice-family:
"\"}\"";

  voice-family:inherit;

  width: [其它浏览器中的宽度];

  }

  html>body #elem
{

  width:[其它浏览器中的宽度];

  }

  第一个,把voice-family设置为字符串"}",但是IE的解析bug会把它当作一个反斜线加右括号。选择
voice-family是因为它不会影响到页面样式。第二个规则,使用了html>body
hack,是为Opera7.0以前浏览器,它也有这样的解析错误,但幸好它支持子选择器,所以有这样较简单的方法。

  下划线hack

  (适用于IE6及其以下版本)

  IE 6
及以下的版本可以识别带有下划线前缀的属性,而其它的浏览器会忽略它。因此,一个属性前面加上下划线或者连字符,就成为了IE6及以下版本浏览器的专有属性。

  #elem {

  width: [W3C Model
Width];

  _width: [BorderBox
Model];

  }

  这个hack使用了无效的CSS,利用了一个浏览器的bug,但是我们有有效的CSS语句可以完成这样的事情,所以这个HACK不推荐使用。

  星号hack

  (适用于IE7以下版本)

  除了下划线和连字符,版本7及以下的IE可以识别以非字母字符为前缀的属性,而其它浏览器会忽略。

  #elem {

  width: [W3C Model
Width];

  *width: [BorderBox
Model];

  }

  这个HACK不推荐使用,原因同上面的下划线HACK一样。

  星号 HTML hack

  (适用于IE4-6)

  HTML元素是W3C标准DOM (Document Object
Model)的根元素,但是IE 4至6的版本中还有一个神秘的父元素。完全兼容的浏览器会忽略这个*
html选择器,但IE4-6却会对它正常处理。这样就可以为这些版本的浏览器指定特别的规则。比如,这个规则可以特别指定IE4-6中的文字大小,但对其它浏览器不起作用。

  * html p {font-size: 5em;
}

  这个HACK使用了完全有效的CSS。

  星号加号HACK

  (适用于IE7)

  虽然IE7不再识别以前的* html
hack,但它使用了一个相似的新的hack。

  *:first-child+html p {
font-size: 5em; }

  或者:

  *+html p { font-size: 5em;
}

  此代码只适用于IE7,不适用于其它任何浏览器。注意这个HACK只在IE7标准模型里工作正常,在怪异模式下不能用。这个hack也被IE8的兼容模式(相当于IE7的标准模式)所支持。和星号HTML
hack一样,它也使用了有效的CSS。

  子选择器hack

  (适用于IE6及以下版本)

  IE6和早期的版本不支持“子选择器”(>),利用这个我们可以为其它浏览器指定特别的规则。举例来说,这个规则可以让段落文字在firefox
变成蓝色,但在IE7之前的版本里却不能。

  html > body p {
color: blue; }

  虽然IE7增加了对子选择器的支持,但人们发现了新的hack可以把IE7也排除。当一个空的注释紧跟在子选择器的后面重复的时候,IE7会不识别后面的规则,就和较早版本的浏览器一样。

  html > body p {
color: blue; }

  否定伪类HACK

  (可区分IE和非IE)

  IE的所有版本都不支持CSS3 : not()
伪类。有一种变异的HACK使用 : root 伪类,此伪类也同样不被IE识别。

  .yourSelector {

  color: black;

  }

  html:not([dummy]) .yourSelector
{

  color: red;

  }

  这种否定选择器接受任何类型作为参数,属性,通用,类或ID选择器,或者伪类。然后它会把后面的属性应用于所有不匹配此语法的元素上。

  Body:empty hack

  (适用于Firefox 2.0及以下版本)

  :empty
伪类,在CSS3中介绍过的,用于选择不含任何内容的元素。然而,Geck0 1.8.1 和之后版本(应用在Firefox2.0.x
及之后的版本)错误地选择了body:empty 即使body元素包含有内容(一般情况都如此)。这样我们可以向Firefox
2.0x及以下版本提供专用的CSS规则。

  

  body:empty p {

  display:none;

  }

  此HACK使用有效的CSS.

  !Important 怪僻

  (适用于IE8以下版本)

  IE8及以下版本有一些和!imporant有关的怪僻,它允许一个赋值优先级更高。IE7及更早版本接受任意字符串替代important,并且会正常处理该值,而其它浏览器则会忽略。

  

  body {

  color: black;

  color: blue !ie;

  }

  相似地,IE8及更早版本接受在!important声明后面的非字母符号,而其它浏览器会忽略它。

  body {

  color: black;

  color: blue
!important!;

  }

  IE6及以下版本有一个!important带来的问题,当在同一段代码块中同一元素的同一属性有了不同的值,本应结果是第二个值被第一个取代,但IE6及更低版本并不这么做。

  

  body {

  color: black
!important;

  color: blue;

  }

  所有这些HACK使用的是有效的CSS。

  动态属性

  在版本5至7,IE曾支持过一种语法适用于动态变化的CSS属性,有时被称为CSS表达式。动态属性通常混合其它HACK以补偿更早版IE中不支持的属性。

  div {

  min-height: 300px;

  

  _height:
expression_r(document.body.clientHeight < 300 ?
"300px" : "auto");

  }

  有条件的注释

  有条件的注释只在Windows平台的IE上被识别,并从IE5起开始支持,它甚至可以区分版本5.0,5.5和6.0。

  代码:

  下面是一些“有条件的注释”,可以显示你正在使用的IE版本。如果你看不到,那么你用的不是IE:

  <p><!--[if
IE]>

  According to the conditional
comment this is Internet Explorer<br
/>

  <![endif]-->

  <!--[if IE
5]>

  According to the conditional
comment this is Internet Explorer 5<br
/>

  <![endif]-->

  <!--[if IE
5.0]>

  According to the conditional
comment this is Internet Explorer 5.0<br
/>

  <![endif]-->

  <!--[if IE
5.5]>

  According to the conditional
comment this is Internet Explorer 5.5<br
/>

  <![endif]-->

  <!--[if IE
6]>

  According to the conditional
comment this is Internet Explorer 6<br
/>

  <![endif]-->

  <!--[if IE
7]>

  According to the conditional
comment this is Internet Explorer 7<br
/>

  <![endif]-->

  <!--[if gte IE
5]>

  According to the conditional
comment this is Internet Explorer 5 and up<br
/>

  <![endif]-->

  <!--[if lt IE
6]>

  According to the conditional
comment this is Internet Explorer lower than 6<br
/>

  <![endif]-->

  <!--[if lte IE
5.5]>

  According to the conditional
comment this is Internet Explorer lower or equal to
5.5<br />

  <![endif]-->

  <!--[if gt IE
6]>

  According to the conditional
comment this is Internet Explorer greater than 6<br
/>

  <![endif]-->

  </p>

  注意它的语法:

  - gt: 高于

  - lte:低于或相当

  说明:

  1.它们的基本结构和HTML注释一样(<!--
-->)。因此其它所有浏览器会把它们当作正常的注释忽略掉。

  2.Windows
IE里的程序可以识别这个特殊的<!--[if
IE]>语法,处理if并解析此注释中的内容,就当作是正常的网页内容一样。

  3.既然“有条件的注释”使用了HTML注释的结构,它们就只能被包含在HTML文件里,而不是CSS文件里。你可以把整个<link>标签放在“有条件的注释”里,指向一个指定的样式表。如下所示:

  <link
href="all_browsers.css" rel="stylesheet"
type="text/css">

  <!--[if
IE]> <link href="ie_only.css"
rel="stylesheet" type="text/css">
<![endif]-->

  <!--[if lt IE
7]> <link href="ie_6_and_below.css"
rel="stylesheet" type="text/css">
<![endif]-->

  <!--[if !lt IE
7]><![IGNORE[--><![IGNORE[]]>
<link href="recent.css" rel="stylesheet"
type="text/css">
<!--<![endif]-->

  <!--[if
!IE]>--> <link
href="not_ie.css" rel="stylesheet" type="text/css">
<!--<![endif]-->

  IE8 hack

  IE8不能识别“*”和“_”的css
hack,所以我们可以使用"\9"来区分IE的各个版本。

  color:#0000FF\9; ;

  *color:#FFFF00;

  _color:#FF0000;

  小结

  使用HACK隐藏代码在浏览器更新时经常会导致页面不正常显示。许多HACK曾用于在IE6及更低版本中隐藏CSS,但在版本7下不再工作,因为IE改进了对CSS
标准的支持。微软的IE开发小组曾要求人们使用有条件的注释,代替使用hack。

时间: 2024-10-27 05:10:34

CSS中加号、星号及其他符号的作用的相关文章

shell脚本中常见的一些特殊符号和作用详解

这篇文章主要介绍了shell脚本中常见的一些特殊符号和它的作用详解,总结的很简洁,容易看懂,需要的朋友可以参考下 在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我们编写的代码更加简洁和高效,这里给大家汇总下: 1.{} 大括号: 用法一:通配符扩展eg: ls my_{finger,toe}s这条命令相当于如下命令的组合:ls my_fingers my_toeseg: mkdir {userA,userB,userC}-{home,bin,data}我们将得到

11.C#中的转义符和@符号的作用

转义符 转义符是指一个'\'+一个特殊的字符,组成的一个具有特殊意义的字符. \n:  表示换行. namespace _11.转义符 { class Program { static void Main(string[] args) { Console.WriteLine("窗前明月光,\n疑是地上霜.\n举头望明月,\n低头思故乡."); Console.ReadKey(); } } } 注意在windows操作系统下想实现换行,我们必须书写成\r\n. Mac操作系统下是支持\r

html/css中BFC的开启、关闭、作用

什么是BFC BFC是什么并不重要.重要的是开启它干嘛?以及如何开启它 根据W3C的标准,在页面中元素都一个隐含的属性叫做Block Formatting Context(块级 格式化 环境)简称BFC 开启元素的BFC后,元素会有如下特性: 1.父元素的垂直外边距不会和子元素重叠. 2.开启BFC的元素不会被浮动的元素所覆盖. 3.开启BFC的元素可以包含浮动的子元素. 在以下情况下,会自动开启BFC: 1.设置元素浮动(此方法,虽然可以撑开父元素,但是会导致父元素的宽度丢失,也会导致下边的元

CSS中元素的height:100%如何起作用的?自适应高度

Web浏览器在计算有效宽度时会考虑浏览器窗口的打开宽度.如果你不给宽度设定任何缺省值,那浏览器会自动将页面内容平铺填满整个横向宽度.而当你设置一个页面元素的高度(height)为100%时,期望这样元素能撑满整个浏览器窗口的高度,但大多数情况下,这样的做法没有任何效果.你知道为什么height:100%不起作用吗? 答: 高度的计算方式完全不一样.事实上,浏览器根本就不计算内容的高度,除非内容超出了视窗范围(导致滚动条出现).或者你给整个页面设置一个绝对高度.否则,浏览器就会简单的让内容往下堆砌

php中函数前加&amp;符号的作用分解

这篇文章主要介绍了php中的函数前加&符号的作用分解,其作用叫做引用返回,有点抽象,详细解释请看本文内容,需要的朋友可以参考下  (转载) php变量前面加&符号是什么意思就不用多说了,大家都在用,就是两个变量同时指向一个地址而已,那么,php函数前面加&符号的意义又是什么呢?下面先上两个演示代码,然后再做解释. function &chhua() { static $b = "www.jb51.net"; //申明一个静态变量 $b = $b . &q

css中&quot;.&quot;,&quot;,&quot;,“~”和“&gt;”符号的意义

css中“~” element1~element2 选择器匹配出现在element1后面的element2.element1和element2这两种元素必须具有相同的父元素,但element2不必紧跟在element1的后面. 如: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> </head> <style>

css中hack是什么

首先,先把前辈的文章放在看得见的位置,以示尊重:https://www.cnblogs.com/Renyi-Fan/p/9006084.html#_label0 总结 1.CSS hack:由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览器的不同版本,如IE6和IE7,对CSS的解析认识不完全一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果. 这个时候我们就需要针对不同的浏览器去写不同

JQuery中的$符号的作用----网摘

jQuery中的“$” 在jQuery中,最频繁使用的符号“$”.$提供了各种各样丰富的功能, 包括选择页面中的一个或是一类元素,作为功能函数的前缀,window.onload的 完善,创建页面的DOM节点等... 1.选择器 在CSS中选择器的作用是选择页面中某一类(类别选择器)元素或者某一个元素(ID选择器) ,而jQuery中的"$"作为选择器,同样是选择某一类或某一类元素,只不过jQuery提供了 更多更全面的选择方式.并且为用户处理了浏览器的兼容问题 CSS可以通过如下代码来

css中的hack

1.什么是CSS hack? CSS hack是通过在CSS样式中加入一些特殊的符号,让不同的浏览器识别不同的符号(什么样的浏览器识别什么样的符号是有标准的,CSS hack就是让你记住这个标准),以达到应用不同的CSS样式的目的,比如.kwstu{width:300px;_width:200px;},一般浏 览器会先给元素使用width:300px;的样式,紧接着后面还有个_width:200px;由于下划线_width只有IE6可以识别,所以此样式 在IE6中实际设置对象的宽度为200px,