CSS中的伪类和伪元素

核心概念总结(一句话区分)

  • 伪类 :用于选择处于 特定状态已有元素

    • 例如:鼠标悬停时的状态、被点击后的状态、是第一个子元素等。

    • 语法:单冒号 :

  • 伪元素 :用于选择并样式化元素的 特定部分 ,或者 创建不在文档树中的虚拟元素

    • 例如:元素的第一行字母、在元素内容前后插入新内容等。

    • 语法:双冒号 :: (CSS3 规范,但单冒号 : 也兼容)


一、伪类

伪类就像一个"类",它不会改变文档结构,而是根据用户行为、文档结构或其他外部条件来为某些元素应用样式。

1. 常见伪类别表
伪类 描述 示例
动态/用户行为伪类
:hover 鼠标悬停在元素上时 a:hover { color: red; }
:active 元素被激活时(如鼠标按下未松开) button:active { background: blue; }
:focus 元素获得焦点时(如表单输入框) input:focus { border-color: green; }
:visited 已访问过的链接 a:visited { color: purple; }
结构伪类
:first-child 选择作为其父元素第一个子元素的元素 li:first-child { font-weight: bold; }
:last-child 选择作为其父元素最后一个子元素的元素 li:last-child { color: gray; }
:nth-child(n) 选择作为其父元素第 n 个子元素的元素 li:nth-child(2) { ... } (选择第二个) li:nth-child(even) { ... } (选择偶数位) li:nth-child(odd) { ... } (选择奇数位)
:nth-of-type(n) 选择在其父元素内,同类型兄弟元素中排第 n 个的元素 p:nth-of-type(2) { ... } (选择第二个 <p>
:not(selector) 否定伪类,选择不匹配选择器的元素 div:not(.container) { ... } (选择所有没有 container 类的 div)
表单相关伪类
:checked 被选中的单选/复选框 input[type="checkbox"]:checked { ... }
:disabled 被禁用的表单元素 input:disabled { opacity: 0.5; }
:required 具有 required 属性的表单元素 input:required { border: 1px solid red; }
2. 伪类示例代码
html 复制代码
<!DOCTYPE html>
<html>
<head>
<style>
  /* 用户行为伪类 */
  .btn:hover {
    background-color: #4CAF50; /* 鼠标悬停时变绿 */
  }
  .btn:active {
    transform: scale(0.98); /* 按下时轻微缩小 */
  }

  /* 结构伪类 */
  ul li:first-child {
    color: red; /* 列表第一项为红色 */
  }
  ul li:nth-child(3) {
    font-style: italic; /* 列表第三项为斜体 */
  }

  /* 否定伪类 */
  p:not(.special) {
    opacity: 0.7; /* 所有没有 special 类的 p 标签变半透明 */
  }
</style>
</head>
<body>

  <button class="btn">悬停我</button>
  <ul>
    <li>第一项(红色)</li>
    <li>第二项</li>
    <li>第三项(斜体)</li>
  </ul>
  <p>这是一个普通段落(半透明)。</p>
  <p class="special">这是一个特殊段落。</p>

</body>
</html>

二、伪元素

伪元素就像一个"虚拟的 HTML 元素",它允许你为元素的特定部分设置样式,而这些部分并不实际存在于文档流中。

1. 常见伪元素列表
伪元素 描述 示例
::before 元素内容之前插入内容 p::before { content: ">> "; }
::after 元素内容之后插入内容 .clearfix::after { content: ""; clear: both; }
::first-line 选择元素的第一行文本 p::first-line { font-variant: small-caps; }
::first-letter 选择元素的第一个字母 p::first-letter { font-size: 2em; }
::selection 选择被用户高亮/选中的部分 ::selection { background: yellow; }
::placeholder 选择表单元素的占位符文本 input::placeholder { color: #999; }

重要提示 :使用 ::before::after 时,必须 指定 content 属性,即使它是空的 (content: "";)。

2. 伪元素示例代码
html 复制代码
<!DOCTYPE html>
<html>
<head>
<style>
  /* 在内容前后插入 */
  blockquote::before {
    content: """;
    font-size: 3em;
    color: lightgray;
  }
  blockquote::after {
    content: """;
    font-size: 3em;
    color: lightgray;
  }

  /* 首字下沉 */
  p::first-letter {
    font-size: 200%;
    float: left;
    line-height: 1;
  }

  /* 选中文本样式 */
  ::selection {
    background-color: pink;
    color: black;
  }

  /* 使用 ::after 清除浮动 (经典技巧) */
  .container::after {
    content: "";
    display: table;
    clear: both;
  }
</style>
</head>
<body>

  <blockquote>这是一个名人名言。</blockquote>

  <p>这是一个段落的开始,它的第一个字母会非常大,形成首字下沉效果。后面的文字会正常排列。</p>

</body>
</html>

三、关键区别与记忆技巧

特征 伪类 伪元素
作用对象 整个元素的某种状态 元素的某个特定部分
文档结构 选择已存在的元素 创建一个虚拟的元素/部分
语法 :hover, :first-child ::before, ::first-letter
核心概念 状态 部分

记忆技巧

  • 想想"类"(class),它是一个真实的属性。伪类 就是为一个元素在特定状态 下添加了一个虚拟的类(比如 .hover)。

  • 想想"元素"(element),它是一个真实的标签。伪元素 就是在文档中创建 了一个虚拟的元素(比如 <before>)。

总结

理解并熟练运用伪类和伪元素,是编写现代、高效 CSS 的关键。它们让你能够:

  • 在不修改 HTML 结构的情况下,实现丰富的交互效果(伪类)。

  • 创建精致的视觉效果和布局,而无需添加无意义的冗余标签(伪元素)。

相关推荐
一个小潘桃鸭2 小时前
组件抽离:el-upload支持图片粘贴上传并添加预览
前端
快乐就好ya2 小时前
React基础到进阶
前端·javascript·react.js
小龙在山东3 小时前
VS Code 使用 Chrome DevTools MCP 实现浏览器自动化
前端·自动化·chrome devtools
悠哉摸鱼大王3 小时前
多模态场景下tts功能实现
前端·javascript
东华帝君3 小时前
__proto__对比prototype
前端
夜晓码农3 小时前
VSCode Web版本安装
前端·ide·vscode
初出茅庐的3 小时前
hooks&&状态管理&&业务管理
前端·javascript·vue.js
aricvvang3 小时前
一行 Promise.all 争议:数据库查询并行真的没用?我和同事吵赢了!!!
javascript·后端·node.js
三掌柜6663 小时前
2025三掌柜赠书活动第三十五期 AI辅助React Web应用开发实践:基于React 19和GitHub Copilot
前端·人工智能·react.js