深入理解CSS伪类

前面的话

  伪类经常与伪元素混淆,伪元素的效果类似于通过添加一个实际的元素才能达到,而伪类的效果类似于通过添加一个实际的类来达到。实际上 css3 为了区分两者,已经明确规定了伪类用一个冒号来表示,而伪元素则用两个冒号来表示。本文将详细介绍伪类的详细知识

 

锚点

  关于锚点 <a>,有常见的 5 个伪类,分别是:link,:hover,:active,:focus,:visited

a:link{background-color:pink;}/*品红,未访问*/

a:hover{background-color:lightblue;}/*浅蓝,鼠标悬停*/

a:active{background-color:lightgreen;}/*浅绿,正被点击*/

a:focus{background-color:lightgrey;}/*浅灰,拥有焦点*/

a:visited{color:orange;}/*字体颜色为橙色,已被访问*/
/*[注意]visited 伪类只能设置字体颜色、边框颜色、outline 颜色的样式*/

伪类顺序

  对于伪类顺序,有一个口诀是 love-hate,代表着伪类的顺序是 link、visited、focus、hover、active。但是否伪类的顺序只能如此呢?为什么是这个顺序呢?

  CSS 层叠中有一条法则十分重要,就是后面覆盖前面,所以伪类的顺序是需要精心考虑的。

  【1】link 和 visited 必须在最前面,且没有先后顺序,否则 link 或 visited 的效果将被覆盖

  [注意]link 和 visited 称为静态伪类,只能应用于超链接

  【2】hover、active、focus 这三个伪类必须是 focus、hover、active 的顺序,因为在 focus 状态下,也需要触发 hover 和 active,而要触发 active 一定要先触发 hover,所以 active 要放在 hover 后面

  [注意]hover、active、focus 称为动态伪类,可应用于任何元素,但 IE7- 浏览器不支持:focus,:hover 和:active 在 IE6- 浏览器下只支持给 <a> 设置

  所以最终的顺序只有两种:link、visited、focus、hover、active 或 visited、link、focus、hover、active

a:link{background-color:pink;}/*品红,未访问*/
a:visited{color:orange;}/*字体颜色为橙色,已被访问*/
a:focus{background-color:lightgrey;}/*浅灰,拥有焦点*/
a:hover{background-color:lightblue;}/*浅蓝,鼠标悬停*/
a:active{background-color:lightgreen;}/*浅绿,正被点击*/

 

UI 元素伪类

  UI 元素伪类包括:enabled、:disabled、:checked 三个,主要针对于 HTML 中的 form 元素,IE8- 浏览器不支持

:enabled    可用状态
:disabled   不可用状态
:checked    选中状态    
input:enabled{
    border: 1px solid black;
    background-color: transparent;
}
input:disabled{
    border: none;
    background-color: gray;
}
input:checked{
    outline: 2px solid lightblue;
}
<button onclick = "btn.disabled = false;">按钮可用</button>
<
button onclick = "btn.disabled = true;">按钮不可用</button>
<
input type="button" id="btn" value="按钮">
<
br> <label>Male<input type="radio" name="sex" /></label>
<
label>Female<input type="radio" name="sex" /></label>

  [注意]input 和: 和 enabled 之间都不可以有空格

结构伪类

  结构伪类可分为以下 3 种情况,IE8- 浏览器不支持

  // 以下情况都是 E 为父元素,F 为子元素

【1】:nth-child(n)、:nth-last-child(n)、first-child、last-child、:only-child

E F:nth-child(n)           选择父元素的第 n 个子元素
E F:nth-last-child(n)      选择父元素的倒数第 n 个子元素
E F:first-child            父元素的第一个子元素,与 E F:nth-child(1) 等同
E F:last-child             父元素的最后一个子元素,与 E F:nth-last-child(1) 等同
E F:only-child             选择父元素中只包含一个子元素

  [注意]:first-child 和:last-child 只有 IE6- 浏览器不支持

  n 可以是整数 (从 1 开始),也可以是公式,也可以是关键字 (even、odd)

p:first-child       代表的并不是<p>的第一个子元素,而是<p>元素是某元素的第一个子元素
p > i:first-child    匹配所有<p>元素中的第一个<i>元素
p:first-child i     匹配所有作为第一个子元素的<p>元素中的所有<i>元素
li:nth-child(odd){color: red;} 
li:nth-last-child(3){color: green;}
li:first-child{color: blue;}
li:last-child{color: yellow;}
div:only-child{background-color:lightgrey;}
<ul>
    <li><div>第一个 DIV</div></li>
    <li><div>第二个 DIV</div></li>
    <li><div>第三个 DIV</div></li>
    <li><div>第四个 DIV</div></li>
    <li><div>第五个 DIV</div></li>
    <li><div>第六个 DIV</div></li>        
</ul>

【2】:nth-of-type(n)、:nth-last-of-type(n)、:first-of-type、:last-of-type、:only-of-type

E F:nth-of-type(n)          选择父元素的具有指定类型的第 n 个子元素
E F:nth-last-of-type(n)     选择父元素的具有指定类型的倒数第 n 个子元素
E F:first-of-type           选择父元素中具有指定类型的第 1 个子元素,与 E F:nth-of-type(1) 相同
E F:last-of-type            选择父元素中具有指定类型的最后 1 个子元素,与 E F:nth-last-of-type(1) 相同
E F:only-of-type           选择父元素中只包含一个同类型的子元素
.box div:nth-of-type(even){color: red;} 
.box p:nth-last-of-type(3){color: green;}
.box div:first-of-type{color: blue;}
.box p:last-of-type{color: yellow;}
.box div:only-of-type{color: pink;}
<div class="box">
    <div>第一个 div</div>
    <p>第一个 p</p>
    <div>第二个 div</div>
    <p>第二个 p</p>
    <div class="in">第三个 div</div>
    <p>第三个 p</p>
</div>
<div class="box">
    <div>第四个 div</div>
</div>

【3】:root、:not、:empty、:target

:root         选择文档的根元素
:not          选择除某个元素之外的所有元素
:empty         选择没有子元素的元素,而且该元素也不包含任何文本节点
:target       匹配锚点对应的目标元素

  [注意]:not 选择器常用于导航之间的竖线处理,如 li:not(:last-of-type)

:root{color:red;}
div:not{background-color: lightgrey;}
p:empty{height:30px;width:30px;background:pink;}
:target{color:blue;}
<body>
    <a href="#test"> 测试 </a>
    <div> 第一个 div</div>
    <p> 第一个 p</p>
    <div id="test"> 第二个 div</div>
    <p> 第二个 p</p>
    <p></p>    
</body>

 

其他

【1】:lang()   匹配某个语言,IE7- 浏览器不支持

p:lang(en) 匹配语言为"en"的 <p>

【2】不仅可以使用单一伪类,也可以伪类结合使用

  [注意] 顺序无关

div:hover:first-child{background-color: lightgreen;}
div:last-of-type:active{background-color: lightblue;}    
    <div>第一个 div</div>
    <div>第二个 div</div>

 

速查表

  下面是伪类的速查表

    /* Logical Combinations */
    :matches() /*:any()*/   /* 匹配 集合内指定 的元素 */
    :not()                  /* 排除 满足指定关系 的元素 */
    :has()                  /* 匹配 满足指定关系 的元素*/
<span style="color: #008000;">/*</span><span style="color: #008000;"> Linguistic Pseudo-classes </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:dir()                  </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 设置dir(文字书写方向)属性 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:lang()                 </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 设置lang(定义元素语言)属性 的元素 </span><span style="color: #008000;">*/</span>


<span style="color: #008000;">/*</span><span style="color: #008000;"> Location Pseudo-classes </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:any</span>-link               <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 任意有链接锚点 的元素</span><span style="color: #008000;">*/</span><span style="color: #000000;">
:link                   </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 未处于访问记录中 的链接 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:visited                </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 处于访问记录中 的链接 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:target                 </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 URL指向的锚点 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:scope                  </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 设置scoped属性的style标签 的作用域 </span><span style="color: #008000;">*/</span>


<span style="color: #008000;">/*</span><span style="color: #008000;"> User Action Pseudo-classes </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:hover                  </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 处于鼠标悬停状态 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:active                 </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 处于激活状态 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:focus                  </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 处于聚焦状态 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:focus</span>-ring             <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 处于聚焦状态元素 的UA样式(聚焦轮廓) </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:focus</span>-within           <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 子节点处于聚焦状态 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:drop                   </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 处于拖拽状态 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:drop()                 </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 处于指定拖拽状态 的元素 </span><span style="color: #008000;">*/</span>


<span style="color: #008000;">/*</span><span style="color: #008000;"> Time-dimensional Pseudo-classes </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:current                </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 处于当前状态 的定义了timeline属性的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:past                   </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 处于过去状态 的定义了timeline属性的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:future                 </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 处于将来状态 的定义了timeline属性的元素 </span><span style="color: #008000;">*/</span>


<span style="color: #008000;">/*</span><span style="color: #008000;"> Resource State Pseudos </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:playing                </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 处于播放状态 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:paused                 </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 处于暂停状态 的元素 </span><span style="color: #008000;">*/</span>


<span style="color: #008000;">/*</span><span style="color: #008000;"> The Input Pseudo-classes </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:enabled                </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 可以编辑 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:disabled               </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 禁止编辑 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:read</span>-only              <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 内容只读 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:read</span>-write             <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 内容可编辑 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:placeholder</span>-shown      <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 显示字段占位符文本 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:</span><span style="color: #0000ff;">default</span>                <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 页面载入默认选中 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">

:</span><span style="color: #0000ff;">checked</span>                <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 选中状态 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:indeterminate          </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 模糊状态 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">

:valid                  </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 输入内容通过类型验证 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:invalid                </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 输入内容无法通过类型验证 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:</span><span style="color: #0000ff;">in</span>-range               <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 输入数值符合范围 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:</span><span style="color: #0000ff;">out</span>-of-range           <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 输入数值溢出范围 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:required               </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 设置必填属性 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:optional               </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 可选字段 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:user</span>-invalid           <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 用户输入内容未通过验证 的元素 </span><span style="color: #008000;">*/</span>

<span style="color: #008000;">/*</span><span style="color: #008000;"> Tree-Structural pseudo-classes </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:root                   </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 文档树 的根元素</span><span style="color: #008000;">*/</span><span style="color: #000000;">
:empty                  </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 无子节点 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:blank                  </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 仅包含空格或者换行符 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">

:nth</span>-child(n)           <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 符合元素集合中指定位置 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:nth</span>-last-child(n)      <span style="color: #008000;">/*</span><span style="color: #008000;"> 反序匹配 符合元素集合内指定位置 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:first</span>-child            <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 符合元素集合内首个 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:last</span>-child             <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 符合元素集合内末尾 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:only</span>-child             <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 无兄弟节点 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">

:nth</span>-of-type(n)         <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 符合元素集合中同类型指定位置 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:nth</span>-last-of-type(n)    <span style="color: #008000;">/*</span><span style="color: #008000;"> 反序匹配 符合元素集合中同类型指定位置 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:first</span>-of-type          <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 每个在元素集合中初次出现 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:last</span>-of-type           <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 每个在元素集合中末次出现 的元素 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:only</span>-of-type           <span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 无同类兄弟节点 的元素</span><span style="color: #008000;">*/</span>


<span style="color: #008000;">/*</span><span style="color: #008000;"> Fullscreen API </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:fullscreen             </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 匹配 全屏显示模式中 的元素 </span><span style="color: #008000;">*/</span>


<span style="color: #008000;">/*</span><span style="color: #008000;"> Page Selectors </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:first                  </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 打印文档时首页的样式 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:left                   </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 打印文档时左侧的样式 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
:right                  </span><span style="color: #008000;">/*</span><span style="color: #008000;"> 打印文档时右侧的样式 </span><span style="color: #008000;">*/</span></pre>