css之工作中常用选择器

230 阅读3分钟

兄弟选择器(~)

用来查找指定元素的所有兄弟元素节点

h1 ~ p {
   color: red;
}
<h1>这是标题</h1>
<p>第一个段落。</p>
<p>第二个段落。</p>

css-choose-1.jpg

相邻兄弟选择器(+)

+选择紧接在元素后的元素,且二者有相同父元素。

h2+p {color: red;}
<p>这里是第一个p标签</p>
<h2>标题H2</h2>
<p>这里是第二个p标签</p>
<p>这里是第三个p标签</p>

css-choose-2.jpg

li + li {color:red;}
<ul>
    <li>List item 1</li>
    <li>List item 2</li>
    <li>List item 3</li>
</ul>

css-choose-3.jpg

首先分析选择器样式:li+li{},字面意思是选取所有位于li标签后的第一个li元素

  • 很显然第一个li不会被选中,因为它前面不是li
  • 第二个li会被选中,因为它是第一个li标签紧邻的li标签
  • 第三个li也会被选中,因为第三个li标签的上一个标签也是li标签,也满足li+li{}的条件:li标签后的第一个li标签

可以发现虽然这两个选择器都表示兄弟选择器,但是‘+’选择器则表示某元素后相邻的兄弟元素,也就是紧挨着的,是单个的(特殊情况:循环多个)。而‘~’选择器则表示某元素后所有同级的指定元素,强调所有的。

:first-child

<div id="win">
    <div class="top"></div>
    <div class="tab_con"></div>
    <div class="tab_con"></div>
</div>
.tab_con:first-child{ background:#090; }

此时first-child不起作用。当看到.tab_con:first-child时,先找到父类,父类是win,然后,是找父类下第一个元素,并且这个元素的class是.tab_con,但是父类的第一个元素的class是top,所以不满足要求。

.tab_con:nth-child(2){ background:#090; }

首先找父类,然后找父类的第二个元素,并且要求第二个元素的class是tab_con,这里满足要求。

同样的道理,p:nth-child(n):首先查找p元素的父级,然后找到这个父级的第n个子元素,刚好这个子元素是p标签,那么样式就会生效,如果这个子元素是div标签,那么样式不会生效。

:nth-of-type(n)

nth-of-type是取当前元素的兄弟元素,这个兄弟元素必须满足一个类型,比如都是p标签,然后从这些个p标签里面找第n个,下面来看看它和nth-child的区别:

p:nth-of-type(3) {
  color: red;
}
p:nth-child(3) {
  color: red;
}
<p>这是第一个段落。</p>
<p>这是第二个段落。</p>
<p>这是第三个段落。</p>
<p>这是第四个段落。</p>

在这种情况下这两个选择器的效果都是一样的,如果我们在其中插入一个标签:

p:nth-of-type(3) {
  color: red;
}
p:nth-child(3) {
  color: blue;
}
<p>这是第一个段落。</p>
<h2>这是一个标题</h2>
<p>这是第二个段落。</p>
<p>这是第三个段落。</p>
<p>这是第四个段落。</p>

css-choose-4.jpg

可以看到nth-of-type是先把所有的p标签筛选出来,然后从筛选出来的里面找到第三个;nth-child则不会筛选,直接找到第三个。

属性选择器

[title=hello] {
    color: red;
}
<h2 title="hello">Hello world</h2>

几个常见的伪类选择器

  • :checked: input:checked 选择每个被选中的 input 元素
  • :focus: input:focus 选择获得焦点的 input 元素

面试题:如何美化checkbox?

  1. lable[for]和id:点击label的时候也能选中checkbox
  2. 隐藏checkbox这个元素:设置label的样式
  3. :checked + label:设置选中情况下的label的样式