示曲豆
------ 千礼之行始于足下。。
【转自】http://www.w3cfuns.com/blog-5421655-5400902.html
 
什么是伪类(pseudo class)?
pseudo这个单词来源于希腊语的音译,意思是虚构的,假的,或者伪的意思。因此这里不难理解为什么我们称之为伪类。
和一般的DOM中的元素样式不一样,它并不改变任何DOM内容。只是插入了一些修饰类的元素,这些元素对于用户来说是可见的,但是对于DOM来说不可见。

因此大家需要注意一下几点:
它们不是真正的元素,对于很多情况下,大家不用用它展示实际意义的内容,尽量用它显示修饰性内容或者设计性内容,例如,图标
要知道有些相关的开发工具,例如著名的开发工具firebug根本就不显示任何的伪类生成内容,如果你使用的话,你知道后果的!你将陷入盲目的debug中。当然你使用Chrome可以看到样式,但是在DOM看不到元素。

什么时候使用伪类(pseudo class)?
如果你需要创建一些修饰类图标,或者设计UI的时候,使用伪类是相当方便的

:before和:after的作用就是在指定的元素内容(而不是元素本身)之前或者之后插入一个包含content属性指定内容的行内元素,最基本的用法如下
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>伪类元素的基本用法</title>
<style>
#example:before{ content:"$我在前面"; color:red;}
#example:after{ content:"我在后面¥"; color:red;}
</style>
</head>

<body>
<div id="example">我是内容部分</div>
</body>
</html>
需要注意的是如果没有content属性,伪类元素将没有任何作用。但是可以指定content为空,同时正如前面所说,插入的内容默认是一个行内元素,并且在HTML源代码中无法看到,这就是为什么称之为伪类元素的理由,所以也就无法通过DOM对其进行操作。

除了插入文字内容,还可以指定其他内容:

p:before {
    content: url('img.jpg');
}
a:after {
    content: attr(href);
}
attr()函数会返回指定元素对应属性的值

再看一个关于:before :after的实例及兼容写法
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>理解伪元素 :Before 和 :After</title>
<style>
div{ width:300px; height:240px; background:#2A5F55; color:#fff; float:left;}
div:first-child{ border-right:1px solid #fff;}
.demo:before ,.demo:after ,span{ content:""; display:block; width:80px; height:80px; line-height:80px; text-align:center; background:#D4BF00; margin:0 auto;}
.demo:before ,.before{ background:#800000; content:"before";}
.demo:after ,.after{ background:#FF3F55; content:"after";}
</style>
</head>

<body>
<div class="demo">
    <!--<before></before>-->
    <span>content</span>
    <!--<after></after>-->
</div>
<div>
    <span class="before">before</span>
    <span>content</span>
    <span class="after">after</span>
</div>

<p style="clear:both; padding:10px;"><strong>结论:</strong>:before和:after的作用就是在指定的元素内容(而不是元素本身)之前或者之后插入一个包含content属性指定内容的行内元素</p>
</body>
</html>

最后再来一个伪元素:before :after结合css3的八卦图实例

 

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>伪类元素的应用——八卦图案</title>
<style>
h3{text-align:center;}
#bagua{ width:192px; height:96px; margin:0 auto; border-radius:100%; background:#fff; border-color:#000; border-style:solid; border-width:4px 4px 100px 4px; position:relative;}
#bagua:before{ position:absolute; top:50%; left:0; content:""; background:#fff; width:24px; height:24px; border:36px solid #000; border-radius:100%;}
#bagua:after{ position:absolute; top:50%; left:50%; content:""; background:#000; width:24px; height:24px; border:36px solid #fff; border-radius:100%;}
</style>
</head>

<body>
    <h3>八卦图</h3>
    <div id="bagua"></div>
</body>
</html>

 

伪类一开始单单只是用来表示一些元素的动态状态,典型的就是链接的各个状态(LVHA)。随后CSS2标准扩展了其概念范围,使其成为了所有逻辑上存在但在文档树中却无须标识的“幽灵”分类。  

伪元素则代表了某个元素的子元素,这个子元素虽然在逻辑上存在,但却并不实际存在于文档树中。

伪类和伪元素混淆的由来  最为混淆的,可能是大部分人都将 :before 和 :after 这样的伪元素随口叫做伪类,而且即使在概念混淆的情况下,实际使用上也毫无问题——因为即使概念混淆,对真正使用也不会造成多少麻烦:)  CSS Selector Level 3 为了区分这两者的混淆,而特意用冒号加以区分:   伪类用一个冒号表示 :first-child   伪元素则使用两个冒号表示 ::first-line  并且规定,浏览器既要兼容CSS1和2里既存的伪元素的单冒号表示,同时又要不兼容CSS3新引入的伪元素的单冒号表示。后来的结果大家都知道,因为低版本IE对双冒号的兼容问题,几乎所有的CSSer在写样式的时候都不约而同的使用了单冒号。这无形中,让这种混淆延续了下来。而CSS3新伪元素的使用到目前为止,还远远不成气候。

伪类有::first-child ,:link:,vistited,:hover,:active,:focus,:lang 
伪元素有::first-line,:first-letter,:before,:after  

最后说说浏览器的支持情况
Chrome 2+,
Firefox 3.5+ (3.0 had partial support),
Safari 1.3+,
Opera 9.2+,
IE8+ (with some minor bugs),
几乎所有的移动浏览器。
唯一真正的问题是没有获得支持的(不用奇怪)IE6和IE7。所以,如果你的爱好者是在良好合适的web开发(或者其他具有较搞IE版本的市场),你可以继续自由地使用伪元素。
posted on 2014-10-17 15:09  示曲豆  阅读(852)  评论(0编辑  收藏  举报