아마 모든 사람들이 id, class,descdent 선택자에 대해 알고 있고 모두 사용하고 있으므로 유연성이 더 높은 방법을 선택하는 실수를 범하고 있는 것입니다. 이 글에서 언급된 대부분의 선택기는 CSS3 표준을 따르므로 해당 브라우저의 최신 버전에서만 적용됩니다.
1. *
* { margin: 0; padding: 0; }
고급 선택자를 살펴보기 전에 잘 알려진 Clear 선택자에 대해 알아두어야 합니다. 별표는 페이지의 모든 요소를 선택합니다. 많은 개발자가 여백과 패딩을 지우는 데 이를 사용합니다. 물론 연습할 때 사용해도 되지만 프로덕션 환경에서는 사용하지 않는 것이 좋습니다. 브라우저에 불필요한 내용을 많이 추가합니다.
*는 요소의 모든 하위 요소를 선택하는 데에도 사용할 수 있습니다.
#container * { border: 1px solid black; }
#container 아래의 모든 요소가 선택됩니다. 물론 가능하다면 사용을 권장하지 않습니다.
데모
호환성
IE6+
Firefox
Chrome
Safari
Opera
2.#X
#container { width: 960px; margin: auto; }
ID로 요소를 찾으려면 선택기에서 #을 사용하세요. 다들 보통 이런 식으로 사용하는데, 그래도 사용할 때는 매우 조심해야 합니다.
스스로에게 물어보세요. 요소를 찾으려면 이 요소에 ID를 할당해야 합니까?
ID 선택자는 매우 엄격하여 재사용할 수 없습니다. 가능하다면 태그 이름을 먼저 사용해 보고, HTML5의 새 요소나 의사 클래스를 사용해 보세요.
데모
호환성
IE6+
Firefox
Chrome
Safari
Opera
3. 여러 요소를 대상으로 할 수 있다는 점에서 id 선택기와 다릅니다. 여러 요소의 스타일을 지정하려는 경우 클래스를 사용할 수 있습니다. 특정 요소를 수정하려면 ID를 사용하여 해당 요소를 찾으세요.
데모
호환성
.error { color: red; }
Firefox
Chrome
Safari
Opera
4. 요소 찾기에 대해 더 구체적으로 알고 싶다면 이 방법을 사용할 수 있습니다. 예를 들어, 모든 a 요소를 찾을 필요는 없고 li 태그 아래에 a 태그만 찾을 필요가 있다면 어떻게 될까요? 이때 하위 항목 선택기를 사용해야 합니다.전문가 팁: 선택기가 X Y Z A B.error처럼 보이면 잘못하고 있는 것입니다. 정말 많은 요소를 수정해야 하는지 항상 스스로에게 상기시키세요.
데모
호환성
IE6+Firefox
li a { text-decoration: none; }
Safari
Opera5.X
또는 간단하고 유형 선택기를 직접 사용하는 'class'입니다.데모
호환성
IE6+Firefox
Chrome
a { color: red; } ul { margin-left: 0; }
오페라
6.X:방문 및 과거 링크.또한 우리는 Visited를 사용하여 방문한 모든 링크를 찾습니다.
데모
호환성
IE7+
Firefox
Chrome
SafariOpera
a:link {color:red;} a:visited {color: purple;}
7. 지정된 요소의 바로 후속 요소 선택을 지시합니다. 위의 예에서는 모든 ul 태그 뒤의 첫 번째 단락을 선택하고 색상을 빨간색으로 설정합니다. 데모
호환성
IE7+
Firefox
Chrome
Safari
Opera
8. X>Y
div#container > ul { border: 1px solid black; }
X Y和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>
#container > ul只会选中id为’container’的div下的所有直接ul元素。它不会定位到如第一个li下的ul元素。
由于某些原因,使用子节点组合选择器会在性能上有许多的优势。事实上,当在javascript中使用css选择器时候是强烈建议这么做的。
DEMO
兼容性
IE7+
Firefox
Chrome
Safari
Opera
9. X ~ Y
ul ~ p { color: red; }
兄弟节点组合选择器跟X+Y很相似,然后它又不是那么的严格。ul + p选择器只会选择紧挨跟着指定元素的那些元素。而这个选择器,会选择跟在目标元素后面的所有匹配的元素。
DEMO
兼容性
IE7+
Firefox
Chrome
Safari
Opera
10. X[title]
a[title] { color: green; }
这个叫属性选择器,上面的这个例子中,只会选择有title属性的元素。那些没有此属性的锚点标签将不会被这个代码修饰。那再想想如果你想更加具体的去筛选?那…
DEMO
兼容性
IE7+
Firefox
Chrome
Safari
Opera
11. X[href="foo"]
a[href="http://strongme.cn"] { color: #1f6053; /* nettuts green */ }
上面这片代码将会把href属性值为http://strongme.cn的锚点标签设置为绿色,而其他标签则不受影响。
注意我们将值用双引号括起来了。那么在使用Javascript的时候也要使用双引号括起来。可以的话,尽量使用标准的CSS3选择器。
这样可以用了,但是还是有点死,如果不是这个链接,而是类似的链接,那么这时就得用正则表达式了。
DEMO
兼容性
IE7+
Firefox
Chrome
Safari
Opera
12. X[href*="strongme"]
a[href*="strongme"] { color: #1f6053; }
Tada,正是我们需要的,这样,就指定了strongme这个值必须出现在锚点标签的href属性中,不管是strongme.cn还是strongme.com还是www.strongme.cn都可以被选中。
但是记得这是个很宽泛的表达方式。如果锚点标签指向的不是strongme相关的站点,如果要更加具体的限制的话,那就使用^和$,分别表示字符串的开始和结束。
DEMO
兼容性
IE7+
Firefox
Chrome
Safari
Opera
13. X[href^="href"]
a[href^="http"] { background: url(path/to/external/icon.png) no-repeat; padding-left: 10px; }
大家肯定好奇过,有些站点的锚点标签旁边会有一个外链图标,我也相信大家肯定见过这种情况。这样的设计会很明确的告诉你会跳转到别的网站。
用克拉符号就可以轻易做到。它通常使用在正则表达式中标识开头。如果我们想定位锚点属性href中以http开头的标签,那我们就可以用与上面相似的代码。
注意我们没有搜索http://,那是没必要的,因为它都不包含https://。
那如果我们想找到所有指向一张图片的锚点标签呢?那我们来使用下&字符。
DEMO
兼容性
IE7+
Firefox
Chrome
Safari
Opera
14. X[href$=".jpg"]
a[href$=".jpg"] { color: red; }
这次我们又使用了正则表达式$,表示字符串的结尾处。这段代码的意思就是去搜索所有的图片链接,或者其它链接是以.jpg结尾的。但是记住这种写法是不会对gifs和pngs起作用的。
DEMO
兼容性
IE7+
Firefox
Chrome
Safari
Opera
15. X[data-*="foo"]
a[data-filetype="image"] { color: red; }
在回到第8条,我们如何把所有的图片类型都选中呢png,jpeg,’jpg’,’gif’?我们可以使用多选择器。看下面:
a[href$=".jpg"], a[href$=".jpeg"], a[href$=".png"], a[href$=".gif"] { color: red; }
但是这样写着很蛋疼啊,而且效率会很低。另外一个办法就是使用自定义属性。我们可以给每个锚点加个属性data-filetype指定这个链接指向的图片类型。
<a href="path/to/image.jpg" data-filetype="image"> Image Link </a>
那有了这个钩子,我们就可以去用标准的办法只去选定文件类型为image的锚点了。
a[data-filetype="image"] { color: red; }
DEMO
兼容性
IE7+
Firefox
Chrome
Safari
Opera
16. X[foo~="bar"]
a[data-info~="external"] { color: red; } a[data-info~="image"] { border: 1px solid black; }
这个我想会让你的小伙伴惊呼妙极了。很少有人知道这个技巧。这个~符号可以定位那些某属性值是空格分隔多值的标签。
继续使用第15条那个例子,我们可以设置一个data-info属性,它可以用来设置任何我们需要的空格分隔的值。这个例子我们将指示它们为外部连接和图片链接。
<a href="path/to/image.jpg" data-info="external image"> Click Me, Fool </a>
给这些元素设置了这个标志之后,我们就可以使用~来定位这些标签了。
/* Target data-info attr that contains the value "external" */ a[data-info~="external"] { color: red; } /* And which contain the value "image" */ a[data-info~="image"] { border: 1px solid black; }
17. X:checked
input[type=radio]:checked { border: 1px solid black; }
上面这个伪类写法可以定位那些被选中的单选框和多选框,就是这么简单。
DEMO
兼容性
IE9+
Firefox
Chrome
Safari
Opera
18. X:after
before和after这俩伪类。好像每天大家都能找到使用它们的创造性方法。它们会在被选中的标签周围生成一些内容。
当使用.clear-fix技巧时许多属性都是第一次被使用到里面的。
.clearfix:after { content: ""; display: block; clear: both; visibility: hidden; font-size: 0; height: 0; } .clearfix { *display: inline-block; _height: 1%; }
上面这段代码会在目标标签后面补上一段空白,然后将它清除。这个方法你一定得放你的聚宝盆里面。特别是当overflow:hidden方法不顶用的时候,这招就特别管用了。
还想看其他创造性的使用这个伪类,看这里。
根据CSS3标准规定,可以使用两个冒号`::`。然后为了兼容性,浏览器也会接受一个双引号的写法。其实在这个情况下,用一个冒号还是比较明智的。
兼容性
IE8+
Firefox
Chrome
Safari
Opera
19. X::hover
div:hover { background: #e3e3e3; }
不用说,大家肯定知道它。官方的说法是user action pseudo class.听起来有点儿迷糊,其实还好。如果想在用户鼠标飘过的地方涂点儿彩,那这个伪类写法可以办到。
注意旧版本的IE只会对加在锚点`a`标签上的`:hover`伪类起作用。
通常大家在鼠标飘过锚点链接时候加下边框的时候用到它。
a:hover { border-bottom: 1px solid black; }
专家提示:border-bottom:1px solid black;比text-decoration:underline;要好看很多。
兼容性
IE6+(IE6只能在锚点标签上起作用)
Firefox
Chrome
Safari
Opera
20. X:not(selector)
div:not(#container) { color: blue; }
取反伪类是相当有用的,假设我们要把除id为container之外的所有div标签都选中。那上面那么代码就可以做到。
或者说我想选中所有出段落标签之外的所有标签。
*:not(p) { color: green; }
DEMO
兼容性
IE9+
Firefox
Chrome
Safari
Opera
21. X::pseudoElement
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; }
上面这段代码会找到页面上所有段落,并且指定为每一段的第一个字。
它通常在一些新闻报刊内容的重点突出会使用到。
定位某段的第一行
p::first-line { font-weight: bold; font-size: 1.2em; }
跟::first-line相似,会选中段落的第一行 。
为了兼容性,之前旧版浏览器也会兼容单冒号的写法,例如:first-line,:first-letter,:before,:after.但是这个兼容对新介绍的特性不起作用。
DEMO
兼容性
IE6+
Firefox
Chrome
Safari
Opera
22. X:nth-child(n)
li:nth-child(3) { color: red; }
还记得我们面对如何取到推跌式标签的第几个元素是无处下手的时光么,有了nth-child那日子就一去不复返了。
请注意nth-child接受一个整形参数,然后它不是从0开始的。如果你想获取第二个元素那么你传的值就是li:nth-child(2).
我们甚至可以获取到由变量名定义的个数个子标签。例如我们可以用li:nth-child(4n)去每隔3个元素获取一次标签。
DEMO
兼容性
IE9+
Firefox3.5+
Chrome
Safari
23. X:nth-last-child(n)
li:nth-last-child(2) { color: red; }
假设你在一个ul标签中有N多的元素,而你只想获取最后三个元素,甚至是这样li:nth-child(397),你可以用nth-last-child伪类去代替它。
这个技巧可以很正确的代替第16个TIP,不同的就是它是从结尾处开始的,倒回去的。
DEMO
兼容性
IE9+
Firefox3.5+
Chrome
Safari
Opera
24. X:nth-of-type(n)
ul:nth-of-type(3) { border: 1px solid black; }
曾几何时,我们不想去选择子节点,而是想根据元素的类型来进行选择。
想象一下有5个ul标签。如果你只想对其中的第三个进行修饰,而且你也不想使用id属性,那你就可以使用nth-of-type(n)伪类来实现了,上面的那个代码,只有第三个ul标签会被设置边框。
DEMO
兼容性
IE9+
Firefox3.5+
Chrome
Safari
25. X:nth-last-of-type(n)
ul:nth-last-of-type(3) { border: 1px solid black; }
同样,也可以类似的使用nth-last-of-type来倒序的获取标签。
兼容性
IE9+
Firefox3.5+
Chrome
Safari
Opera
26. X:first-child
ul li:first-child { border-top: none; }
这个结构性的伪类可以选择到第一个子标签,你会经常使用它来取出第一个和最后一个的边框。
假设有个列表,没个标签都有上下边框,那么效果就是第一个和最后一个就会看起来有点奇怪。这时候就可以使用这个伪类来处理这种情况了。
DEMO
兼容性
IE7+
Firefox
Chrome
Safari
Opera
27. X:last-child
ul > li:last-child { color: green; }
跟first-child相反,last-child取的是父标签的最后一个标签。
例如标签
<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设置边框以凸显一定的深度。
DEMO
兼容性
IE9+
Firefox
Chrome
Safari
Opera
28. X:only-child
div p:only-child { color: red; }
说实话,你会发现你几乎都不会用到这个伪类。然而,它是可用的,有会需要它的。
它允许你获取到那些只有一个子标签的父标签。就像上面那段代码,只有一个段落标签的div才被着色。
<div><p> My paragraph here. </p></div> <div> <p> Two paragraphs total. </p> <p> Two paragraphs total. </p> </div>
上面例子中,第二个div不会被选中。一旦第一个div有了多个子段落,那这个就不再起作用了。
DEMO
兼容性
IE9+
Firefox
Chrome
Safari
Opera
29. X:only-of-type
li:only-of-type { font-weight: bold; }
结构性伪类可以用的很聪明。它会定位某标签只有一个子标签的目标。设想你想获取到只有一个子标签的ul标签?
使用ul li会选中所有li标签。这时候就要使用only-of-type了。
ul > li:only-of-type { font-weight: bold; }
DEMO
兼容性
IE9+
Firefox 3.5+
Chrome
Safari
Opera
30. X:first-of-type
first-of-type伪类可以选择指定标签的第一个兄弟标签。
测试
<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
办法很多,我们看一些比较方便的。首先是first-of-type。
ul:first-of-type > li:nth-child(2) { font-weight: bold; }
找到第一个ul标签,然后找到直接子标签li,然后找到第二个子节点。
解决办法2
另一个解决办法就是邻近选择器。
p + ul li:last-child { font-weight: bold; }
这种情况下,找到p下的直接ul标签,然后找到它的最后一个直接子标签。
解决办法3
我们可以随便玩耍这些选择器。来看看:
ul:first-of-type li:nth-last-child(1) { font-weight: bold; }
先获取到页面上第一个ul标签,然后找到最后一个子标签。
DEMO
兼容性
IE9+
Firefox 3.5+
Chrome
Safari
Opera
结论
如果你想向旧版本浏览器妥协,比如IE6,那你用这些新的选择器的时候还是得小心点。但别别让IE6阻止你去学这些新的技能。那你就对自己太残忍了。记得多查查兼容性列表,或者使用Dean Edward’s excellent IE9.js script 来让你的浏览器具有这些特性。
第二个,使用向jQuery的时候,尽量使用原生的CSS3选择器。可能 活让你的代码跑的很快。这样选择器引擎就可以使用浏览器原生解析器,而不是选择器自己的。