CSS是对网页设计师可用的最强大的工具之一。使用它我们可以在几分钟内改变一个网站的界面,而不用改变页面的标签。但是尽管事实上,我们每个人也都意识到了它是有用的,CSS 选择器远未发挥它们的潜力,有的时候我们还趋向于使用过多的和无用的class、id、div、span等把我们的HTML搞的很凌乱。
避免让这些“瘟疫”在你的标签中传播并保持其简洁和语义化的最佳方式,就是使用更复杂的CSS选择器,它们可以定位于指定的元素而不用使用额外的class或id,而且通过这种方式也可以让我们的代码和样式更加灵活。
一、基本选择器
选择器 | 描述 | CSS版本 |
E | 标签选择器,匹配所有使用E标签的元素 | |
* | 通用元素选择器,匹配任何元素 | |
.info | class选择器,匹配所有class属性中包含info的元素 | |
#footer | id选择器,匹配所有id属性等于footer的元素 |
比如:
2
3 p { font-size:2em;}
4
5 .info { background:#ff0;}
6
7 p.info { background:#ff0;}
8
9 p.info.error { color:#900; font-weight:bold;}
10
11 p#info { background:#ff0;}
二、多元素的组合选择器
选择器 | 描述 | CSS版本 |
E,F | 多元素选择器,同时匹配所有E元素或F元素,E和F之间用逗号隔开 | |
E F | 后代元素选择器,匹配所有属于E元素后代的F元素,E和F之间用空格分隔 | |
E>F | 子元素选择器,匹配所有E元素的儿子元素F | |
E+F | 毗邻元素选择器,匹配所有紧随E元素之后的同级元素F | |
E~F | 匹配任何E标签之后的同级F标签 | 3 |
比如:
2 #nav,li { display:inline;}
3 #nav a { font-weight:bold;}
4 div>strong { color:#f00;}
5 p+p { color:#f00;}
6 p~ul { color:#f00;}
1、并列选择器(E,F,G,...)
这类选择器之间用逗号作分割,能匹配选择器列出的所有标签元素。
2、后代选择器(E F; E>F)
E F,标签之间用空格隔开,表示匹配E标签内所有F标签,所匹配的F标签不仅仅是E标签的儿子,还有可能是E标签的孙子,或者曾孙、从孙等等。
E>F标签匹配所有为E标签儿子的F标签。
3、兄弟选择器(E+F;E~F)
E~F选择其中F标签无需紧紧跟随E标签后面第一个,如果需要实现这样的一个功能可以用E+F选择器。对于IE浏览器来说只有IE6以上的版本才支持该选择器。
三、属性选择器
选择器 | 描述 | CSS版本 |
E[attribute] | 匹配所有具有attribute属性的E元素,不考虑它的值。(注意:E在此处可以省略,比如“[cheacked]”。以下同。) | 2.1 |
E[attribute=value] | 匹配所有attribute属性等于“value”的E元素 | 2.1 |
E[attribute~=value] | 匹配所有attribute属性具有多个空格分隔的值、其中一个值等于“value”的E元素 | 2.1 |
E[attribute|=value] | 匹配这类E元素,它具有attribute属性的就是“value”或者以“value”开始并立即跟上一个“-”字符,也就是“value-”,主要用于lang属性,比如“en”、“en-us”、“en-gb”等等 | 2.1 |
E[attribute^=value] | 匹配所有attribute属性值是以“value”开始的E元素 | 3 |
E[attribute*=value] | 匹配所有attribute属性值包含有“value”的E元素 | 3 |
E[attribute$=value] | 匹配所有attribute属性值是以"value"结束的E元素 | 3 |
比如:
2
3 div[class=error] { color:#f00;}
4
5 td[headers~=col1] { color:#f00;}
6
7 p[lang|=en] { color:#f00;}
8
9 blockquote[class=quote][cite] { color:#f00;}
10
11 div[id^="nav"] { background:#ff0;}
12
13 div[id$="nav"] { background:#ff0;}
14
15
16 a[href*=".jpg"] {
17 background: url(jpeg.gif) no-repeat left 50%;
18 padding: 2px 0 2px 20px;
19 }
20
四、伪类选择器
选择器 | 描述 | CSS版本 |
E:first-child | 匹配父元素的第一个子元素E | 2.1 |
E:link | 匹配所有未被点击的链接 | 2.1 |
E:visited | 匹配所有已被点击的链接 | 2.1 |
E:active | 匹配鼠标已经其上按下、还没有释放的E元素 | 2.1 |
E:hover | 匹配鼠标悬停其上的E元素 | 2.1 |
E:focus | 匹配获得当前焦点的E元素 | 2.1 |
E:lang(c) | 匹配lang属性等于c的E元素 | 2.1 |
E:enabled | 匹配表单中激活的元素 | 3 |
E:disabled | 匹配表单中禁用的元素 | 3 |
E:checked | 匹配表单中被选中的radio或者checkbox元素 | 3 |
E::selection | 匹配用户当前选中的元素 | 3 |
E:root | 匹配文档的根元素,对于HTML文档,就是HTML元素 | 3 |
E:nth-child(n) | 匹配其父元素的第n个子元素,n从1开始计算 | 3 |
E:nth-last-child(n) | 匹配其父元素的倒数第n个子元素,第一个编号为1 | 3 |
E:nth-of-type(n) | 与:nth-child(n)作用类似,用作匹配使用同种标签的第n个元素 | 3 |
E:nth-last-of-type | 与:nth-last-child作用类似,用作匹配同种标签的最后一个元素 | 3 |
E:last-child | 匹配父元素的最后一个子元素,等同于E:nth-last-child(1) | 3 |
E:first-of-type | 匹配父元素下使用同种标签的第一个元素,等同于E:nth-of-type(1) | 3 |
E:last-of-type | 匹配父元素下使用同种标签的最后一个元素,等同于E:nth-last-of-type(1) | 3 |
E:only-child | 匹配父元素下仅有的一个子元素,等同于E:first-child:last-child或者E:nth-child(1):nth-last-child(1) | 3 |
E:only-of-type | 匹配父元素下使用相同标签的唯一一个子元素,等同于E:first-of-type:last-of-type或者E:nth-of-type(1):nth-last-of-type(1) | 3 |
E:empty | 匹配一个不包含任何子元素的元素,注意,文本节点也被看作子元素 | 3 |
E:not(s) | 匹配不符合当前选择器的任何E标签元素 | 3 |
E:target | 匹配文档中特定“id”点击后的效果 | 3 |
1、E:first-child
您可以使用 :first-child 伪类来选择元素的第一个子元素。这个特定伪类很容易遭到误解,所以有必要举例来说明。在下面的例子中,选择器匹配作为任何元素的第一个子元素的 p 元素(也就是第11行的p,不是strong元素):
1 <html>
2 <head>
3 <style type="text/css">
4 p:first-child
5 {
6 color: red;
7 }
8 </style>
9 </head>
10 <body>
11 <p>123123<strong>some text</strong></p>
12 <p>some text</p>
13 </body>
14 </html>
最常见的错误是认为 p:first-child 之类的选择器会选择 p 元素的第一个子元素。对于IE浏览器,必须声明 <!DOCTYPE>,这样 :first-child 才能在 IE6+ 中生效。还有一个问题就是,有时候会创建一个aspx文件,如下:
2
3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4
5 <html xmlns="http://www.w3.org/1999/xhtml">
6 <head runat="server">
7 <title></title>
8 <style type="text/css">
9 p:first-child
10 {
11 background-color:Red;
12 }
13 </style>
14 </head>
15 <body>
16 <form id="form1" runat="server">
17 <p>
18 123123123123123123
19 </p>
20 </form>
21 </body>
22 </html>
3、:before和:after伪元素
before 伪元素可用于在某个元素之前插入某些内容。after 伪类可用于在某个元素之后插入某些内容。这两个伪元素常常只使用content属性,来添加一些短语或排版元素。
2 {
3 content: "Before P";
4 }
5 p:after
6 {
7 content: "After P.";
8 }
2 <html>
3 <head>
4 <style type="text/css">
5 body {counter-reset:section;}
6 h1 {counter-reset:subsection;}
7 h1:before
8 {
9 counter-increment:section;
10 content:"Section " counter(section) ". ";
11 }
12 h2:before
13 {
14 counter-increment:subsection;
15 content:counter(section) "." counter(subsection) " ";
16 }
17 </style>
18 </head>
19
20 <body>
21
22 <p><b>注释:</b>如果已规定 !DOCTYPE,那么 Internet Explorer 8 (以及更高版本)支持 counter-increment 属性。</p>
23
24 <h1>HTML tutorials</h1>
25 <h2>HTML Tutorial</h2>
26 <h2>XHTML Tutorial</h2>
27 <h2>CSS Tutorial</h2>
28
29 <h1>Scripting tutorials</h1>
30 <h2>JavaScript</h2>
31 <h2>VBScript</h2>
32
33 <h1>XML tutorials</h1>
34 <h2>XML</h2>
35 <h2>XSL</h2>
36
37 </body>
38 </html>
39