CSS:几个不太常用的强大选择器

老冯 前端笔记评论193阅读模式

*:通用选择器

* { margin:0; padding:0; }

*选择器是选择页面上的全部元素,清除浏览器默认样式的方法。

*选择器也可以应用到子选择器中,例如下面的代码:

#container * { border:1px solid black; }

selector1 + selector2 :相邻选择器

ul + p {
    color: red;
}

它只会选中指定元素的直接后继元素。上面那个例子就是选中了所有 ul 标签后面的第一段。

selector1 > selector2 : 子选择器

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 选择器时候是强烈建议这么做的。

selector1 ~ selector2 : 兄弟选择器

ul ~ p {
    color: red;
}

兄弟节点组合选择器跟相邻选择器很相似,然后它又不是那么的严格。ul + p 选择器只会选择紧挨跟着指定元素的那些元素。而这个选择器,会选择跟在目标元素后面的所有匹配的元素。

selector[title] : 属性选择器

a[title] {
    color: green;
}

上面的这个例子中,只会选择有title属性的元素。那些没有此属性的锚点标签将不会被这个代码修饰。

selector[href="foo"] : 属性选择器

a[href="http://fengquanjia.cn"] {
    color: #1f6053; /* nettuts green */
}

上面这片代码将会把href属性值为 http://fengquanjia.cn 的锚点标签设置为绿色,而其他标签则不受影响。

注意:我们将值用双引号括起来了。那么在使用 JavaScript 的时候也要使用双引号括起来。可以的话,尽量使用标准的 css3 选择器。

selector[href*=fengquanjia] : 属性选择器

a[href*="fengquanjia"] {
    color: #1f6053;
}

指定了 fengquanjia 这个值必须出现在锚点标签的href属性中,不管是 fengquanjia.cn 还是 fengquanjia.com还是 www.fengquanjia.cn 都可以被选中。

但是记得这是个很宽泛的表达方式。如果锚点标签指向的不是 fengquanjia 相关的站点,如果要更加具体的限制的话,那就使用^和$,分别表示字符串的开始和结束。

selector[href^="href"] : 属性选择器

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

如果我们想定位锚点属性 href 中以 http 开头的标签,那我们就可以用与上面相似的代码。

注意:我们没有搜索 http://,那是没必要的,因为它都不包含 https://。

selector[href$=".jpg"] : 属性选择器

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

这段代码的意思就是去搜索所有的图片链接,或者其它链接是以 .jpg 结尾的。但是记住这种写法是不会对 gif 和 png 起作用。

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

selector[foo~="bar"] : 属性选择器

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

selector:checked :伪类选择器

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

上面这个伪类写法可以定位那些被选中的单选框和多选框,就是这么简单。

selector1:not(selector2) :伪类选择器

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

取反伪类是相当有用的,假设我们要把除 id 为 container 之外的所有 div 标签都选中。那上面那么代码就可以做到。

或者说我想选中所有出段落标签之外的所有标签

:not(p) {
    color: green;
}

selector::pseudoElement :伪类选择器

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. 但是这个兼容对新介绍的特性不起作用。

selector:nth-child(n) :伪类选择器

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

想获取第二个元素那么你传的值就是 li:nth-child(2).

我们甚至可以获取到由变量名定义的个数个子标签。例如我们可以用 li:nth-child(4n) 去每隔 3 个元素获取一次标签。

selector:nth-last-child(n) :伪类选择器

假设你在一个ul标签中有N多的元素,而你只想获取最后三个元素,甚至是这样 li:nth-child(397),你可以用 nth-last-child 伪类去代替它。

selectorX:nth-of-type(n) :伪类选择器

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

有 5 个 ul 标签。想对其中的第三个进行修饰,而且你也不想使用 id 属性,那你就可以使用 nth-of-type(n) 伪类来实现了,上面的那个代码,只有第三个 ul 标签会被设置边框。

selector:nth-last-of-type(n) :伪类选择器

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

也可以类似的使用 nth-last-of-type 来倒序的获取标签。

selector:first-child :伪类选择器

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

假设有个列表,每个标签都有上下边框,那么效果就是第一个和最后一个就会看起来有点奇怪。这时候就可以使用这个伪类来处理这种情况了。

selector:last-child :伪类选择器

ul > li:last-child {
    color: green;
}

跟 first-child 相反,last-child 取的是父标签的最后一个标签。

selector: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 有了多个子段落 css3 transition,那这个就不再起作用了。

selector:only-of-type:伪类选择器

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 选择器。可能会让你的代码跑的很快。这样选择器引擎就可以使用浏览器原生解析器,而不是选择器自己的。

声明:若本文标注有“转载链接”或明文说明为“转载”,则为非本站作品,请保留原文链接;若未备注转载,则为老冯笔记作品,转载时请保留本文链接。

weinxin
fengquanjia
老冯的微信
微信扫一扫,关注老冯,获得更多办公知识,更多晨草/书酷的动态!
老冯
  • 本文由 老冯 发表于 2023年2月2日 09:35:05
  • 转载请务必保留本文链接:http://www.fengquanjia.cn/css-powerful-selector/
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定