总结30个CSS3选择器
pindar2013
8年前
<p>或许大家平时总是在用的选择器都是:#id .class 以及标签选择器。可是这些还远远不够,为了在开发中更加得心应手,本文总结了30个CSS3选择器,希望对大家有所帮助。</p> <p><strong>1:通用选择器</strong></p> <pre> <code class="language-css">* { margin:0; padding:0; } </code></pre> <p>*选择器是选择页面上的全部元素,上面的代码作用是把全部元素的margin和padding设为0,最基本的清除浏览器默认样式的方法。</p> <p>*选择器也可以应用到子选择器中,例如下面的代码:</p> <pre> <code class="language-css">#container * { border:1px solid black; } </code></pre> <p>这样ID为container 的所有子标签元素都被选中了,并且设置了border。</p> <p><strong>2:id选择器</strong></p> <pre> <code class="language-css">#container { width: 960px; margin: auto; } </code></pre> <p>id 选择器是很严格的并且你没办法去复用它。使用的时候大家还是得相当小心的。需要问自己一下:我是不是必须要给这个元素来赋值个id来定位它呢?</p> <p><strong>3 .class:类选择器</strong></p> <pre> <code class="language-css">.error { color: red; } </code></pre> <p>这是个 class 选择器。它跟 id 选择器不同的是,它可以定位多个元素。当你想对多个元素进行样式修饰的时候就可以使用 class 。当你要对某个特定的元素进行修饰那就是用 id 来定位它。</p> <p><strong>4 selector1 selector2:后代选择器</strong></p> <pre> <code class="language-css">li a { text-decoration: none; } </code></pre> <p>后代选择器是 比较常用的 选择器。如果你想更加具体的去定位元素,你可以使用它。例如,假如,你不需要定位所有的 a 元素,而只需要定位 li 标签下的 a 标签?这时候你就需要使用 后代 选择器了。</p> <p>提示:如果你的选择器像 X Y Z A B.error 这样,那你就错了。时刻都提醒自己,是否真的需要对那么多元素修饰。</p> <p><strong>5 tagName:标签选择器</strong></p> <pre> <code class="language-css">a { color: red; } ul { margin-left: 0; } </code></pre> <p>如果你想定位页面上所有的某标签,不是通过 id 或者是’class’,这简单,直接使用类型选择器。</p> <p><strong>6 selector: link selector:visited selector:hover selector:active 伪类选择器</strong></p> <p>一般情况下selector都为a标签,以上四种伪类选择器代表的意思如下:</p> <p>link:连接平常的状态。</p> <p>visited:连接被访问过之后。</p> <p>hover:鼠标放到连接上的时候。<br> active:连接被按下的时候。</p> <p>未移入a标签链接时:link</p> <p>移入a标签链接时:link、hover</p> <p>点击a标签链接时:link、hover、active</p> <p>点击后未移入a标签连接时:link、visited</p> <p>点击后移入a标签连接时:link、visited、hover</p> <p>点击后再次点击a标签连接时:link、visited、hover、active</p> <p>这个就是所有组合的样式了。</p> <p>如果有多个同样的样式,后面的样式会覆盖前面的样式,所以这四个伪类的定义就有顺序的要求了,而大家所说的‘lvha’也是因为这个原因。</p> <p><strong>7 selector1 + selector2 :相邻选择器</strong></p> <pre> <code class="language-css">ul + p { color: red; } </code></pre> <p>它指挥选中指定元素的直接后继元素。上面那个例子就是选中了所有 ul 标签后面的第一段,并将它们的颜色都设置为红色。</p> <p><strong>8 selector1 > selector2 : 子选择器</strong></p> <pre> <code class="language-css">div#container > ul { border: 1px solid black; } </code></pre> <p>它与差别就是后面这个指挥选择它的直接子元素。看下面的例子:</p> <pre> <code class="language-css"><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> </code></pre> <p>#container > ul 只会选中 id 为’container’的 div 下的所有直接 ul 元素。它不会定位到如第一个 li 下的 ul 元素。</p> <p>由于某些原因,使用子节点组合选择器会在性能上有许多的优势。事实上,当在javascript中使用 css 选择器时候是强烈建议这么做的。</p> <p><strong>9 selector1 ~ selector2 : 兄弟选择器</strong></p> <pre> <code class="language-css">ul ~ p { color: red; } </code></pre> <p>兄弟节点组合选择器跟 相邻选择器 很相似,然后它又不是那么的严格。 ul + p 选择器只会选择紧挨跟着指定元素的那些元素。而这个选择器,会选择跟在目标元素后面的所有匹配的元素。</p> <p><strong>10 selector[title] : 属性选择器</strong></p> <pre> <code class="language-css">a[title] { color: green; } </code></pre> <p>上面的这个例子中,只会选择有title属性的元素。那些没有此属性的锚点标签将不会被这个代码修饰。</p> <p><strong>11 selector[href="foo"] : 属性选择器</strong></p> <pre> <code class="language-css">a[href="http://strongme.cn"] { color: #1f6053; /* nettuts green */ } </code></pre> <p>上面这片代码将会把 href 属性值为 http://strongme.cn 的锚点标签设置为绿色,而其他标签则不受影响。</p> <p>注意:我们将值用双引号括起来了。那么在使用Javascript的时候也要使用双引号括起来。可以的话,尽量使用标准的CSS3选择器。</p> <p><strong>12 selector[href*=”strongme”] : 属性选择器</strong></p> <pre> <code class="language-css">a[href*="strongme"] { color: #1f6053; } </code></pre> <p>指定了 strongme 这个值必须出现在锚点标签的 href 属性中,不管是 strongme.cn 还是 strongme.com 还是 www.strongme.cn 都可以被选中。</p> <p>但是记得这是个很宽泛的表达方式。如果锚点标签指向的不是 strongme 相关的站点,如果要更加具体的限制的话,那就使用 ^ 和 $ ,分别表示字符串的开始和结束。</p> <p><strong>13 selector[href^=”href”] : 属性选择器</strong></p> <pre> <code class="language-css">a[href^="http"] { background: url(path/to/external/icon.png) no-repeat; padding-left: 10px; } </code></pre> <p>大家肯定好奇过,有些站点的锚点标签旁边会有一个外链图标,我也相信大家肯定见过这种情况。这样的设计会很明确的告诉你会跳转到别的网站。</p> <p>用克拉符号就可以轻易做到。它通常使用在正则表达式中标识开头。如果我们想定位锚点属性 href 中以 http 开头的标签,那我们就可以用与上面相似的代码。</p> <p>注意我们没有搜索http://,那是没必要的,因为它都不包含https://。</p> <p><strong>14 selector[href$=”.jpg”] : 属性选择器</strong></p> <pre> <code class="language-css">a[href$=".jpg"] { color: red; } </code></pre> <p>这次我们又使用了正则表达式 $ ,表示字符串的结尾处。这段代码的意思就是去搜索所有的图片链接,或者其它链接是以 .jpg 结尾的。但是记住这种写法是不会对 gifs 和 pngs 起作用的。</p> <p><strong>15 selector[data-*=”foo”] : 属性选择器</strong></p> <pre> <code class="language-css">a[data-filetype="image"] { color: red; } </code></pre> <p>回到上一条,我们如何把所有的图片类型都选中呢 png , jpeg ,’jpg’,’gif’?我们可以使用多选择器。看下面:</p> <pre> <code class="language-css">a[href$=".jpg"], a[href$=".jpeg"], a[href$=".png"], a[href$=".gif"] { color: red; } </code></pre> <p>但是这样写着很蛋疼啊,而且效率会很低。另外一个办法就是使用自定义属性。我们可以给每个锚点加个属性 data-filetype 指定这个链接指向的图片类型。</p> <pre> <code class="language-css">a[data-filetype="image"] { color: red; } </code></pre> <p><strong>16 selector[foo~=”bar”] : 属性选择器</strong></p> <pre> <code class="language-css">a[data-info~="external"] { color: red; } a[data-info~="image"] { border: 1px solid black; } </code></pre> <p>这个我想会让你的小伙伴惊呼妙极了。很少有人知道这个技巧。这个 ~ 符号可以定位那些某属性值是空格分隔多值的标签。</p> <p>继续使用第15条那个例子,我们可以设置一个 data-info 属性,它可以用来设置任何我们需要的空格分隔的值。这个例子我们将指示它们为外部连接和图片链接。</p> <pre> <code class="language-css"><a href="path/to/image.jpg" data-info="external image"> Click Me, Fool </a> </code></pre> <p>给这些元素设置了这个标志之后,我们就可以使用 ~ 来定位这些标签了。</p> <pre> <code class="language-css">/* 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; } </code></pre> <p><strong>17 selector:checked : 伪类选择器</strong></p> <pre> <code class="language-css">input[type=radio]:checked { border: 1px solid black; } </code></pre> <p>上面这个伪类写法可以定位那些被选中的单选框和多选框,就是这么简单。</p> <p><strong>18 selector:after : 伪类选择器</strong></p> <p>before 和 after 这俩伪类。好像每天大家都能找到使用它们的创造性方法。它们会在被选中的标签周围生成一些内容。</p> <p>当使用 .clear-fix 技巧时许多属性都是第一次被使用到里面的。</p> <pre> <code class="language-css">.clearfix:after { content: ""; display: block; clear: both; visibility: hidden; font-size: 0; height: 0; } .clearfix { *display: inline-block; _height: 1%; } </code></pre> <p>上面这段代码会在目标标签后面补上一段空白,然后将它清除。这个方法你一定得放你的聚宝盆里面。特别是当 overflow:hidden 方法不顶用的时候,这招就特别管用了。</p> <p>根据CSS3标准规定,可以使用两个冒号 :: 。然后为了兼容性,浏览器也会接受一个冒号的写法。其实在这个情况下,用一个冒号还是比较明智的。</p> <p><strong>19 selector:hover : 伪类选择器</strong></p> <pre> <code class="language-css">div:hover { background: #e3e3e3; } </code></pre> <p>不用说,大家肯定知道它。官方的说法是 user action pseudo class .听起来有点儿迷糊,其实还好。如果想在用户鼠标飘过的地方涂点儿彩,那这个伪类写法可以办到。</p> <p>注意:旧版本的IE只会对加在锚点 a 标签上的 :hover 伪类起作用。</p> <p>通常大家在鼠标飘过锚点链接时候加下边框的时候用到它。</p> <pre> <code class="language-css">a:hover { border-bottom: 1px solid black; } </code></pre> <p>专家提示:border-bottom:1px solid black;比text-decoration:underline;要好看很多。</p> <p><strong>20 selector1:not(selector2) : 伪类选择器</strong></p> <pre> <code class="language-css">div:not(#container) { color: blue; } </code></pre> <p>取反 伪类是相当有用的,假设我们要把除 id 为 container 之外的所有 div 标签都选中。那上面那么代码就可以做到。</p> <p>或者说我想选中所有出段落标签之外的所有标签</p> <pre> <code class="language-css">:not(p) { color: green; } </code></pre> <p><strong>21 selector::pseudoElement : 伪类选择器</strong></p> <pre> <code class="language-css">p::first-line { font-weight: bold; font-size:1.2em; } </code></pre> <p>我们可以使用 :: 来选中某标签的部分内容,如第一段,或者是第一个字。但是记得必须使用在块式标签上才起作用。</p> <p>伪标签是由两个冒号 :: 组成的。</p> <p>定位第一个字</p> <pre> <code class="language-css">p::first-letter { float: left; font-size: 2em; font-weight: bold; font-family: cursive; padding-right: 2px; } </code></pre> <p>上面这段代码会找到页面上所有段落,并且指定为每一段的第一个字。</p> <p>它通常在一些新闻报刊内容的重点突出会使用到。</p> <p>定位某段的第一行</p> <pre> <code class="language-css">p::first-line { font-weight: bold; font-size: 1.2em; } </code></pre> <p>跟 ::first-line 相似,会选中段落的第一行 。</p> <p>为了兼容性,之前旧版浏览器也会兼容单冒号的写法,例如 :first-line , :first-letter , :before , :after .但是这个兼容对新介绍的特性不起作用。</p> <p><strong>22 selector:nth-child(n) : 伪类选择器</strong></p> <pre> <code class="language-css">li:nth-child(3) { color: red; } </code></pre> <p>还记得我们面对如何取到堆叠式标签的第几个元素时无处下手的时光么,有了 nth-child 那日子就一去不复返了。</p> <p>请注意 nth-child 接受一个整形参数,然后它不是从0开始的。如果你想获取第二个元素那么你传的值就是 li:nth-child(2) .</p> <p>我们甚至可以获取到由变量名定义的个数个子标签。例如我们可以用 li:nth-child(4n) 去每隔3个元素获取一次标签。</p> <p><strong>23 selector:nth-last-child(n) : 伪类选择器</strong></p> <pre> <code class="language-css">li:nth-last-child(2) { color: red; } </code></pre> <p>假设你在一个 ul 标签中有N多的元素,而你只想获取最后三个元素,甚至是这样 li:nth-child(397) ,你可以用 nth-last-child 伪类去代替它。</p> <p><strong>24 selectorX:nth-of-type(n) : 伪类选择器</strong></p> <pre> <code class="language-css">ul:nth-of-type(3) { border: 1px solid black; } </code></pre> <p>曾几何时,我们不想去选择子节点,而是想根据元素的类型来进行选择。</p> <p>想象一下有5个 ul 标签。如果你只想对其中的第三个进行修饰,而且你也不想使用 id 属性,那你就可以使用 nth-of-type(n) 伪类来实现了,上面的那个代码,只有第三个 ul 标签会被设置边框。</p> <p><strong>25 selector:nth-last-of-type(n) : 伪类选择器</strong></p> <pre> <code class="language-css">ul:nth-last-of-type(3) { border: 1px solid black; } </code></pre> <p>同样,也可以类似的使用 nth-last-of-type 来倒序的获取标签。</p> <p><strong>26 selector:first-child : 伪类选择器</strong></p> <pre> <code class="language-css">ul li:first-child { border-top: none; } </code></pre> <p>这个结构性的伪类可以选择到第一个子标签,你会经常使用它来取出第一个和最后一个的边框。</p> <p>假设有个列表,每个标签都有上下边框,那么效果就是第一个和最后一个就会看起来有点奇怪。这时候就可以使用这个伪类来处理这种情况了。</p> <p><strong>27 selector:last-child : 伪类选择器</strong></p> <pre> <code class="language-css">ul > li:last-child { color: green; } </code></pre> <p>跟 first-child 相反, last-child 取的是父标签的最后一个标签。</p> <p>例如</p> <p>标签</p> <pre> <code class="language-css"><ul> <li> List Item </li> <li> List Item </li> <li> List Item </li> </ul> </code></pre> <p>这里没啥内容,就是一个了 List。</p> <pre> <code class="language-css">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; } </code></pre> <p>上面的代码将设置背景色,移除浏览器默认的内边距,为每个 li 设置边框以凸显一定的深度。</p> <p><strong>28 selector:only-child : 伪类选择器</strong></p> <pre> <code class="language-css">div p:only-child { color: red; } </code></pre> <p>说实话,你会发现你几乎都不会用到这个伪类。然而,它是相当有用的,说不准哪天你就会用到它。</p> <p>它允许你获取到那些只有一个子标签的父标签下的那个子标签。就像上面那段代码,只有一个段落标签的 div 才被着色。</p> <pre> <code class="language-css"><div><p> My paragraph here. </p></div> <div> <p> Two paragraphs total. </p> <p> Two paragraphs total. </p> </div> </code></pre> <p>上面例子中,第二个 div 不会被选中。一旦第一个 div 有了多个子段落,那这个就不再起作用了。</p> <p><strong>29 selector:only-of-type: 伪类选择器</strong></p> <pre> <code class="language-css">li:only-of-type { font-weight: bold; } </code></pre> <p>结构性伪类可以用的很聪明。它会定位某标签下相同子标签的只有一个的目标。设想你想获取到只有一个子标签的 ul 标签下的li标签呢?</p> <p>使用 ul li 会选中所有 li 标签。这时候就要使用 only-of-type 了。</p> <pre> <code class="language-css">ul > li:only-of-type { font-weight: bold; </code></pre> <p>最后记住:使用像jQuery等工具的时候,尽量使用原生的CSS3选择器。可能会让你的代码跑的很快。这样选择器引擎就可以使用浏览器原生解析器,而不是选择器自己的。</p> <p> </p> <p> </p> <p>来自:http://www.cnblogs.com/peakleo/p/6236608.html</p> <p> </p>