收集一些不常用,但却非常有用的CSS选择器。
* { margin:0; padding:0; }
*选择器是选择页面上的全部元素,清除浏览器默认样式的方法。
*选择器也可以应用到子选择器中,例如下面的代码:
#container * { border:1px solid black; }
ul + p { color: red; }
它只会选中指定元素的直接后继元素。上面那个例子就是选中了所有ul标签后面的第一段。
div#container > ul { border: 1px solid black; }
选择它的直接子元素
<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选择器时候是强烈建议这么做的。
ul ~ p { color: red; }
兄弟节点组合选择器跟相邻选择器很相似,然后它又不是那么的严格。ul + p选择器只会选择紧挨跟着指定元素的那些元素。而这个选择器,会选择跟在目标元素后面的所有匹配的元素。
a[title] { color: green; }
上面的这个例子中,只会选择有title属性的元素。那些没有此属性的锚点标签将不会被这个代码修饰。
a[href="http://strongme.cn"] { color: #1f6053; /* nettuts green */ }
上面这片代码将会把href属性值为http://strongme.cn的锚点标签设置为绿色,而其他标签则不受影响。
注意:我们将值用双引号括起来了。那么在使用JavaScript的时候也要使用双引号括起来。可以的话,尽量使用标准的css3选择器。
a[href*="strongme"] { color: #1f6053; }
指定了strongme这个值必须出现在锚点标签的href属性中,不管是strongme.cn还是strongme.com还是www.strongme.cn都可以被选中。
但是记得这是个很宽泛的表达方式。如果锚点标签指向的不是strongme相关的站点,如果要更加具体的限制的话,那就使用^和$,分别表示字符串的开始和结束。
a[href^="http"] { background: url(path/to/external/icon.png) no-repeat; padding-left: 10px; }
如果我们想定位锚点属性href中以http开头的标签,那我们就可以用与上面相似的代码。
注意我们没有搜索http://,那是没必要的,因为它都不包含https://。
a[data-filetype="image"] { color: red; }
这段代码的意思就是去搜索所有的图片链接,或者其它链接是以.jpg结尾的。但是记住这种写法是不会对gif和png起作用。
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; }
a[data-info~="external"] { color: red; } a[data-info~="image"] { border: 1px solid black; }
这个~符号可以定位那些某属性值是空格分隔多值的标签。
我们可以设置一个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; }
input[type=radio]:checked { border: 1px solid black; }
上面这个伪类写法可以定位那些被选中的单选框和多选框,就是这么简单。
div:not(#container) { color: blue; }
取反伪类是相当有用的,假设我们要把除id为container之外的所有div标签都选中。那上面那么代码就可以做到。
或者说我想选中所有出段落标签之外的所有标签
:not(p) { color: green; }
p::first-line { font-weight: bold; font-size:1.2em; }
可以使用::来选中某标签的部分内容css3 radius,如第一段,或者是第一个字。但是记得必须使用在块式标签上才起作用。
伪标签是由两个冒号 :: 组成的
定位第一个字:
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.但是这个兼容对新介绍的特性不起作用。
li:nth-child(3) { color: red; }
想获取第二个元素那么你传的值就是li:nth-child(2).
我们甚至可以获取到由变量名定义的个数个子标签。例如我们可以用li:nth-child(4n)去每隔3个元素获取一次标签。
假设你在一个ul标签中有N多的元素,而你只想获取最后三个元素,甚至是这样li:nth-child(397),你可以用nth-last-child伪类去代替它。
ul:nth-of-type(3) { border: 1px solid black; }
有5个ul标签。想对其中的第三个进行修饰,而且你也不想使用id属性,那你就可以使用nth-of-type(n)伪类来实现了,上面的那个代码,只有第三个ul标签会被设置边框。
ul:nth-last-of-type(3) { border: 1px solid black; }
也可以类似的使用nth-last-of-type来倒序的获取标签。
ul li:first-child { border-top: none; }
假设有个列表,每个标签都有上下边框,那么效果就是第一个和最后一个就会看起来有点奇怪。这时候就可以使用这个伪类来处理这种情况了。
ul > li:last-child { color: green; }
跟first-child相反,last-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有了多个子段落css3 transition,那这个就不再起作用了。
li:only-of-type { font-weight: bold; }
结构性伪类可以用的很聪明。它会定位某标签下相同子标签的只有一个的目标。设想你想获取到只有一个子标签的ul标签下的li标签呢?
使用ul li会选中所有li标签。这时候就要使用only-of-typecss3圆角了。
ul > li:only-of-type { font-weight: bold; }
最后,使用像jQuery等工具的时候,尽量使用原生的CSS3选择器。可能会让你的代码跑的很快。这样选择器引擎就可以使用浏览器原生解析器,而不是选择器自己的。
本站文章大部分为原创,用于个人学习记录,可能对您有所帮助,仅供参考!