我們比較熟悉的幾個選擇器是:#id .class 以及標籤選擇器。但這些還遠遠不夠,為了在開發中更加得心應手,本文總結了30個CSS3選擇器,希望對大家有幫助。
1 *:通用選擇器
* { margin:0; padding:0; }
*選擇器是選擇頁面上的全部元素,上面的程式碼作用是把全部元素的margin和padding設為0,最基本的清除瀏覽器預設樣式的方法。
*選擇器也可以應用到子選擇器中,例如下面的程式碼:
#container * { border:1px solid black; }
這樣ID為container 的所有子標籤元素都被選中了,並且設定了border。
2 #id:id選擇器
#container { width: 960px; margin: auto; }
id選擇器是很嚴格的並且你沒辦法去復用它。使用的時候大家還是得相當小心的。需要問自己一下:我是不是必須要給這個元素來賦值個id來定位它呢?
3 .class:類別選擇器
.error { color: red; }
這是個class選擇器。它跟id選擇器不同的是,它可以定位多個元素。當你想對多個元素進行樣式修飾的時候就可以使用class。當你要對某個特定的元素進行修飾那就是用id來定位它。
4 selector1 selector2:後代選擇器
li a { text-decoration: none; }
後位選擇器是比較常用的選擇器。如果你想更具體的去定位元素,你可以使用它。例如,假如,你不需要定位所有的a元素,而只需要定位li標籤下的a標籤?這時候你就需要使用後代選擇器了。
提示:如果你的選擇器像X Y Z A B.error這樣,那你就錯了。時時刻刻提醒自己,是否真的需要對那麼多元素進行修飾。
5 tagName:標籤選擇器
a { color: red; } ul { margin-left: 0; }
如果你想定位頁面上所有的某個標籤,不是透過id或是'class',這簡單,直接使用類型選擇器。
6 selector:link selector:visited selector:hover selector:active 偽類選擇器
##一般情況下selector都為a標籤,以上四種偽類選擇器代表的意思如下:link:連接平常的狀態。 visited:連線被存取之後。 hover:滑鼠放到連線上的時候。 active:連接被按下的時候。 未移入a標籤連結時:link 移入a標籤連結時:link、hover 點選a標籤連結時:link、hover、active 點選後未移入a標籤連線時:link、visited 點擊後移入a標籤連線時:link、visited、hover 點擊後再點選a標籤連線時:link、 visited、hover、active 這個就是所有組合的樣式了。 如果有多個同樣的樣式,後面的樣式會覆蓋前面的樣式,所以這四個偽類的定義就有順序的要求了,而大家所說的'lvha'也是因為這個原因。7 selector1 + selector2 :相鄰選擇器
#
ul + p { color: red; }它只會選取指定元素的直接後繼元素。上面那個例子就是選取了所有ul標籤後面的第一段,並將它們的顏色都設為紅色。
8 selector1 > selector2 : 子選擇器
p#container > ul { border: 1px solid black; }它與差異就是後面這個指揮選擇它的直接子元素。看下面的範例
<p 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> </p>#container > ul只會選取id為’container’的p下的所有直接ul元素。它不會定位到如第一個li下的ul元素。由於某些原因,使用子節點組合選擇器會在效能上有許多的優勢。事實上,當在javascript中使用css選擇器時候是強烈建議這麼做的。
9 selector1 ~ selector2 : 兄弟選擇器
#
ul ~ p { color: red; }兄弟節點組合選擇器跟相鄰選擇器很相似,然後它又不是那麼的嚴格。 ul + p選擇器只會選擇緊接著指定元素的那些元素。而這個選擇器,會選擇跟在目標元素後面的所有相符的元素。
10 selector[title] : 屬性選擇器
a[title] { color: green; }上面的這個例子中,只會選擇有title屬性的元素。那些沒有此屬性的錨點標籤將不會被這個程式碼修飾。
11 selector[href="foo"] : 屬性選擇器
a[href="http://strongme.cn"] { color: #1f6053; /* nettuts green */ }上面這片程式碼將會將href屬性值為http://strongme.cn的錨點標籤設定為綠色,而其他標籤則不受影響。 注意:我們將數值用雙引號括起來了。那麼在使用Javascript的時候也要用雙引號括起來。可以的話,盡量使用標準的CSS3選擇器。
12 selector[href*=”strongme”] : 屬性選擇器#
a[href*="strongme"] { color: #1f6053; }
指定了strongme这个值必须出现在锚点标签的href属性中,不管是strongme.cn还是strongme.com还是www.strongme.cn都可以被选中。
但是记得这是个很宽泛的表达方式。如果锚点标签指向的不是strongme相关的站点,如果要更加具体的限制的话,那就使用^和$,分别表示字符串的开始和结束。
13 selector[href^=”href”] : 属性选择器
a[href^="http"] { background: url(path/to/external/icon.png) no-repeat; padding-left: 10px; }
大家肯定好奇过,有些站点的锚点标签旁边会有一个外链图标,我也相信大家肯定见过这种情况。这样的设计会很明确的告诉你会跳转到别的网站。
用克拉符号就可以轻易做到。它通常使用在正则表达式中标识开头。如果我们想定位锚点属性href中以http开头的标签,那我们就可以用与上面相似的代码。
注意我们没有搜索http://,那是没必要的,因为它都不包含https://。
14 selector[href$=”.jpg”] : 属性选择器
a[href$=".jpg"] { color: red; }
这次我们又使用了正则表达式$,表示字符串的结尾处。这段代码的意思就是去搜索所有的图片链接,或者其它链接是以.jpg结尾的。但是记住这种写法是不会对gifs和pngs起作用的。
15 selector[data-*=”foo”] : 属性选择器
a[data-filetype="image"] { color: red; }
回到上一条,我们如何把所有的图片类型都选中呢png,jpeg,’jpg’,’gif’?我们可以使用多选择器。看下面:
a[href$=".jpg"], a[href$=".jpeg"], a[href$=".png"], a[href$=".gif"] { color: red; }
但是这样写着很蛋疼啊,而且效率会很低。另外一个办法就是使用自定义属性。我们可以给每个锚点加个属性data-filetype指定这个链接指向的图片类型。
a[data-filetype="image"] { color: red; }
16 selector[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 selector:checked : 伪类选择器
input[type=radio]:checked { border: 1px solid black; }
上面这个伪类写法可以定位那些被选中的单选框和多选框,就是这么简单。
18 selector: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标准规定,可以使用两个冒号::。然后为了兼容性,浏览器也会接受一个冒号的写法。其实在这个情况下,用一个冒号还是比较明智的。
19 selector:hover : 伪类选择器
p: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;要好看很多。
20 selector1:not(selector2) : 伪类选择器
p:not(#container) { color: blue; }
取反伪类是相当有用的,假设我们要把除id为container之外的所有p标签都选中。那上面那么代码就可以做到。
或者说我想选中所有出段落标签之外的所有标签
:not(p) { color: green; }
21 selector::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.但是这个兼容对新介绍的特性不起作用。
22 selector:nth-child(n) : 伪类选择器
li:nth-child(3) { color: red; }
还记得我们面对如何取到堆叠式标签的第几个元素时无处下手的时光么,有了nth-child那日子就一去不复返了。
请注意nth-child接受一个整形参数,然后它不是从0开始的。如果你想获取第二个元素那么你传的值就是li:nth-child(2).
我们甚至可以获取到由变量名定义的个数个子标签。例如我们可以用li:nth-child(4n)去每隔3个元素获取一次标签。
23 selector:nth-last-child(n) : 伪类选择器
li:nth-last-child(2) { color: red; }
假设你在一个ul标签中有N多的元素,而你只想获取最后三个元素,甚至是这样li:nth-child(397),你可以用nth-last-child伪类去代替它。
24 selectorX:nth-of-type(n) : 伪类选择器
ul:nth-of-type(3) { border: 1px solid black; }
曾几何时,我们不想去选择子节点,而是想根据元素的类型来进行选择。
想象一下有5个ul标签。如果你只想对其中的第三个进行修饰,而且你也不想使用id属性,那你就可以使用nth-of-type(n)伪类来实现了,上面的那个代码,只有第三个ul标签会被设置边框。
25 selector:nth-last-of-type(n) : 伪类选择器
ul:nth-last-of-type(3) { border: 1px solid black; }
同样,也可以类似的使用nth-last-of-type来倒序的获取标签。
26 selector:first-child : 伪类选择器
ul li:first-child { border-top: none; }
这个结构性的伪类可以选择到第一个子标签,你会经常使用它来取出第一个和最后一个的边框。
假设有个列表,每个标签都有上下边框,那么效果就是第一个和最后一个就会看起来有点奇怪。这时候就可以使用这个伪类来处理这种情况了。
27 selector: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>
这里没啥内容,就是一个了 List。
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设置边框以凸显一定的深度。
28 selector:only-child : 伪类选择器
p p:only-child { color: red; }
说实话,你会发现你几乎都不会用到这个伪类。然而,它是相当有用的,说不准哪天你就会用到它。
它允许你获取到那些只有一个子标签的父标签下的那个子标签。就像上面那段代码,只有一个段落标签的p才被着色。
<p><p> My paragraph here. </p></p> <p> <p> Two paragraphs total. </p> <p> Two paragraphs total. </p> </p>
上面例子中,第二个p不会被选中。一旦第一个p有了多个子段落,那这个就不再起作用了。
29 selector:only-of-type: 伪类选择器
li:only-of-type { font-weight: bold; }
结构性伪类可以用的很聪明。它会定位某标签下相同子标签的只有一个的目标。设想你想获取到只有一个子标签的ul标签下的li标签呢?
使用ul li会选中所有li标签。这时候就要使用only-of-type了。
ul > li:only-of-type { font-weight: bold;
最后记住:使用像jQuery等工具的时候,尽量使用原生的CSS3选择器。可能会让你的代码跑的很快。这样选择器引擎就可以使用浏览器原生解析器,而不是选择器自己的。
相关推荐: