HTML + CSS 连载 | 10 - CSS 伪类和伪元素

一、伪类

Pseudo-classes伪类,伪类也是选择器的一种,它用于选择处于特定状态的元素,比如当鼠标放在一个元素上时,元素的文本会变色或者图片会变大等。

HTML 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    /* 鼠标放在元素上时,元素的文本会变色,字体会变大 */
    div:hover {
      color:red;
      font-size: 30px;
    }
  </style>
</head>
<body>
  <div class="box">我是div1</div>
  <div class="box">我是div2</div>
  <div class="box">我是div3</div>
</body>
</html>

当鼠标放到任何一个 div 元素上时,div 元素的文本都会变成红色,字体都会变大,效果如下:

:hover 就是一个伪类,且是一个非常常用的伪类,那么除了 :hover 之外还有其他的伪类,大概分为以下几类:

  • 动态伪类(dynamic pseudo-class)::link :visted :hover :active :focus
  • 目标伪类(target pseudo-classes)::target
  • 语言伪类(language pseudo-classes)::lang()
  • 元素状态伪类(UI element states pseudo-classes)::enabled :disabled :checked
  • 结构伪类(structural pseudo-classes)::nth-child() :nth-last-child() :nth-of-type() :nth-last-of-type() :first-child :last-child :first-of-type :last-of-type() :root :only-child :only-of-type :empty
  • 否定伪类(negation pseudo-classes)::not()

全部的结构伪类可以从 MDN 官网上查询到。

动态伪类

动态伪类包含以下几个伪类,以 a 元素为例分别是:

  • a:link:未访问的连接
  • a:visted:已访问的连接
  • a:hover:鼠标放到链接上
  • a:active:激活的链接,鼠标在链接上长按不松开

使用伪类时需要注意:

  • :hover 必须是放在 :link:visited 后面才有效
  • :active 必须放在 :hover 后面才能完全生效
  • 建议的编写顺序为 :link :visited :hover :active

动态伪类指定让元素的不同的状态下设置 CSS 样式,除了 a 元素, :hover:active 也可以作用在其他元素上

HTML 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    /* 对 a 元素使用动态伪类,一定要注意伪类的顺序 */
    a:link {
      color:red;
    }
    a:visited {
      color: green;
    }
    a:hover {
      color: blue;
    }
    a:active {
      color: purple;
    }
  </style>
</head>
<body>
  <a href="http://www.baidu.com">百度</a>
  <a href="http://www.bing.com">必应</a>
</body>
</html>

打开页面效果如下:

由于两个链接都没有访问过,也就是没被点击过,文本颜色为红色,一旦访问过之后就会变成绿色;

包括鼠标悬浮或者按住不放等不同的状态都会呈现 CSS 设置的颜色。

:focus 伪类指的是当前拥有输入焦点的元素,即能接收键盘的输入,如登录页面中输入文本框一聚焦就会变成红色;因为 a 元素可以在被键盘的 Tab 键选中,所以 :focus 伪类也可以作用于 a 元素。

加上 :focus 伪类,a 元素的伪类编写顺序建议为::link :visited :focus :hover :active

这种直接给元素的所有动态伪类都设置样式就相当于直接给 a 元素设置样式,当然分开设置可以给不同的状态设置不同的样式,或者直接设置,所有的状态都是一样的。

二、伪元素

伪元素可以创建一些不在文档树中的元素,并为其添加样式。就是选取某些元素前面或后面这种普通选择器无法完成的工作,虽然用户可以看到这些文本,但是这些文本实际上不在文档树中。

它可以用于设置元素的首字母、首行的样式 在元素的内容之前或之后插入内容。

常用的伪元素有:

  • :first-line 或者 ::first-line:可以针对首行文本设置属性
  • :first-letter 或者 ::first-letter:可以针对首字母设置属性
  • :before 或者 ::before:在指定内容前插入其他内容
  • :after 或者 ::after:在指定内容后插入其他内容

为了区分伪类和伪元素,建议伪元素使用两个冒号的形式。

::first-line 或者 ::first-letter 常用于首行和首字母的设置;

HTML 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 650px;
      background-color:#f00;
      color: whitesmoke;
    }

    /* 方式一:使用伪元素 ::first-line */
    .box::first-line {
      font-size: 30px;
      color: orange;
    }

    /* 方式二:也可以使用 span 元素 */
    /* .keyword {
      font-size: 30px;
      color: orange;
    } */
  </style>
</head>
<body>
  <div class="box">
    <span class="keyword">尼古拉.特斯拉Nikola Tesla(1856 -1943)。</span>1856年7月10日,他诞生于前南斯拉夫克罗地亚的斯米良,他父亲是一所教堂里的牧师,自小就在基督教的家庭里长大。1880年毕业于布 拉格大学后,于1884年移民美国成为美国公民,并获取耶鲁大学及哥伦比亚大学名誉博士学位。
  </div>
</body>
</html>

在浏览器中打开页面,效果如下:

当然这种效果我们也可以使用 span 元素来实现。

::before ::after 这两个伪元素使用的频率比较高,比如新闻的排名或者热情度等,都可以通过这两个伪元素来为内容前后增加样式。

HTML 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .before {
      color: red;
    }

    .after {
      color: blue;
    }
    
    .box3::before {
      content: "伪序3"
    }

    .box3::after {
      content: "伪尾3"
    }

  </style>
</head>
<body>
  <div class="box1">
    <span class="before">序号1</span>
    内容1
    <span class="after">尾部1</span>
  </div>
  <div class="box2">
    <span class="before">序号2</span>
    内容2
    <span class="after">尾部2</span>
  </div>
  <div class="box3">内容3</div>
</body>
</html>

浏览器打开 HTML 页面,效果如下:

可以看到通过伪元素成功的在第三个 div 内容的前后插入指定的内容,除此之外我们还可以对插入的内容进行样式的设置,修改 CSS 代码:

CSS 复制代码
    .box3::before {
      content: "伪序3";
      color:antiquewhite;
      font-size: 30px;
    }

    .box3::after {
      content: "伪尾3";
      color: aquamarine;
      font-size: 30px;
    }

再次打开该 HTML 页面

可以看到通过伪元素设置的内容已经被成功添加了样式,需要注意的是在使用伪元素的过程中,不要将 content 属性忽略,如果内容为空直接给空就可以,但是不能不写该属性。

相关推荐
小鑫同学8 分钟前
Alias Assistant:新一代 macOS Shell 别名管理解决方案
前端·前端工程化
꒰ঌ小武໒꒱8 分钟前
RuoYi-Vue 前端环境搭建与部署完整教程
前端·javascript·vue.js·nginx
名字越长技术越强26 分钟前
前端之相对路径
前端
望道同学1 小时前
PMP/信息系统项目管理师 9 张 思维导图【考试必备】
前端·后端·程序员
局i2 小时前
Vue 中 v-text 与 v-html 的区别:文本渲染与 HTML 解析的抉择
前端·javascript·vue.js
菜鸟冲锋号2 小时前
问题:增量关联(实时同步新数据) 这个场景中,如果hudi_pay 变更了一条数据,hudi_order_pay_join 结果的数据会跟着变化吗
服务器·前端·数据库
贩卖黄昏的熊2 小时前
typescript 快速入门
开发语言·前端·javascript·typescript·ecmascript·es6
拾柒SHY3 小时前
XSS-Labs靶场通关
前端·web安全·xss
前端婴幼儿3 小时前
前端主题切换效果
前端
一 乐3 小时前
水果销售|基于springboot + vue水果商城系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端