深入学习 CSS 中的伪元素 ::before 和 ::after

简介: CSS 伪元素用于为元素的指定部分设置样式,作为回顾,先来看下 Mozilla 开发者网站上的解释:伪元素是一个附加至选择器末的关键词,允许你对被选择元素的特定部分修改样式。例如 ::first-line 伪元素可用于更改段落首行文字的样式。

CSS 伪元素用于为元素的指定部分设置样式,作为回顾,先来看下 Mozilla 开发者网站上的解释:

伪元素是一个附加至选择器末的关键词,允许你对被选择元素的特定部分修改样式。例如 ::first-line 伪元素可用于更改段落首行文字的样式。

可用的 CSS 伪元素不是很多,但是,作为前端工程师熟悉它们很重要,每一个都有特定的用途,它们可以极大地改进项目 UI 。

以下是常用的 CSS 伪元素:

  • ::after
  • ::before
  • ::first-letter
  • ::first-line
  • ::marker
  • ::selection

它们看起来都相当简单且不言自明。但是,它们将帮助您构建一些简洁而强大的布局。你觉得哪一款最酷?

::before::after 是迄今为止最常用的伪元素,它们能够在保持 HTML 和 CSS 最小化的同时做非常酷的事情。

在本文,通过实例回顾一下 ::before::after  常见的用途。

语法

在开始之前,先来了解一下伪元素的一般语法:

selector::pseudo-element {
    property: value;
}

请注意上面的语法使用的是双冒号 (::) 而不是单个冒号 (:),这是 CSS3 语法。最初,CSS 的语法规范只有一个冒号(CSS2、CSS1)。

这一变化是由 W3C 推动的,主要目的是明确区分使用单个冒号的伪类。

它们之间有什么区别?简单来说,伪类是针对非呈现特征进行选择的;另一方面,伪元素是能够创建新的虚拟元素。为了向后兼容,CSS2 和 CSS1 中的单冒号语法在大多数浏览器中仍然被支持。

::before 和 ::after 如何工作?

这些伪元素用于在目标元素之前或之后添加内容,对内容的放置位置有一个常见的误解。许多人认为内容将放置在所选 HTML 标记之前或之后。相反,它将被放置在元素内容的前面或后面。 让看下面这个例子:

p::before {
    content: "DevPoint - ";
}
<p>天行无忌</p>

上面的 CSS 和 HTML 实现的效果等价于下面的 HTML:

<p>DevPoint - 天行无忌</p>

而不是:

DevPoint - <p>天行无忌</p>

就像::before::after 在元素的内容之前添加内容一样。但有一个不能正常工作的标:<img /> ,作用于这个标签的时候不会在其中添加任何内容。它只是媒体内容的替代品,意味着它不能处理任何伪元素。

content 属性

对于伪元素,content 属性是最主要的,默认情况下,内容设置为无。意味着如果尝试在不添加该属性的情况下设置元素的样式,实际上什么也不会发生,如下代码:

p::before { 
    display:block;
    width: 100%;
    height: 50px;
    background-color: #ff0000;
}
<p>天行无忌</p>

上面的实例代码,对于CSS样式来说没有任何实际意义。

接着在样式表中增加 content 属性,如下:

p::before {
    display:block;
    width: 100%;
    height: 50px;
    content: "";
    background-color: #ff0000;
}

上面的代码就可以在段落内容前面看到红色的区块。

即使不想添加任何文本,content 属性仍然需要使用 "" ,这是使用伪元素时最容易犯的错误之一。

content 属性功能强大,可以添加各种类型的内容,使用这个属性可以在伪元素上显示任何东西,可以是文本、图片等,在使用的时候需要注意下面两点:

  1. content 默认显示为 display-inline ,而不是 display:block
  2. content 为字符串时,用户将无法选择,意味着用户将无法使用鼠标选择复制它。

content

可以直接使用类似 content:"DevPoint" 的文本值,如果有过多的内容需要写入到 content 中,直接写在样式表的方式不够灵活。这里介绍一种更加灵活的方式,通过变量传递,如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <title>CSS 伪元素</title>
        <meta charset="utf-8" />
        <style>
            p {
                padding: 1.25rem;
                font-weight: bold;
                font-size: 0.75rem;
            }
            p::before {
                content: attr(data-before-text);
                background-color: #00ffff;
                margin-right: 0.625rem;
                padding: 0.625rem;
            }
        </style>
    </head>
    <body>
        <p data-before-text="DevPoint">Hello World!</p>
    </body>
</html>

效果如下:

image.png

上面的代码,通过元素属性 data-before-text 来为 content 属性传递其值。同样 content 还可以是图片资源,如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <title>CSS 伪元素</title>
        <meta charset="utf-8" />
        <style>
            p {
                padding: 1.25rem;
                font-weight: bold;
                font-size: 0.75rem;
            }
            p::before {
                content: url(https://www.devpoint.cn/Apps/Site/View/devpoint/public/images/favicon.png);
                background-color: #00ffff;
                margin-right: 0.625rem;
                padding: 0.625rem;
            }
        </style>
    </head>
    <body>
        <p>Hello World!</p>
    </body>
</html>

效果如下:

image.png

除了url、属性和字符串之外,content 属性还可以包含多种属性,如 countersquoteslinear-gradient 等,更多内容可以查阅 MDN Web Docs 上完整的列表。

实例展示

现在来看看 ::before::aftercontent 结合的常见实例效果。

1. 修饰

主要实例之一主要用于修饰,可以使用它们为元素添加一些视觉效果,如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <title>CSS 伪元素</title>
        <meta charset="utf-8" />
        <style>
            h1 {
                font-weight: bold;
                text-align: center;
            }
            h1::after {
                content: "";
                display: block;
                background-color: #19b5fe;
                height: 0.2em;
                width: 100%;
            }
            h1::before {
                content: "";
                display: block;
                background-color: #19b5fe;
                height: 0.2em;
                width: 100%;
            }
        </style>
    </head>
    <body>
        <h1>DevPoint</h1>
    </body>
</html>

效果如下:

image.png

2. blockquote

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <title>CSS 伪元素</title>
        <meta charset="utf-8" />
        <style>
            blockquote {
                font-weight: bold;
                font-size: 1rem;
                font-style: italic;
            }
            blockquote::before {
                content: open-quote;
                font-style: normal;
                color: #585563;
            }
            blockquote::after {
                content: close-quote " —— " attr(data-author);
                font-style: normal;
                color: #585563;
            }
        </style>
    </head>
    <body>
        <blockquote data-author="卡耐基">
            机遇固然重要,但不能坐等机遇,不然机遇会白白地从身边溜走。
        </blockquote>
    </body>
</html>

image.png

3. 排序列表

创建自定义 HTML 有序列表,可以通过使用 counter-resetcounter-incrementcountercounter-name)来实现。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <title>CSS 伪元素</title>
        <meta charset="utf-8" />
        <style>
            ol {
                list-style: none;
                counter-reset: chapter_counter;
            }
            li {
                margin-bottom: 2.5em;
                margin-left: 2.5em;
                position: relative;
                line-height: 2em;
            }
            li::before {
                content: counter(chapter_counter);
                counter-increment: chapter_counter;
                position: absolute;
                left: -2.8em;
                display: flex;
                align-items: center;
                justify-content: center;
                border-radius: 50%;
                font-style: normal;
                font-size: 0.8em;
                width: 2em;
                height: 2em;
                color: white;
                background-color: #0566e6;
                border: 2px solid #0046a1;
            }
        </style>
    </head>
    <body>
        <ol>
            <li>机遇固然重要,但不能坐等机遇,不然机遇会白白地从身边溜走。</li>
            <li>除了你自己,没有别的能够带给你平静。</li>
            <li>
                一个积极进取的人,总是朝着更高奋斗目标前进,来实现自己的远大理想。
            </li>
        </ol>
    </body>
</html>

image.png

总结

本文介绍了::before::after 两个伪元素基本知识和常见的用法。但并非本文介绍的用法,存在很多意想不到的效果,它们有助于减少不必要的标记并通过丰富元素来增加价值。


相关文章
|
2月前
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
transition过渡属性 早期在Web中要实现动画效果,都是依赖于JavaScript或Flash来完成。 但在CSS3中新增加了一个新的模块transition,它可以通过一些简单的CSS事件来触发元素的外观变化, 让效果显得更加细腻。简单点说,就是通过鼠标经过、获得焦点,被点击或对元素任何改变中触发, 并平滑地以动画效果改变CSS的属性值。 在CSS中创建简单的过渡效果可以从以下几个步骤来实现: 在默认样式中声明元素的初始状态样式; 声明过渡元素最终状态样式,比如悬浮状态; 在默认样式中通过添加
220 0
|
2月前
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
transform变形 css3在原来的基础上新增了变形和动画相关属性,通过这些属性可以实现以前需要大段JavaScript才能实现的 功能。 CSS3的变形功能可以对HTML组件执行位移、旋转、缩放、倾斜4种几何变换,这样的变换可以控制HTML组件 呈现出丰富的外观。 借助于位移、旋转、缩放、倾斜这4种几何变换,CSS3提供了transition动画。 transition动画比较简单,只要指定HTML组件的哪些CSS属性需要使用动画效果来执行变化,并指定动画时间,就可保证动画播放。 比transitio
159 1
|
2月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
伪类:伪类这个叫法源自于它们跟类相似,但实际上并没有类会附加到标记中的标签上。 伪类分为两种(以及新增的伪类选择器): UI伪类:会在HTML元素处于某种状态时(例如:鼠标指针位于连接上),为该元素应用CSS样式。 :hover 结构化伪类:会在标记中存在某种结构上的关系时 例如: 某元素是一组元素中的第一个或最后一个,为该元素应用CSS样式。 :not和:target(CSS3新增的两个特殊的伪类选择器)
188 1
|
3月前
|
前端开发 JavaScript
HTML/CSS/JavaScript基础学习day03-作业
本教程通过多个实例讲解JavaScript中for循环的常见用法,包括遍历数组、元素加1、求最大值/最小值、计算平均值、过滤偶数及字符串拼接等操作,并附有代码示例和运行结果图。
65 3
|
3月前
|
前端开发 JavaScript 算法
HTML/CSS/JavaScript基础学习day03-作业
本内容包含多个 JavaScript 编程示例,涵盖数组遍历、条件筛选、字符串处理、数值计算等常见操作,适合练习基础算法与逻辑思维。
110 5
|
3月前
|
前端开发 JavaScript
HTML/CSS/JavaScript基础学习day02-作业
本教程介绍了JavaScript基础编程练习,包括使用for循环打印数字、判断奇偶数、计算总和以及用if语句判断正数的方法。每部分均配有示例代码和运行结果图,帮助初学者理解循环与条件判断的应用。最后通过思维导图回顾所学内容,强化知识点记忆。
79 2
|
4月前
|
XML 人工智能 前端开发
HTML/CSS/JavaScript基础学习day02
阿铭学习day02内容涵盖VSCode常用插件安装与配置,如中文语言包、路径提示、Vue开发工具等,同时介绍了通义灵码AI编程助手的使用方法,提升开发效率。
78 1
|
3月前
|
前端开发 JavaScript 索引
HTML/CSS/JavaScript基础学习day04
阿铭学习JavaScript函数与对象的基础知识,包括函数定义、调用方式及参数使用,以及Array和String对象的常用操作。
105 0
|
3月前
|
JavaScript 前端开发 Java
HTML/CSS/JavaScript基础学习day03
本内容为阿铭学习JavaScript的第三天笔记,涵盖JavaScript基础概念、引入方式、基础语法、变量声明、数据类型、运算符、类型转换及流程控制语句等内容,适合初学者了解JavaScript编程语言的核心知识点。
93 0
|
Web App开发 前端开发
CSS入门级学习
css入门学习1:认识CSS  1.1:css简介,css全称是层叠样式表,Cascading style sheets   1.2:css的作用,主要是用于定义html内容在浏览器内的显示样式,如文字大小,颜色,字体加粗等     使用css样式的一个好处是通过定义某个样式,可以让不同的网页位置的字体有着统一的字体,字号或者颜色等   1.
1380 0