伪元素与普通元素的层级关系问题浅析

前言:最近在开发过程中,遇到了要在一个 div 左上角加一个球球的需求,如图:

按部就班地,先写 dom:

jsx 复制代码
<section className='process-section-step'>
  <Title level={4}>Analyzing your product...</Title>
</section>

然后写 css:

css 复制代码
.fourth-process-section-step {
  position: relative;
  display: flex;
  width: 400px;
  padding: 36px;
  align-items: center;
  gap: 10px;
  border-radius: 20px;
  border: 4px solid rgba(253, 224, 218, 0.84);
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.35) 0%, rgba(255, 255, 255, 0.70) 100%);
  backdrop-filter: blur(14px);
}

.fourth-process-section-step::before {
  content: '';
  position: absolute;
  top: -30px;
  left: -35px;
  width: 70px;
  height: 70px;
  border-radius: 50%;
  border: 5px solid #FFD813;
  flex-shrink: 0;
  background: radial-gradient(106.67% 106.67% at 50% 15.15%, rgba(255, 242, 0, 0.90) 0%, #FFB006 91.67%);
  opacity: 0.7;
}

本以为可以打完收工,结果看到页面长这个样子:

为啥伪元素盖在了主体元素上面?赶紧调整一下 zIndex:

css 复制代码
.fourth-process-section-step::before {
    ...
    z-index: -999;
}

发现还是不起作用。后面调小了盒子的 padding 后,发现 Analyzing your product... 这段文字确实盖在伪元素上面:

研究发现,单纯调整层级并不能改变背景图片和边框的位置(盒子内部元素 > 伪元素 > 背景和边框),所以只能调整 dom 结构:

思路就是不让伪元素的主体元素和需要设置背景图和边框的是一个元素

jsx 复制代码
<section className='process-section-step'>
   <div className='process-section-step-content'>
      <Title level={4}>Analyzing your product...</Title>
   </div>
</section>

然后写 css:

css 复制代码
.fourth-process-section-step {
  position: relative;
}

.fourth-process-section-step>.fourth-process-section-step-content {
  position: relative;
  display: flex;
  width: 400px;
  padding: 36px;
  align-items: center;
  gap: 10px;
  border-radius: 20px;
  border: 4px solid rgba(253, 224, 218, 0.84);
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.35) 0%, rgba(255, 255, 255, 0.70) 100%);
  backdrop-filter: blur(14px);
}

.fourth-process-section-step::before {
  content: '';
  position: absolute;
  top: -30px;
  left: -35px;
  width: 70px;
  height: 70px;
  border-radius: 50%;
  border: 5px solid #FFD813;
  flex-shrink: 0;
  background: radial-gradient(106.67% 106.67% at 50% 15.15%, rgba(255, 242, 0, 0.90) 0%, #FFB006 91.67%);
  opacity: 0.7;
}

这样设置,整个背景图和边框就变成了主体元素的子元素了,自然会盖在伪元素上方。

运行发现已经可以了:

有时候工作上遇到问题解决不了,偶尔换个方向,往往有奇效。基于已有的规律换个方向来迎合这个规律,会让困难的问题变得简单。

相关推荐
前端snow3 小时前
ai agent --- postgreSQL 关系型数据库
前端
卷无止境4 小时前
ECharts:把数据变成故事的可视化利器
前端
Eric_见嘉4 小时前
在职前端 Skill 和 MCP 分享
前端·后端·agent
liangshanbo12154 小时前
面试题:如何优化 Webpack 的打包速度?
前端·webpack·node.js
wengad5 小时前
从 wangEditor 迁到 wangEditor-next
前端·javascript·vue.js
行者-全栈开发6 小时前
【前端/JS框架】CVE-2026-3854:GitHub Enterprise Server X-Stat注入XSS漏洞深度剖析与紧急修复指南
前端·javascript·github
计算机魔术师7 小时前
AMD砸82亿买下李飞飞,这次不卖芯片卖什么?
前端
hzxpaipai7 小时前
杭州企业官网怎么建设?从策划到上线的5步建站方法
运维·服务器·前端·网络
怕浪猫7 小时前
2026年金九银十,我面了22个前端
前端·javascript·面试
IT_陈寒7 小时前
Vue 这个响应式陷阱,我的头发都掉没了
前端·人工智能·后端