CSS 中的 ::before 和 ::after 伪元素

news2024/11/16 21:02:50

目录

一、CSS 伪元素

二、::before  ::after 介绍

1、::before

2、::after

3、content 常用属性值

三、::before  ::after 应用场景

1、设置统一字符

2、通过背景添加图片

3、添加装饰线

4、右侧展开箭头

5、对话框小三角

6、插入icon图标


一、CSS 伪元素

CSS伪元素是指,在CSS 中使用一些特殊的选择器,创建出来的虚拟元素, 并不是实际存在的HTML元素;

  • 用来选择和操作文档中的特定部分,实现一些特殊效果;
  • 伪元素使得在不增加额外HTML标签的情况下,对文档中的内容进行样式化;
  • 伪元素也是一种元素,可以设置html中支持的各种属性,包括元素的布局、定位、宽高、背景等等;

本文主要介绍::before 、::after 这个两个伪元素的相关内容和一些使用场景;

二、::before  ::after 介绍

::before  ::after 伪元素用来给元素前面或者后面插入指定内容;

  • 使用content属性来指定要插入的内容;
  • 必须配合content属性一起使用,content的属性值可以为空;
  • 伪元素的display属性值默认为inline

1、::before

::before选择器用来向指定元素之前插入内容;

(1)语法

元素::before{
    content: "要插入的内容";
    /* 其他属性 */
}

(2)示例

给页面所有的p元素前面插入内容;

<style>
    p::before{
        content: "使用::before伪元素插入的内容——";
        /* 其他属性 */
    }
</style>
<body>
    <div>
        <p>第一个P标签中的内容</p>
        <p>第二个P标签中的内容</p>
        <p>第三个P标签中的内容</p>
    </div>
</body>

2、::after

::after选择器用来向指定元素之后插入内容;

(1)语法

元素::after{
    content: "要插入的内容";
    /* 其他属性 */
}

(2)示例

给页面所有的p元素后面插入内容;

<style>
    p::after{
        content: "——使用::after伪元素插入的内容";
        /* 其他属性 */
    }
</style>
<body>
    <div>
        <p>第一个P标签中的内容</p>
        <p>第二个P标签中的内容</p>
        <p>第三个P标签中的内容</p>
    </div>
</body>

3、content 常用属性值

::before  ::after 必须配合content属性一起使用,以下是content的常用属性值:

序号属性值说明
1string设置文本内容;
2url("url")设置图片等媒体文件的URL链接;
3open-quote设置为前引号;
4close-quote设置为后引号;
5attr(attribute)将元素的 attribute 属性以字符串形式返回;
6counter设定计数器;
7none设置 content 为空值;
8normal在 :before 和 :after 伪类元素中会被视为 none,即也是空值;

(1)设置文本内容

设置content的属性值为string类型,即可给伪元素添加文本;

<style>
    span::before{
        content: "使用::before添加的文本前缀——————";
    }
    span::after{
        content: "————使用::after添加的文本后缀";
    }
</style>
......
<body>
    <span class="box">我是HTML元素中的文本</span>
</body>

(2)设置媒体链接

通过url()属性值,即可导入媒体文件为伪元素的内容;

<style>
    .container {
        margin: 100px;
    }
    .avatar::after{
        content: url("D:\\test\\girl.png");
        display: block;
    }
</style>
......
<body>
    <div class="container">
        <div class="avatar">示例图片</div>
    </div>
</body>

注意,这里使用url添加的图片不能设置大小,最好通过背景添加图片;

(3)设置前 || 后引号

通过open-quote或close-quote属性值,即可给设置伪元素的内容为前引号或后引号;

<style>
    p:nth-child(1)::before{
        content:open-quote;
        /* 其他属性 */
    }
    p:nth-child(2)::after{
        content:close-quote;
    }
</style>
......
<body>
    <div>
        <p>添加前引号</p>
        <p>添加后引号</p>
    </div>
</body>

(4)获取元素属性

通过attr()获取元素的某一个属性值(以字符串的形式返回),并设置为伪元素的内容;

<style>
    a:after {
        content: " (" attr(href) ")";
    }
</style>
......
<body>
    <div><a href="https://www.csdn.net">CSDN</a>点击跳转至CSDN...</div>
    <div><a href="https://www.baidu.com">百度</a>点击跳转至百度...</div>
</body>

(5)设置计数器

<style>
    div {
        counter-increment: index;
    }
    div:before {
        content:counter(index);
    }
</style>
......
<body>
    <div>、、、、、、我是第1个div、、、、、、</div>
    <div>、、、、、、我是第2个div、、、、、、</div>
    <div>、、、、、、我是第3个div、、、、、、</div>
    <div>、、、、、、我是第4个div、、、、、、</div>
</body>

三、::before  ::after 应用场景

虽然 ::before  ::after 这两个伪元素的使用方式非常简单,但若能灵活应用,就能实现一些很不错的CSS效果;

1、设置统一字符

<style>
    p::before{
        content: "* ";
        color: red;
        font-size: 24px;
        /* 其他属性 */
    }
    p::after{
        content: ":____________";
        /* 其他属性 */
    }
</style>
...
<body>
    <div>
        <p>姓名</p>
        <p>年龄</p>
        <p>出生日期</p>
        <p>居住地址</p>
    </div>
</body>

2、通过背景添加图片

<style>
    .container{
        margin: 100px;
    }
    .container::after{
        content: "";
        display:block;
        width: 260px;
        height: 260px;
        background-image: url("D:\\test\\girl.png");
        background-position: center;
        background-size: cover;
    }
</style>
......
<body>
    <div class="container">通过背景添加图片</div>
</body>

3、添加装饰线

<style>
    .line{
        display: flex;
        align-items: center;
        margin: 60px;
        height: 40px;
        font-size: 18px;
    }
    .line::before, .line::after{
        content: "";
        width: 300px;
        border-top: 6px double;
        margin: 5px;
    }
    
</style>
......
<body>
    <div class="line">添加装饰线</div>
</body>

4、右侧展开箭头

<style>
    .container{
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;

        width: 400px;
        margin: 100px auto;
        padding: 30px 0;
        border-radius: 8px;
        box-shadow: 0 0 4px 1px #acacac;
    }

    .setting-item{
        position: relative;
        align-items: center;
        display: flex;
        width: 300px;
        height: 40px;
        margin-bottom: 20px;
        border-bottom: 1px solid #ccc;
    }

    .setting-item::after{
        position: absolute;
        right: 0;
        content: "";
        width: 8px;
        height: 8px;
        border-top: 1px solid #666;
        border-right: 1px solid #666;
        transform: rotate(45deg);
    }
    
</style>
......
<body>
    <div class="container">
        <div class="setting-item">账号设置</div>
        <div class="setting-item">权限管理</div>
        <div class="setting-item">相关服务</div>
        <div class="setting-item">帮助与反馈</div>
        <div class="setting-item">......</div>
    </div>
</body>

5、对话框小三角

<style>
    .container {
        width: 400px;
        margin: 100px auto;
        padding: 30px 0;
        border-radius: 8px;
        box-shadow: 0 0 4px 1px yellowgreen;
    }

    .left-box,.right-box {
        display: flex;
    }

    .right-box {
        justify-content: end;
    }

    span {
        position: relative;
        display: flex;
        align-items: center;

        background-color: yellowgreen;
        border-radius: 6px;
        margin: 4px 14px;
        padding: 16px;
    }

    .left-box span::before, .right-box span::after{
        position: absolute;
        content: "";
        width: 12px;
        height: 12px;
        background-color: yellowgreen;
        transform: rotate(45deg);
    }

    .left-box span::before{
        left: -6px;
    }
    .right-box span::after {
        right: -6px;
    }
</style>

......

<body>
    <div class="container">
        <div class="left-box">
            <span>Nice to meet you!</span>
        </div>
        <div class="right-box">
            <span>Nice to meet you, too!</span>
        </div>
    </div>
</body>

6、插入icon图标

<style>
    .login-box{
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;

        width: 400px;
        height: 400px;
        margin: 100px auto;
        border-radius: 8px;
        box-shadow: 0 0 4px 1px #acacac;
    }
    .title{
        font-size: 24px;
        font-weight: 700;
        margin-bottom: 40px;
    }
    .account, .pwd, .login-btn, .forgot-pwd{
        width: 300px;
        height: 40px;
        line-height: 40px;
    }

    .account, .pwd{
        display: flex;
        align-items: center;
        border-bottom: 1px solid #ccc;
        font-size: 14px;
        color: #888;
    }
    .pwd{
        margin-top: 20px;
    }
    .account::before, .pwd::before{
        content: '';
        display: inline-block;  
        width: 24px;
        height: 24px;
        background-repeat: no-repeat;
        background-position: center center;
        background-size: contain;
        margin-right: 8px;
    }
    .account::before{
        background-image: url("D:\\test\\user.svg");
    }
    .pwd::before {
        background-image: url("D:\\test\\pwd.svg");
    }

    .login-btn{
        text-align: center;
        color: #fff;
        font-size: 16px;
        font-weight: 700;
        background: #2687F0;
        border-radius: 5px;
        margin-top: 40px;
    }

    .forgot-pwd{
        text-align: right;
        font-size: 14px;
        color: #888;
        margin-top: 20px;
    }
</style>
......
<body>
    <div class="login-box">
        <div class="title">XXX 管理系统</div>
        <div class="account">请输入账号</div>
        <div class="pwd">请输入密码</div>
        <div class="login-btn">登 录</div>
        <div class="forgot-pwd">忘记密码</div>
    </div>
</body>

=========================================================================

每天进步一点点~!

一个实用的CSS小技巧~!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1919609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库使用SSL加密连接

简介 数据库开通SSL加密连接是确保数据传输过程中安全性的关键措施&#xff0c;它通过加密数据、验证服务器身份、保护敏感信息、维护数据完整性和可靠性&#xff0c;同时满足行业标准和法规要求&#xff0c;进而提升用户体验和信任度&#xff0c;为企业的数据安全和业务连续性…

做工和音质都堪称典范!悠律Ringbuds pro耳机动感低音享受

想要长时间佩戴舒适&#xff0c;又要听歌看电影音质好&#xff0c;还想户外运动时不影响听到环境声音&#xff0c;开放式毋容置疑是最好的选择&#xff0c;像我每天坐地铁上下班的时候都会习惯戴耳机&#xff0c;但以前戴入耳式耳机的时候经常会错过站点&#xff0c;耽误了不少…

TREK高压功率放大器维修trek高压电源609E-6

美国Trek维修产品包括&#xff1a;高压放大器、电源、静电电压表、高压功能发生器、放大器、静电测量仪、荷电板、信号放大器、高压电源、功率放大器、高压功能发生器、高压放大器、接触电压表、非接触式电压表、板载控制器、ESD和传感器、ESD电压表、带电板、电离器、表面电阻…

HashMap----源码解读

源码分析&#xff1a; public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable 在类的开头声明了几个常量&#xff0c;以下是较为重要的&#xff1a; /*** 定义初始容量大小为16*/ static final int DEFAULT_I…

【射频器件供应】 Marki Microwave

射频、微波和毫米波组件 裸片、表面贴装、连接器和波导 直流至Sub-THz Marki Microwave通过创建强大的性能突破性射频和微波组件产品组合&#xff0c;解决了业界最棘手的技术问题。Marki Microwave 成立于 1991 年&#xff0c;以开发业内最好的混频器为目标&#xff0c;如今已…

kaggle提交csv文件

使用colab完成实验后 将要提交的csv文件拖到kaggle网站自己加入的competition就行 如果kaggle网站无法注册&#xff0c;往往是人机验证问题&#xff1a; kaggle网站验证

6-5,web3浏览器链接区块链(react+区块链实战)

6-5&#xff0c;web3浏览器链接区块链&#xff08;react区块链实战&#xff09; 6-5 web3浏览器链接区块链&#xff08;调用读写合约与metamask联动&#xff09; 6-5 web3浏览器链接区块链&#xff08;调用读写合约与metamask联动&#xff09; 这里就是浏览器端和智能合约的交…

语言模型演进:从NLP到LLM的跨越之旅

在人工智能的浩瀚宇宙中&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是一个充满挑战和机遇的领域。随着技术的发展&#xff0c;我们见证了从传统规则到统计机器学习&#xff0c;再到深度学习和预训练模型的演进。如今&#xff0c;我们站在了大型语言模型&#xff…

【最经典的79个】软件测试面试题(内含答案)提前备战“金九银十”

001.软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 0002.问&…

ctfshow-web入门-文件上传(web166、web167)(web168-web170)免杀绕过

目录 1、web166 2、web167 3、web168 4、web169 5、web170 1、web166 查看源码&#xff0c;前端只让传 zip 上传 zip 成功后可以进行下载 随便搞一个压缩包&#xff0c;使用记事本编辑&#xff0c;在其内容里插入一句话木马&#xff1a; 上传该压缩包&#xff0c;上传成功…

LLM独角兽们就要活不下去了!C.AI被资本抛弃,核心员工跑路;Perplexity陷入传统媒体口水战;微软发明的新型收购方式靠谱么?| ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;ShowMeAI官网 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 1. 亚马逊「招聘式收购」Adept AI&#xff0c;始作俑者微软正在被联邦「反垄断」调查 Adept AI 官网 → https://www.adept.ai Adept AI 成立于2022年4月&#xf…

分享一个 .NET 通过监听器拦截 EF 消息写日志的详细例子

前言 EF 开发效率确实很高也很便捷&#xff0c;但当它发生错误时&#xff0c;也挺让人头疼的&#xff0c;为什么&#xff1f;因为 EF 就像是一个黑盒子&#xff0c;一切全被封装起来&#xff0c;出错的时候很难定位原因&#xff0c;如果能够知道并打印 EF 生成的 SQL 语句&…

历年HW已公开漏洞合集!(目前漏洞库更新至84个,Goby持续更新...)

截至2024年7月11日&#xff0c;Goby红队版已扩充以下历年HW已公开漏洞库&#xff0c;本次更新84个&#xff1a; &#xff08;后续将持续更新…) 华天动力OA 华天动力 OA getHtmlContent 文件读取漏洞华天动力OA办公系统 /OAapp/bfapp/buffalo/TemplateService 文件读取漏洞华…

中国各省养老机构数据明细(更新至2024年)

中国养老机构是指为老年人提供集中居住、生活照顾、健康管理、文化娱乐等综合性服务的设施。这些机构包括养老院、福利院、老年公寓等多种形态&#xff0c;既有公立也有民办&#xff0c;遍布城市与农村。 一、数据介绍 数据名称&#xff1a;中国养老机构数据明细 数据范围&am…

【C++】使用C++实现基于Socket的通信

在本文中&#xff0c;我们将详细讨论如何使用C实现基于Socket的通信&#xff0c;并设计一个TLV&#xff08;Type-Length-Value&#xff09;协议用于数据交互。TLV协议因其灵活性和可扩展性&#xff0c;在多种通信协议中被广泛使用&#xff0c;特别是在需要动态定义数据结构的场…

软件架构之嵌入式系统设计

软件架构之嵌入式系统设计 第 12 章&#xff1a;嵌入式系统设计12.1 嵌入式系统概论12.2 嵌入式系统的组成12.2.1 硬件架构12.2.2 软件架构 12.3 嵌入式开发平台与调试环境12.3.1 嵌入式系统软件开发平台12.3.2 嵌入式开发调试 第 12 章&#xff1a;嵌入式系统设计 随着计算机…

# Redis 入门到精通(一)数据类型(3)

Redis 入门到精通&#xff08;一&#xff09;数据类型&#xff08;3&#xff09; 一、redis 数据类型–set 类型介绍与基本操作 1、set 类型 新的存储需求: 存储大量的数据&#xff0c;在查询方面提供更高的效率。需要的存储结构: 能够保存大量的数据&#xff0c;高效的内部…

MybatisPlus 核心功能

MybatisPlus 核心功能 文章目录 MybatisPlus 核心功能1. 条件构造器1.1 QueryWrapper1.2 LambdaQueryWrapper&#xff08;推荐&#xff09;1.3 UpdateWrapper1.4 LambdaUpdateWrapper 2. 自定义SQL3. Service接口 1. 条件构造器 当涉及到查询或修改语句时&#xff0c;MybatisP…

【C++】C++商店销售管理系统(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【C++】C++-机房收费管理系统(源码+注释)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…