- Published on
你必须记住的30个CSS选择器[译]
- Authors
- Name
- Pursue
开篇
有 30 个 CSS 选择器你必须烂熟于心,它们适应于当今各大主流浏览器。
*
1.* {
margin: 0;
padding: 0;
}
*
选择器选择的是每一个单一元素。很多程序员用上面的 CSS 将所有元素的 margin 和 padding 清零。虽然这是有效的,但最好还是别这么做,这会使得浏览器的负担很重。
*
选择器也可以用在孩子选择器中。
#container * {
border: 1px solid black;
}
这会使#container 所有孩子都有 border,但还是那句话,如果不是必须得这么做,还是别用星选择器。
Compatibility
- IE6+
- Firefox
- Chrome
- Safari
- Opera
#x
2.#container {
width: 960px;
margin: auto;
}
id 选择器的优先级很高,因此在用之前问问自己:我仅仅是为了找到这个元素而去给他加id的吗?
Compatibility
- IE6+
- Firefox
- Chrome
- Safari
- Opera
.x
3..error {
color: red;
}
class 选择器和 id 选择器不同,首先优先级没有 id 高,再者 id 选择器只能选择一个,而 class 选择器则可以筛选出来一组。
Compatibility
- IE6+
- Firefox
- Chrome
- Safari
- Opera
x y
4.li a {
text-decoration: none;
}
当不是选择所有后代时,后代选择器将会非常有用,但有一点得注意: 如果你的选择器是x y z a b.error, 那你就用错了。你得问问自己是否需要应用每一层?
Compatibility
- IE6+
- Firefox
- Chrome
- Safari
- Opera
x
5.a {
color: red;
}
ul {
margin-left: 0;
}
如果想选择同一类元素,那就不要用 id 或 class 了,直接用元素选择器。
Compatibility
- IE6+
- Firefox
- Chrome
- Safari
- Opera
x:visted and x:link
6.a:link {
color: red;
}
a:visted {
color: purple;
}
我们常常用伪类:link 筛选 a 标签是还未被点击;而用:visited 去筛选哪些别点击过了。
Compatibility
- IE7+
- Firefox
- Chrome
- Safari
- Opera
x + y
7.ul + p {
color: red;
}
相邻选择器会选择第一个相邻的元素,如上面的例子会让 ul 后第一个段落的字体变为红色(而 ul 与 p 之间是不能有其他元素的)。
Compatibility
- IE7+
- Firefox
- Chrome
- Safari
- Opera
x > y
8.div#container > ul {
border: 1px solid black;
}
这也是一种后代选择器,但它与x y
这种后代选择器不同,它只能选择直系后代。如:
<div id="container">
<ul>
<li>
List Item
<ul>
<li>Child</li>
</ul>
</li>
<li>List Item</li>
<li>List Item</li>
<li>List Item</li>
</ul>
</div>
在这个例子中,#cotainer > ul
只会选择第一个 ul,而不会 search 到 ul 里面那个包含 li 的 ul。
Compatibility
- IE7+
- Firefox
- Chrome
- Safari
- Opera
x ~ y
9.ul ~ p {
color: red;
}
这种兄弟选择器与x + y
类似,但不同的是,后者只能筛选第一个 p,而这种却可以满足 ul 下所有的直系 p 标签。
Compatibility
- IE7+
- Firefox
- Chrome
- Safari
- Opera
x[title]
10.a[title] {
color: green;
}
属性选择器。这将选择所有具有 title 属性的 a 标签。
Compatibility
- IE7+
- Firefox
- Chrome
- Safari
- Opera
x[href="foo"]
11.a[href="http://net.tutsplus.com"]
{
color: #1f6053; /* nettuts green */
}
这个选择器可以选择链接为href="http://net.tutsplus.com"
的 a 标签,可如果这个里这个链接变了呢?,这未免有些严格,可以适当的用正则表达式去匹配。
Compatibility
- IE7+
- Firefox
- Chrome
- Safari
- Opera
x[href*="nettuts"]
12.a[href*='tuts'] {
color: #1f6053; /* nettuts green */
}
'*'号将匹配 href 中含有 nuttuts 字符,如果想更加严格,还可以用^
和$
表示开始和结束。
Compatibility
- IE7+
- Firefox
- Chrome
- Safari
- Opera
x[href^="http"]
13.a[href^='http'] {
background: url(path/to/external/icon.png) no-repeat;
padding-left: 10px;
}
这样去筛选具有有效 href 的 a 将匹配 http://和 https://.
Compatibility
- IE7+
- Firefox
- Chrome
- Safari
- Opera
x[href$=".jpg"]
14.a[href$='.jpg'] {
color: red;
}
这将会选择链接为 jpg 格式的图片链接,可是如果图片类型为 png 或 gif 等怎么办?
Compatibility
- IE7+
- Firefox
- Chrome
- Safari
- Opera
x[data-*="foo"]
15.a[data-filetype='image'] {
color: red;
}
按照规则14.
我们可能得:
a[href$='.jpg'],
a[href$='.jpeg'],
a[href$='.png'],
a[href$='.gif'] {
color: red;
}
可这也太。。。 我们可以加一个属性用以标示。
<a href="path/to/image.jpg" data-filetype="image"> Image Link </a>
a[data-filetype='image'] {
color: red;
}
Compatibility
- IE7+
- Firefox
- Chrome
- Safari
- Opera
x[foo~="bar"]
16.a[data-info~='external'] {
color: red;
}
a[data-info~='image'] {
border: 1px solid black;
}
~
将会让我们匹配到属性值被空格分隔符分开的值,如:
"<a href="path/to/image.jpg" data-info="external image"> Click Me, Fool </a>
Compatibility
- IE7+
- Firefox
- Chrome
- Safari
- Opera
x:checked
17.input[type='radio']:checked {
border: 1px solid black;
}
这个常常对 checkbox 非常有用。
Compatibility
- IE9+
- Firefox
- Chrome
- Safari
- Opera
x:after
18.伪类before
和after
已经有了一些新的用法,比如最常见的:
.clearfix:after {
content: '';
display: block;
clear: both;
visibility: hidden;
font-size: 0;
height: 0;
}
.clearfix {
*display: inline-block;
_height: 1%;
}
没错,这就是默认标准 clearfix 的实现原理。
Compatibility
- IE8+
- Firefox
- Chrome
- Safari
- Opera
x:hover
19.div:hover {
background: #e3e3e3;
}
但是得注意,:hover
在早期 IE 中并不适用。
Compatibility
- IE6+(In IE6, :hover must be applied to an anchor element)
- Firefox
- Chrome
- Safari
- Opera
x:not(selector)
20.div:not(#container) {
color: blue;
}
反选选择器。
Compatibility
- IE9+
- Firefox
- Chrome
- Safari
- Opera
x::pseudoElement
21.p::first-line {
font-weight: bold;
font-size: 1.2em;
}
p::first-letter {
float: left;
font-size: 2em;
font-weight: bold;
font-family: cursive;
padding-right: 2px;
}
伪元素选择器,注意尽量还是按标准来,多使用::
而不是:
。
Compatibility
- IE6+
- Firefox
- Chrome
- Safari
- Opera
x:nth-child(n)
22.li:nth-child(3) {
color: red;
}
选择一组中特定的孩子。n 表示第几个,也可以是表达式,如 2n+1,2n.
Compatibility
- IE9+
- Firefox 3.5+
- Chrome
- Safari
- Opera
x:nth-last-child(n)
23.li:nth-last-child(2) {
color: red;
}
如果 li 有 400 个,而你需要 target 到第 397 个,那用这个咱合适不过了。
Compatibility
- IE9+
- Firefox 3.5+
- Chrome
- Safari
- Opera
x:nth-of-type(n)
24.ul:nth-of-type(3) {
border: 1px solid black;
}
如果 ul 没有 id,而你又要找第三个 ul,那个这种方式是不错。
Compatibility
- IE9+
- Firefox 3.5+
- Chrome
- Safari
- Opera
x:nth-last-of-type(n)
25.ul:nth-last-of-type(3) {
border: 1px solid black;
}
与ul:nth-of-type
刚好相反。
Compatibility
- IE9+
- Firefox 3.5+
- Chrome
- Safari
- Opera
x:first-child
26.ul li:first-child {
border-top: none;
}
Compatibility
- IE7+
- Firefox
- Chrome
- Safari
- Opera
x:last-child
27.Example
<ul>
<li>List Item</li>
<li>List Item</li>
<li>List Item</li>
</ul>
ul {
width: 200px;
background: #292929;
color: white;
list-style: none;
padding-left: 0;
}
li {
padding: 10px;
border-bottom: 1px solid black;
border-top: 1px solid #3c3c3c;
}
但是我不想要第一个的上边框和最后一个的下边框,可以这么做:
li:first-child {
border-top: none;
}
li:last-child {
border-bottom: none;
}
Compatibility
- IE9+
- Firefox
- Chrome
- Safari
- Opera
X:only-child
28.div p:only-child {
color: red;
}
这将匹配 div 里只有一个 p 的元素。如:
<div><p> My paragraph here. </p></div>
<div>
<p> Two paragraphs total. </p>
<p> Two paragraphs total. </p>
</div>
Compatibility
- IE9+
- Firefox
- Chrome
- Safari
- Opera
X:only-of-type
29.li:only-of-type {
font-weight: bold;
}
这将匹配元素内只有一个 li 的元素,有时这个做法很简便。比如要寻找只有一个列表的 ul,可以:
ul > li:only-of-type {
font-weight: bold;
}
Compatibility
- IE9+
- Firefox 3.5+
- Chrome
- Safari
- Opera
x:first-of-type
30.Example
<div>
<p>My paragraph here.</p>
<ul>
<li>List Item 1</li>
<li>List Item 2</li>
</ul>
<ul>
<li>List Item 3</li>
<li>List Item 4</li>
</ul>
</div>
如何寻找上面的 "List Item 2"呢?
办法 1
ul:first-of-type > li:nth-child(2) { font-weight: bold; }
办法 2
p + ul li:last-child { font-weight: bold; }
办法 3
ul:first-of-type li:nth-last-child(1) { font-weight: bold; }
Compatibility
- IE9+
- Firefox 3.5+
- Chrome
- Safari
- Opera
总结
上述选择器在 IE6 中的使用要尤其小心,但是别因为这而影响你阅读这篇文章。你可以参考一下浏览器兼容表,或者你可以用 Dean Edward's excellent IE9.js script 为旧版浏览器提供这些选择器的支持。
另外,当你在使用一些 Javascript 库时,如 jQuery,请尽量的使用这些原生的 CSS3 选择器,因为浏览器选择器引擎将会按照浏览器的原生方式去解析,这将使得你的代码更加高效。
注:此文为译文
原文请戳