CSS ::before/::after 实战:5个场景解析 content 属性的 3 种高级用法
CSS ::before/::after 实战5个场景解析 content 属性的 3 种高级用法当你在浏览网页时是否注意过那些精致的图标提示、自动编号的列表或是图片加载失败时的优雅降级效果这些看似简单的界面细节背后往往隐藏着CSS伪元素的魔法。作为前端开发者掌握::before和::after伪元素的高级用法能让你在减少DOM节点的同时实现更丰富的视觉效果。1. 动态属性注入content: attr() 的实战应用attr()函数可能是伪元素中最被低估的功能之一。它允许你直接将HTML元素的属性值提取到CSS中实现动态内容展示。这种技术特别适合需要根据数据状态动态更新样式的场景。1.1 图片加载失败的优雅降级传统做法中当图片加载失败时浏览器会显示破碎的图标和alt文本。通过attr()我们可以创建更专业的错误提示img srcnon-existent.jpg alt风景照片 >.enhanced-image { position: relative; min-width: 200px; min-height: 150px; background: #f5f5f5; } .enhanced-image::before { content: url(broken-image-icon.svg); position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .enhanced-image::after { content: attr(data-error) : attr(alt); position: absolute; bottom: 0; width: 100%; text-align: center; color: #666; padding: 8px; font-size: 14px; }关键点解析使用min-width/height确保容器尺寸稳定::before插入SVG图标作为视觉提示::after组合显示自定义错误信息和alt文本通过绝对定位实现图层叠加效果1.2 动态Tooltip提示无需JavaScript仅用CSS就能实现简单的提示功能button >.tooltip-btn { position: relative; } .tooltip-btn:hover::after { content: attr(data-tooltip); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: #333; color: white; padding: 6px 12px; border-radius: 4px; white-space: nowrap; font-size: 14px; margin-bottom: 8px; } .tooltip-btn:hover::before { content: ; position: absolute; bottom: calc(100% - 5px); left: 50%; transform: translateX(-50%); border: 5px solid transparent; border-top-color: #333; }效果增强技巧添加过渡动画transition: opacity 0.3s ease支持多行文本white-space: normal; width: 200px暗黑模式适配media (prefers-color-scheme: dark)2. 自动计数系统content: counter() 的进阶技巧CSS计数器提供了强大的自动编号能力远比使用有序列表更灵活。让我们看看如何超越基础用法。2.1 多级目录编号创建类似文档的多级标题编号系统body { counter-reset: chapter section subsection; } h2 { counter-increment: chapter; counter-reset: section; } h3 { counter-increment: section; counter-reset: subsection; } h4 { counter-increment: subsection; } h2::before { content: counter(chapter) . ; } h3::before { content: counter(chapter) . counter(section) ; } h4::before { content: counter(chapter) . counter(section) . counter(subsection) ; }样式优化建议添加右间距margin-right: 8px设置不同颜色color: #6c757d调整字体粗细font-weight: normal2.2 交互式步骤指示器结合复选框实现动态步骤跟踪div classsteps input typecheckbox idstep1 checked label forstep1填写基本信息/label input typecheckbox idstep2 label forstep2验证邮箱/label input typecheckbox idstep3 label forstep3完成注册/label /div.steps { counter-reset: step; } .steps label { position: relative; padding-left: 30px; margin-right: 20px; } .steps label::before { counter-increment: step; content: counter(step); position: absolute; left: 0; width: 24px; height: 24px; border: 2px solid #dee2e6; border-radius: 50%; text-align: center; line-height: 24px; color: #6c757d; } input:checked label::before { background: #007bff; color: white; border-color: #007bff; } input:checked label::after { content: ✓; position: absolute; left: 7px; color: white; font-size: 12px; }交互增强添加过渡效果transition: all 0.3s ease禁用样式input:disabled label::before错误状态input:invalid label::before3. 动态资源加载content: url() 的创意应用url()函数不仅能加载图片还能与CSS变量结合实现主题切换等高级功能。3.1 主题化图标系统:root { --icon-check: url(icons/check-light.svg); --icon-arrow: url(icons/arrow-right-light.svg); } [data-themedark] { --icon-check: url(icons/check-dark.svg); --icon-arrow: url(icons/arrow-right-dark.svg); } .icon-check::before { content: var(--icon-check); display: inline-block; width: 16px; height: 16px; } .btn-next::after { content: var(--icon-arrow); margin-left: 8px; }性能优化使用SVG雪碧图减少HTTP请求添加aria-hiddentrue提升可访问性考虑使用use替代CSS加载SVG3.2 响应式图片切换根据设备像素比加载不同分辨率图片.hero::before { content: url(hero-lowres.jpg); } media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { .hero::before { content: url(hero-highres.jpg); } }现代替代方案使用picture元素更语义化考虑使用image-set()函数配合object-fit控制图片显示4. 复合内容生成组合多种content值将多种content值组合使用可以创造出更丰富的效果。4.1 带计数器的引用样式blockquote { counter-increment: quote; position: relative; padding-left: 60px; } blockquote::before { content: “ counter(quote) ”; position: absolute; left: 0; font-size: 60px; line-height: 1; color: #eee; } blockquote::after { content: — attr(data-author); display: block; text-align: right; font-style: italic; color: #666; }排版技巧使用quotes属性定义自定义引号添加max-width控制行长考虑使用ch单位设置缩进4.2 表单验证提示input typeemail >.validated-input:invalid::after { content: attr(data-error); display: block; color: #dc3545; font-size: 12px; margin-top: 4px; } .validated-input:valid::before { content: url(checkmark.svg); position: absolute; right: 10px; top: 50%; transform: translateY(-50%); }增强体验添加过渡动画使用:focus状态强化反馈配合:placeholder-shown优化空状态5. 伪元素的伪元素嵌套内容技巧虽然技术上伪元素不能再有伪元素但通过巧妙组合可以实现类似效果。5.1 多层Tooltip.tooltip::after { content: attr(data-tooltip); /* 基础样式 */ } .tooltip:hover::after { animation: fadeIn 0.3s forwards; } keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }进阶技巧使用>.progress::before { content: ; position: absolute; top: 0; left: 0; height: 100%; width: var(--progress, 0%); background: linear-gradient(to right, #4cd964, #5ac8fa); } .progress::after { content: var(--progress); position: absolute; right: 10px; top: 50%; transform: translateY(-50%); color: white; font-size: 12px; mix-blend-mode: difference; }交互实现使用JavaScript更新--progress变量添加transition实现平滑变化考虑使用progress元素增强语义伪元素性能优化与最佳实践虽然伪元素非常强大但也需要注意使用方式可访问性考虑伪元素内容不会被屏幕阅读器读取关键信息必须存在于真实DOM中使用aria-label补充说明性能优化避免在伪元素中使用大图减少复杂动画的使用使用will-change提示浏览器优化维护建议添加注释说明伪元素的用途保持命名一致性如.btn--icon考虑使用Sass/Less管理复杂样式/* 伪元素样式表规范示例 */ .element { position: relative; /* 基础样式 */ } .element::before { /* [图标] 用于表示状态指示 */ content: ; position: absolute; /* 定位样式 */ } .element::after { /* [装饰] 用于视觉增强效果 */ content: ; /* 样式定义 */ }通过合理运用::before和::after伪元素我们可以在不增加HTML复杂度的前提下实现各种精致的界面效果。记住伪元素最适合用于装饰性内容而非关键功能内容。

相关新闻

OpenGauss JDBC 驱动 1.1.0 与 3.x 版本对比:连接字符串与性能差异解析

OpenGauss JDBC 驱动 1.1.0 与 3.x 版本对比:连接字符串与性能差异解析

OpenGauss JDBC 驱动 1.1.0 与 3.x 版本深度对比:连接配置与性能优化实战1. 驱动版本演进与核心差异OpenGauss 作为国产开源数据库的代表,其 JDBC 驱动经历了从兼容 PostgreSQL 到独立发展的过程。1.1.0 版本采用org.postgresql.Driver作为驱动类&#x…

2026/7/7 23:46:16阅读更多 →
三步轻松下载B站会员专属视频:构建个人离线视频库的完整指南

三步轻松下载B站会员专属视频:构建个人离线视频库的完整指南

三步轻松下载B站会员专属视频:构建个人离线视频库的完整指南 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 你是否曾经遇…

2026/7/7 23:46:16阅读更多 →
Ubuntu 桌面 .desktop 文件详解:3个关键参数修复 Anaconda 图标启动失败

Ubuntu 桌面 .desktop 文件详解:3个关键参数修复 Anaconda 图标启动失败

Ubuntu 桌面 .desktop 文件深度解析:解决 Anaconda 图标启动失败的终极方案 在 Ubuntu 桌面环境中,.desktop 文件是连接用户与应用程序的重要桥梁。然而,许多用户在创建 Anaconda 桌面快捷方式时,常常遇到图标不显示或无法启动的问…

2026/7/7 23:46:16阅读更多 →
测试转大模型:上线前最该检查的几件事

测试转大模型:上线前最该检查的几件事

这篇我按“先跑起来、再讲取舍”的方式写《测试转大模型:上线前最该检查的几件事》。概念会讲,但重点放在代码怎么组织、哪里容易踩坑。 摘要 先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做,以及…

2026/7/8 2:01:24阅读更多 →
Docsify小试牛刀

Docsify小试牛刀

前置安装环境: npm i docsify-cli -g 安装docsify cli客户端;初始化项目目录: docsify init . ,这会在当前目录下创建工作目录,默认有:index.html : 整站是一个单页面静态页面README.md: 默认的…

2026/7/8 2:01:24阅读更多 →
SQL注入纵深防御实战:7种核心技术构建企业级安全体系

SQL注入纵深防御实战:7种核心技术构建企业级安全体系

1. 项目概述:从“攻”到“防”的实战视角SQL注入,这个在网络安全领域“经久不衰”的经典漏洞,至今仍是导致数据泄露的头号元凶之一。很多开发者,甚至是一些有一定经验的运维人员,对这个词的理解可能还停留在“在输入框…

2026/7/8 2:01:24阅读更多 →
我和 TRAE AI聊了聊,它帮我为五迷老师们做了个城市漫游小程序!

我和 TRAE AI聊了聊,它帮我为五迷老师们做了个城市漫游小程序!

最近得空参加胡彦斌安利的TRAE AI创造力大赛,提交了Demo: 【生活娱乐赛道】MaydayLand 五月天城市漫游:跟着歌词,发现城市里的五迷角落 希望大家能为我投票哈~ (本篇内容源引该Demo帖子) 0. 先和大家打个招…

2026/7/8 2:01:24阅读更多 →
深圳猎吧科技LB4G12宽电压4G智能中控产品技术全解析

深圳猎吧科技LB4G12宽电压4G智能中控产品技术全解析

引言 在新国标两轮电动车合规监管、共享电单车精细化运营、民用电动车防盗智能化升级的产业背景下,集卫星定位、物联网通信、整车电控、多维度安防告警于一体的智能中控,已成为两轮车数字化管理的核心硬件载体。深圳猎吧科技推出的 LB4G12 电动车智能中控…

2026/7/8 2:01:24阅读更多 →
数据通道:RTCDataChannel 可靠与不可靠传输

数据通道:RTCDataChannel 可靠与不可靠传输

数据通道:RTCDataChannel 可靠与不可靠传输WebRTC 不止能传音视频,还能通过 DataChannel 传任意数据:文字消息、文件、游戏数据、白板指令。这篇讲 RTCDataChannel 的用法、可靠与不可靠模式、消息顺序、流量控制,以及实际应用场景…

2026/7/8 1:56:24阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/7 4:43:43阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/7 2:56:31阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/7 1:03:28阅读更多 →
作为一个给团队打绩效的人,我想说几句

作为一个给团队打绩效的人,我想说几句

我每半年都会给团队成员打绩效,也会参与和 CTO 的绩效校准,所以从管理者的视角,说说这件事 首先,我先把结论告诉你:接受结果,但一定要把原因问清楚。 因为当绩效公布到你这里的时候,结果基本已…

2026/7/8 0:01:17阅读更多 →
A股股指期货:全维度解析(多表格结构化完整版)

A股股指期货:全维度解析(多表格结构化完整版)

一、基础定义与核心本质股指期货全称股票价格指数期货,是中国金融期货交易所(中金所)上市的标准化金融期货合约,交易标的为 A 股大盘指数,约定未来特定时间按约定价格现金交割指数涨跌差价,不交割一篮子股票…

2026/7/8 0:01:17阅读更多 →
iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事

iOS越狱新手指南:从困惑到掌控,3天解锁iPhone无限潜能的真实故事 【免费下载链接】Jailbreak iOS 26.4 - 26, 17 - 17.7.5 & iOS 18 - 18.7.3 Jailbreak Tools, Cydia/Sileo/Zebra Tweaks & Jailbreak News Updates || AI Jailbreak Finder &…

2026/7/8 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/7 5:11:21阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/7 5:11:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/7 5:11:21阅读更多 →