天天看点

你必须记住的30个CSS选择器[译]

开篇

有30个CSS选择器你必须烂熟于心,它们适应于当今各大主流浏览器。

1.

*

* {
  margin: ;
  padding: ;
}
           

*

选择器选择的是每一个单一元素。很多程序员用上面的CSS将所有元素的margin和padding清零。虽然这是有效的,但最好还是别这么做,这会使得浏览器的负担很重。

*

选择器也可以用在孩子选择器中。

#container * {
  border: px solid black;
}
           

这会使

#container

所有孩子都有border,但还是那句话,如果不是必须得这么做,还是别用星选择器。

view demo

Compatibility

  • IE6+
  • Firefox
  • Chrome
  • Safari
  • Opera

2.

#x

#container {
   width: px;
   margin: auto;
}
           

id选择器的优先级很高,因此在用之前问问自己:

我仅仅是为了找到这个元素而去给他加id的吗?

view demo

Compatibility

  • IE6+
  • Firefox
  • Chrome
  • Safari
  • Opera

3.

.x

.error {
  color: red;
}
           

class选择器和id选择器不同,首先优先级没有id高,再者id选择器只能选择一个,而class选择器则可以筛选出来一组。

view demo

Compatibility

  • IE6+
  • Firefox
  • Chrome
  • Safari
  • Opera

4.

x y

li a {
  text-decoration: none;
}
           

当不是选择所有后代时,后代选择器将会非常有用,但有一点得注意:

如果你的选择器是x y z a b.error, 那你就用错了。你得问问自己是否需要应用每一层?

view demo

Compatibility

  • IE6+
  • Firefox
  • Chrome
  • Safari
  • Opera

5.

x

a { color: red; }
ul { margin-left: ; }
           

如果想选择同一类元素,那就不要用id或class了,直接用元素选择器。

view demo

Compatibility

  • IE6+
  • Firefox
  • Chrome
  • Safari
  • Opera

6.

x:visted and x:link

a:link { color: red; }
a:visted { color: purple; }
           

我们常常用伪类:link筛选a标签是还未被点击;而用:visited去筛选哪些别点击过了。

view demo

Compatibility

  • IE7+
  • Firefox
  • Chrome
  • Safari
  • Opera

7.

x + y

ul + p {
   color: red;
}
           

相邻选择器会选择第一个相邻的元素,如上面的例子会让ul后第一个段落的字体变为红色(而ul与p之间是不能有其他元素的)。

view demo

Compatibility

  • IE7+
  • Firefox
  • Chrome
  • Safari
  • Opera

8.

x > y

div#container > ul {
  border: px 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。

view demo

Compatibility

  • IE7+
  • Firefox
  • Chrome
  • Safari
  • Opera

9.

x ~ y

ul ~ p {
   color: red;
}
           

这种兄弟选择器与

x + y

类似,但不同的是,后者只能筛选第一个p,而这种却可以满足ul下所有的直系p标签。

view demo

Compatibility

  • IE7+
  • Firefox
  • Chrome
  • Safari
  • Opera

10.

x[title]

a[title] {
   color: green;
}
           

属性选择器。这将选择所有具有title属性的a标签。

view demo

Compatibility

  • IE7+
  • Firefox
  • Chrome
  • Safari
  • Opera

11.

x[href="foo" target="_blank" rel="external nofollow" ]

a[href="http://net.tutsplus.com" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" ] {
  color: #1f6053; /* nettuts green */
}
           

这个选择器可以选择链接为

href="http://net.tutsplus.com" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow"

的a标签,可如果这个里这个链接变了呢?,这未免有些严格,可以适当的用正则表达式去匹配。

view demo

Compatibility

  • IE7+
  • Firefox
  • Chrome
  • Safari
  • Opera

12.

x[href*="nettuts"]

a[href*="tuts"] {
  color: #1f6053; /* nettuts green */
}
           

‘*’号将匹配href中含有nuttuts字符,如果想更加严格,还可以用

^

$

表示开始和结束。

view demo

Compatibility

  • IE7+
  • Firefox
  • Chrome
  • Safari
  • Opera

13.

x[href^="http"]

a[href^="http"] {
   background: url(path/to/external/icon.png) no-repeat;
   padding-left: px;
}
           

这样去筛选具有有效href的a将匹配http://和https://.

view demo

Compatibility

  • IE7+
  • Firefox
  • Chrome
  • Safari
  • Opera

14.

x[href$=".jpg"]

a[href$=".jpg"] {
   color: red;
}
           

这将会选择链接为jpg格式的图片链接,可是如果图片类型为png或gif等怎么办?

view demo

Compatibility

  • IE7+
  • Firefox
  • Chrome
  • Safari
  • Opera

15.

x[data-*="foo"]

a[data-filetype="image"] {
   color: red;
}
           

按照规则

14.

我们可能得:

a[href$=".jpg"],
a[href$=".jpeg"],
a[href$=".png"],
a[href$=".gif"] {
   color: red;
}
           

可这也太。。。

我们可以加一个属性用以标示。

a[data-filetype="image"] {
   color: red;
}
           

view demo

Compatibility

  • IE7+
  • Firefox
  • Chrome
  • Safari
  • Opera

16.

x[foo~="bar"]

a[data-info~="external"] {
   color: red;
}

a[data-info~="image"] {
   border: px solid black;
}
           

~

将会让我们匹配到属性值被空格分隔符分开的值,如:

view demo

Compatibility

  • IE7+
  • Firefox
  • Chrome
  • Safari
  • Opera

17.

x:checked

input[type=radio]:checked {
   border: px solid black;
}
           

这个常常对checkbox非常有用。

view demo

Compatibility

  • IE9+
  • Firefox
  • Chrome
  • Safari
  • Opera

18.

x:after

伪类

before

after

已经有了一些新的用法,比如最常见的:

.clearfix:after {
    content: "";
    display: block;
    clear: both;
    visibility: hidden;
    font-size: ;
    height: ;
    }

.clearfix { 
   *display: inline-block; 
   _height: %;
}
           

没错,这就是默认标准clearfix的实现原理。

Compatibility

  • IE8+
  • Firefox
  • Chrome
  • Safari
  • Opera

19.

x:hover

div:hover {
  background: #e3e3e3;
}
           

但是得注意,

:hover

在早期IE中并不适用。

Compatibility

  • IE6+(In IE6, :hover must be applied to an anchor element)
  • Firefox
  • Chrome
  • Safari
  • Opera

20.

x:not(selector)

div:not(#container) {
   color: blue;
}
           

反选选择器。

view demo

Compatibility

  • IE9+
  • Firefox
  • Chrome
  • Safari
  • Opera

21.

x::pseudoElement

p::first-line {
   font-weight: bold;
   font-size: em;
}

p::first-letter {
   float: left;
   font-size: em;
   font-weight: bold;
   font-family: cursive;
   padding-right: px;
}
           

伪元素选择器,注意尽量还是按标准来,多使用

::

而不是

:

view demo

Compatibility

  • IE6+
  • Firefox
  • Chrome
  • Safari
  • Opera

22.

x:nth-child(n)

li:nth-child(3) {
   color: red;
}
           

选择一组中特定的孩子。n表示第几个,也可以是表达式,如2n+1,2n.

view demo

Compatibility

  • IE9+
  • Firefox 3.5+
  • Chrome
  • Safari
  • Opera

23.

x:nth-last-child(n)

li:nth-last-child(2) {
   color: red;
}
           

如果li有400个,而你需要target到第397个,那用这个咱合适不过了。

view demo

Compatibility

  • IE9+
  • Firefox 3.5+
  • Chrome
  • Safari
  • Opera

24.

x:nth-of-type(n)

ul:nth-of-type(3) {
   border: px solid black;
}
           

如果ul没有id,而你又要找第三个ul,那个这种方式是不错。

view demo

Compatibility

  • IE9+
  • Firefox 3.5+
  • Chrome
  • Safari
  • Opera

25.

x:nth-last-of-type(n)

ul:nth-last-of-type(3) {
   border: px solid black;
}
           

ul:nth-of-type

刚好相反。

Compatibility

  • IE9+
  • Firefox 3.5+
  • Chrome
  • Safari
  • Opera

26.

x:first-child

ul li:first-child {
   border-top: none;
}
           

view demo

Compatibility

  • IE7+
  • Firefox
  • Chrome
  • Safari
  • Opera

27.

x:last-child

Example
<ul>
   <li> List Item </li>
   <li> List Item </li>
   <li> List Item </li>
</ul>
           
ul {
 width: px;
 background: #292929;
 color: white;
 list-style: none;
 padding-left: ;
}

li {
 padding: px;
 border-bottom: px solid black;
 border-top: px solid #3c3c3c;
}
           
你必须记住的30个CSS选择器[译]

view demo

但是我不想要第一个的上边框和最后一个的下边框,可以这么做:

li:first-child {
    border-top: none;
}

li:last-child {
   border-bottom: none;
}
           

view demo

Compatibility

  • IE9+
  • Firefox
  • Chrome
  • Safari
  • Opera

28.

X:only-child

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>
           

view demo

Compatibility

  • IE9+
  • Firefox
  • Chrome
  • Safari
  • Opera

29.

X:only-of-type

li:only-of-type {
   font-weight: bold;
}
           

这将匹配元素内只有一个li的元素,有时这个做法很简便。比如要寻找只有一个列表的ul,可以:

ul > li:only-of-type {
   font-weight: bold;
}
           

view demo

Compatibility

  • IE9+
  • Firefox 3.5+
  • Chrome
  • Safari
  • Opera

30.

x:first-of-type

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;   
}
           

view demo

Compatibility

  • IE9+
  • Firefox 3.5+
  • Chrome
  • Safari
  • Opera

总结

上述选择器在IE6中的使用要尤其小心,但是别因为这而影响你阅读这篇文章。你可以参考一下浏览器兼容表,或者你可以用 Dean Edward’s excellent IE9.js script 为旧版浏览器提供这些选择器的支持。

另外,当你在使用一些Javascript库时,如jQuery,请尽量的使用这些原生的CSS3选择器,因为浏览器选择器引擎将会按照浏览器的原生方式去解析,这将使得你的代码更加高效。

注:此文为译文

我的博客请戳 | 原文请戳