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 属性忽略,如果内容为空直接给空就可以,但是不能不写该属性。

相关推荐
橙光成长36 分钟前
PDF离线工具箱深度解析:4MB纯前端单文件,40+功能全本地运行,文件绝不上传
前端·pdf·1024程序员节
小poop7 小时前
CSS 基础与实战:从入门到精通网页美化
前端
Csvn9 小时前
运行时性能
前端
Never_every999 小时前
位图转矢量工具哪个好?实测抠抠图AI位图转矢量工具
大数据·前端
paopaokaka_luck10 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
空中湖10 小时前
用 React 写数据大屏:为什么我不建议用图表库
前端·react.js·前端框架
狮子座的男孩12 小时前
html+css基础:25、3D变换(3D空间与景深/透视点的位置/位移/旋转/缩放/多重变换/背部可见性)
css·经验分享·html·旋转·透视点·缩放/位移·3d变换/空间与景深
欣欣之王来了12 小时前
原始HTML插值:v-html指令的使用与安全风险
前端·学习·架构·项目·vue3教程
IT_陈寒12 小时前
Redis的LRU淘汰策略坑了我一整天
前端·人工智能·后端
计算机魔术师12 小时前
砍半价格、参数再涨,国产旗舰追到 Opus 鼻尖了
前端