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

前言:最近在开发过程中,遇到了要在一个 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;
}

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

运行发现已经可以了:

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

相关推荐
万少9 分钟前
HarmonyOS preview 预览文件 Kit 的入门讲解
前端
IT_陈寒19 分钟前
JavaScript 性能优化实战:我从 V8 源码中学到的 7 个关键技巧
前端·人工智能·后端
jenchoi41337 分钟前
软件供应链npm/pypi投毒预警情报【2025-11-09】
前端·安全·web安全·网络安全·npm·node.js
艾小码39 分钟前
别再只会用默认插槽了!Vue插槽这些高级用法让你的组件更强大
前端·javascript·vue.js
JaguarJack41 分钟前
CSS 也要支持 if 了 !!!CSS if() 函数来了!
前端·css
恋猫de小郭44 分钟前
Flutter 3.38 发布,快来看看有什么更新吧
android·前端·flutter
wuk9987 小时前
实现ROS系统的Websocket传输,向Web应用推送sensor_msgs::Image数据
前端·websocket·网络协议
合作小小程序员小小店8 小时前
web网页开发,在线%考试管理%系统,基于Idea,vscode,html,css,vue,java,maven,springboot,mysql
java·前端·系统架构·vue·intellij-idea·springboot
影子信息9 小时前
css 文本显示两行超过显示省略号
css
天天进步20159 小时前
CSS Grid与Flexbox:2025年响应式布局终极指南
前端·css