<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>伪类和伪元素 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E4%BC%AA%E7%B1%BB%E5%92%8C%E4%BC%AA%E5%85%83%E7%B4%A0/</link><description>Recent content in 伪类和伪元素 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 10 Nov 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E4%BC%AA%E7%B1%BB%E5%92%8C%E4%BC%AA%E5%85%83%E7%B4%A0/index.xml" rel="self" type="application/rss+xml"/><item><title>伪类和伪元素</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/css/css-002/</link><pubDate>Tue, 08 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/css/css-002/</guid><description>&lt;h2 id="什么是伪类和伪元素"&gt;什么是伪类和伪元素？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;伪类&lt;/strong&gt;：以冒号(:)开头，用于选择处于特定状态的元素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;伪元素&lt;/strong&gt;：以双冒号(::)开头，用于在文档中插入虚构的元素。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这么说有点抽象，我们来看具体案例。例如下面的伪类语法表达的意思是：&lt;strong&gt;文档里的那些已经被用户访问过的 a 标签，当鼠标悬浮在它上面的时候，颜色为红色。&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;a&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;visited&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;hover&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;red&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;效果如下：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/css/css-002/image-01.webp"&gt;&lt;/p&gt;
&lt;p&gt;可以看到，无论是 &lt;code&gt;visited&lt;/code&gt;还是 &lt;code&gt;hover&lt;/code&gt;，都表示了 a 标签的某种状态，选择器始终选择的是伪类前面的元素，只不过当出现伪类描述的状态时，样式才生效而已。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意，上面使用的是无痕浏览器打开的页面，是不可能出现 visited 状态的，因为无痕不记录访问历史，我们可以点击控制台的 :hov 图标手动勾选 :visited 和 :hover 来模拟 a 标签「已访问」和「悬浮」两种状态。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我们再来看一下伪元素的案例，下面的语法表达的意思是： &lt;strong&gt;div 标签里面首字的颜色为红色。&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt;::&lt;span style="color:#a6e22e"&gt;first-letter&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;red&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;效果如下：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://amatsuzero.github.io/LastStand/posts/frontend/css/css-002/image-02.webp"&gt;&lt;/p&gt;
&lt;p&gt;与伪类不同的是，首字并不是 div 元素的某种状态，而是浏览器创建出来的一个虚拟的元素，我们可以在上图的右下角看到 &lt;code&gt;Pseudo ::first-letter element&lt;/code&gt;提示，相当于浏览器自动选中了「彻」字。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：::first-letter 伪元素只作用于块状元素上面，如果把 div 换成 span，就无法选中首字了，除非手动设置 span 的 display 属性为 block 或 inline-block 等块状值。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;从上面的案例当中，我们可以得出两个结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;伪类用于&lt;strong&gt;向某些已经存在的选择器添加特殊效果（当状态改变时）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;伪元素用于&lt;strong&gt;将特殊效果添加到不存在的虚拟元素中（浏览器自动创建）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也就是说伪类的本质还是类（class），作用于标签本身，只不过限定了状态条件；而伪元素的本质是元素（element），作用于该虚拟元素的内容本身。&lt;/p&gt;
&lt;h2 id="伪类有哪些"&gt;伪类有哪些？&lt;/h2&gt;
&lt;p&gt;按照功能，可划分为以下几类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;动态伪类：&lt;code&gt;:visited&lt;/code&gt;、&lt;code&gt;:focus&lt;/code&gt;、&lt;code&gt;:hover&lt;/code&gt;等&lt;/li&gt;
&lt;li&gt;状态伪类：&lt;code&gt;:disabled&lt;/code&gt;、&lt;code&gt;:empty&lt;/code&gt;、&lt;code&gt;:required&lt;/code&gt; 等&lt;/li&gt;
&lt;li&gt;结构伪类：&lt;code&gt;:first-child&lt;/code&gt;、&lt;code&gt;:nth-of-type&lt;/code&gt;等&lt;/li&gt;
&lt;li&gt;其他伪类：&lt;code&gt;:target&lt;/code&gt;、&lt;code&gt;:lang&lt;/code&gt;、&lt;code&gt;:not()&lt;/code&gt;等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面的表格详细记录了各种伪类及其描述：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;伪类&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;描述&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;兼容性&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:active&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素处于活动状态时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Aactive"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:focus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素已获取焦点时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Afocus"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:hover&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素处于悬浮状态时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Ahover"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:link&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;链接未访问时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Alink"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:visited&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;链接已访问时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Avisited"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:first-child&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素是首个子元素时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Afirst-child"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:last-child&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素是最后一个子元素时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Alast-child"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:nth-child()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素是第 n 个子元素时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Anth-child"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:nth-last-child()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素是倒数第 n 个子元素时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Anth-last-child"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:only-child&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素是唯一子元素时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Aonly-child"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:first-of-type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素是首个特定类型的子元素时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Afirst-of-type"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:last-of-type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素是最后一个特定类型的子元素时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Alast-of-type"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:nth-of-type()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素是第 n 个特定类型的子元素时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Anth-of-type"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:nth-last-of-type()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素是倒数第 n 个特定类型的子元素时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Anth-last-of-type"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:only-of-type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素是唯一的特定类型的子元素时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Aonly-of-type"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:not&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不满足指定条件时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Anot"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:target&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素 id 匹配到哈希值时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Atarget"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:root&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素是文档树的根元素时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Aroot"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:lang()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;匹配到指定语言时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Alang"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:empty&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;元素处于没有子元素状态时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Aempty"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:invalid&lt;/code&gt; 和 &lt;code&gt;:valid&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;表单项是否有效&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Avalid"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:required&lt;/code&gt; 和 &lt;code&gt;:optional&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;表单项是否必填&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Arequired"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:in-range&lt;/code&gt;和 &lt;code&gt;:out-of-range&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;表单项是否超出范围&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Ain-range"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:read-only&lt;/code&gt;和 &lt;code&gt;:read-write&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;表单项是否只读&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Aread-only"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:enabled&lt;/code&gt;和 &lt;code&gt;:disabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;表单项是否禁用&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Aenabled"&gt;✅&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:fullscreen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;当前处于全屏显示模式时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Afullscreen"&gt;⚠️&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:blank&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;输入框处于输入为空状态时&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;:dir()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;匹配到特定文字书写方向时&lt;/td&gt;
&lt;td&gt;&lt;a href="https://caniuse.com/?search=%3Adir"&gt;❌&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;上表中的兼容性表示：&lt;/p&gt;</description></item></channel></rss>