CSS 面试题 目录

请解释伪类 (Pseudo-classes) 和伪元素 (Pseudo-elements) 的区别和作用,并分别列举几个常用的。

推荐答案

伪类(Pseudo-classes)和伪元素(Pseudo-elements)都是 CSS 中用于选择元素的特殊选择器,但它们有本质的区别:

伪类 (Pseudo-classes)

  • 作用:伪类用于选择元素的特殊状态,而不是元素本身。它们基于元素的状态、属性或者位置进行选择。
  • 表示符:使用冒号 (:) 连接。
  • 例子
    • a:hover (鼠标悬停在链接上)
    • input:focus (输入框获取焦点)
    • li:first-child (列表的第一个子元素)
    • button:disabled (被禁用的按钮)
    • a:visited (用户已访问过的链接)

伪元素 (Pseudo-elements)

  • 作用:伪元素用于选择元素的特定部分,而不是元素本身。它们创建了抽象的元素,可以被样式化。
  • 表示符:使用双冒号 (::) 连接(CSS3 新规范,但单冒号 : 仍兼容)。
  • 例子
    • p::first-line (段落的第一行)
    • p::first-letter (段落的第一个字母)
    • div::before (在 div 元素前插入内容)
    • div::after (在 div 元素后插入内容)
    • ::selection (用户选择的文本)

总结区别

  • 选择目标:伪类选择的是元素的状态,而伪元素选择的是元素的部分。
  • 抽象性:伪类是已经存在的元素状态,伪元素是抽象的、虚构出来的元素部分。
  • 用法:伪类是选择符的一部分,用来匹配符合特定状态的元素;伪元素像是附着在元素上的特殊结构,用来设置额外的样式。

本题详细解读

伪类 (Pseudo-classes)

伪类主要用于根据元素的状态或位置来选择元素,它们不会创建新的元素,而是对现有元素进行样式化。

常用伪类举例及详解:

  • :hover:当鼠标指针悬停在元素上方时,应用样式。常用于创建交互效果,如按钮颜色改变、显示提示信息等。
  • :focus:当元素获取焦点时(例如用户点击输入框),应用样式。用于提升表单的可用性。
  • :active:当元素被激活时(例如用户点击鼠标按钮但尚未松开),应用样式。常用于按钮点击效果。
  • :first-child / :last-child:选择父元素中的第一个或最后一个子元素。常用于列表或表格的样式设置。
  • :nth-child(n) / :nth-last-child(n):选择父元素中指定顺序的子元素,n 可以是数字、odd(奇数)或 even(偶数)。
  • :disabled / :enabled:选择被禁用或启用的表单元素。用于根据表单状态设置样式。
  • :visited / :link:选择用户已访问或未访问的链接。
  • :not(selector): 否定选择器,选择不符合给定选择器的元素

伪元素 (Pseudo-elements)

伪元素用于创建虚拟元素,它们可以用来添加内容或对元素的部分进行样式化。伪元素是抽象的,不真正存在于 HTML 结构中。

常用伪元素举例及详解:

  • ::before / ::after:在元素内容的前面或后面插入内容。常用于添加装饰性的内容,例如图标、分隔线,以及实现一些复杂的布局。
    -- -------------------- ---- -------
    ------------ -
      -------- ---
      -------- ------
      ------ -----
      ------- -----
      ----------------- ----
      --------- ---------
      ---- --
      ----- --
    -
  • ::first-line:选择元素的第一行文本。
  • ::first-letter:选择元素的第一个字母。常用于实现首字放大效果。
  • ::selection:选择用户选中的文本。可以改变选中时的背景颜色和文本颜色。
  • ::placeholder: 改变输入框占位符的样式
  • ::marker: 改变列表项标记的样式

注意

  • 在 CSS2 中,伪元素使用单冒号 :,但在 CSS3 中建议使用双冒号 ::。为了兼容性,大多数浏览器仍然支持单冒号语法。但为了遵循标准,应尽量使用双冒号。
  • ::before::after 伪元素必须结合 content 属性使用,否则不会显示。
  • 伪元素不能被脚本访问,它们不属于 DOM 结构。
纠错
反馈