CSS 3D 变换中z-index失效问题

article/2025/6/28 8:49:29

CSS 3D 变换中 z-index 失效问题

1. z-index 失效了

在 CSS 中,z-index 通常用于控制元素的层叠顺序,数值越大,元素越靠前显示。在 3D 变换(如 rotateXtranslateZ 中使用 z-index 时,可能会发现z-index 失效 了——即使设置了更高的 z-index,元素仍然无法正确叠放。

示例代码:

<div class="parent"><div class="child1">Child 1</div><div class="child2">Child 2</div>
</div>
.parent>div {width: 100px;height: 100px;}.parent {width: 200px;background-color: blue;margin: 100px auto;transform-style: preserve-3d;/* 启用 3D 空间 */}.child1 {background-color: pink;transform: translate3d(0px, 50px, 10px);z-index: 2;/* 理论上应该显示在前面 */}.child2 {background-color: purple;transform: translateZ(20px);z-index: 1;/* 理论上应该显示在后面 */}

预期效果child1 应该在 child2 前面,但实际相反。
在这里插入图片描述


2. z-index 失效的原因

(1) 层叠上下文(Stacking Context)被破坏

z-index的层叠上下文
z-index 的正常工作依赖于 层叠上下文,但 3D 变换会创建新的层叠上下文,导致 z-index 的比较方式发生变化。

  • 默认情况下,z-index 比较的是 同一层叠上下文内的元素
  • 3D 变换后,z-index 的比较可能 不再遵循 HTML文档中元素的逻辑排列顺序,而是由 3D 渲染顺序 决定。

(2) 3D 渲染顺序遵循z轴排列顺序

在 3D 空间中,浏览器默认使用z轴排列决定渲染顺序:

  • 离屏幕越近的元素越后渲染,因此会覆盖前面的元素。
  • z-index在 3D 变换中被忽略,因为浏览器优先使用 Z 轴位置 来决定显示顺序。

3. 解决方案:如何正确控制 3D 层叠顺序?

方法 1:调整 translateZ 而非依赖 z-index

3D 变换下 使用z-index不好预测渲染顺序 ,最直接的方法是 控制 translateZ的值:

.child1 {transform: translateZ(30px); /* 更大的 Z 值,确保显示在前面 */
}
.child2 {transform: translateZ(10px); /* 更小的 Z 值,确保显示在后面 */
}

✅ 方法 2:使用 transform-style: preserve-3d+ 父容器控制顺序

确保父元素启用 preserve-3d,并 避免在子元素中使用 z-index,而是通过 调整 translateZ 或 结构顺序 控制层叠:

.parent {transform-style: preserve-3d; /* 关键! */
}
.child1 {transform: translateZ(10px);
}
.child2 {transform: translateZ(20px);
}

  • 在 3D 场景中,优先使用 translateZ 控制层叠顺序,而非依赖 z-index
  • 如果必须使用 z-index,确保父元素层叠上下文正确,在 CSS 3D 渲染中,浏览器优先依赖 translateZ决定元素的显示顺序。

符合3D 下的真实情况

  • translateZ 表示真实的深度
    在 3D 空间中,translateZ 直接定义物体在 Z 轴上的位置,符合近大远小、遮挡关系。浏览器根据 物体在 3D 空间中的实际位置 计算遮挡关系,不依靠2d定位下的 z-index。

      /* 离观察者更近 */
    .box1 { transform: translateZ(100px); }
    /* 离观察者更远 */
    .box2 { transform: translateZ(-50px); } 
    
    • 此时无论 z-index 如何设置,box1都应遮挡 box2,否则会破坏 3D 视觉效果。
  • z-index 是 2D 平面的抽象概念
    z-index原本用于控制 同一平面内 元素的层叠顺序,无法表达 3D 空间中的深度关系。
    元素未启用 3D 变换z-index可能会造成影响
    若父元素没有 transform-style: preserve-3d,子元素会退化为 2D 平面渲染,此时 z-index 生效。

     /* 未开启3d效果子元素按 2D 规则渲染 */.parent { transform-style: flat; }/* 此时 z-index 有效 */
    .child { z-index: 1; }       
    

http://www.hkcw.cn/article/DIGZFEDSMn.shtml

相关文章

能源行业的网络安全:一场无声的战争

想象一下&#xff0c;你家的电力突然中断&#xff0c;冰箱里的食物开始变质&#xff0c;空调停止运转&#xff0c;甚至连手机充电都成了奢望。这不是科幻电影&#xff0c;而是网络攻击可能给我们的生活带来的真实影响。能源行业&#xff0c;这个维系现代社会运转的命脉&#xf…

ESP32-C3 + W5500 + MicroPython 编译记录

前言 我本来是想连个网&#xff0c;结果连上了无数个坑…… 在这个项目中&#xff0c;我的目标是用 ESP32-C3 W5500 作为有线网关&#xff0c;运行 MicroPython。听上去简单&#xff0c;实操下来却是一场跨平台 编译环境 烧录流程的大混战。 为了避免你也在这些坑里打转&…

项目管理进阶:56页大型IT项目管理实践经验分享【附全文阅读】

此文档为大型IT项目管理实践经验分享目录概览&#xff0c;主要包含以下核心内容&#xff1a; 1. **整体介绍**&#xff1a;阐述了项目管理在IT领域的重要性&#xff0c;特别是针对产品经理与开发人员间的冲突和挑战&#xff0c;提出通过项目管理方法来提升工作效率。目标受众为…

一种在SQL Server中传递多行数据的方法

这是一种比较偷懒的方法&#xff0c;其实各种数据库对Json 支持的很好。sql server 、oracle都不错。所以可以直接传json declare 这是一个json varchar(max) set 这是一个json{"data":[{"code":"1","name":"啥1"},{"…

SOC-ESP32S3部分:25-HTTP请求

飞书文档https://x509p6c8to.feishu.cn/wiki/KL4RwxUQdipzCSkpB2lcBd03nvK HTTP&#xff08;Hyper Text Transfer Protocol&#xff09; 超文本传输协议&#xff0c;是一种建立在 TCP 上的无状态连接&#xff0c;整个基本的工作流程是客户端发送一个 HTTP 请求&#xff0c;说明…

【音视频】H265 NALU分析

1 H265 概述 H264 与 H265 的区别 传输码率&#xff1a;H264 由于算法优化&#xff0c;可以低于 2Mbps 的速度实现标清数字图像传送&#xff1b;H.265 High Profile 可实现低于 1.5Mbps 的传输带宽下&#xff0c;实现 1080p 全高清视频传输。 编码架构&#xff1a;H.265/HEVC…

第十二节:第四部分:集合框架:List系列集合:LinkedList集合的底层原理、特有方法、栈、队列

LinkedList集合的底层原理 LinkedList集合的应用场景之一 代码&#xff1a;掌握LinkedList集合的使用 package com.itheima.day19_Collection_List;import java.util.LinkedList; import java.util.List;//掌握LinkedList集合的使用。 public class ListTest3 {public static …

用 Whisper 打破沉默:AI 语音技术如何重塑无障碍沟通方式?

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

实现Cursor + Pycharm 交互

效果演示&#xff1a; 直接可以在cursor或Pycharm中点击右键点击&#xff0c;然后就可以跳转到另一个应用的对应位置了 使用方法&#xff1a; 分别在两个应用中安装插件【Switch2Cursor Switch2IDEA&#xff0c;这两个插件分别安装在 IDEA 和 Cursor 中】&#xff1a; Switc…

【Linux】进程控制-上

> &#x1f343; 本系列为Linux的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:【小编的个人主页】 >小编将在这里分享学习Linux的心路历程✨和知识分享&#x1f50d; >如果本篇文章有不足&#xff0c;还请多多包涵&a…

QT之头像剪裁效果实现

文章目录 源码地址&#xff0c;环境&#xff1a;QT5.15&#xff0c;MinGW32位效果演示导入图片设置剪裁区域创建剪裁小窗口重写剪裁小窗口的鼠标事件mousePressEventmouseMoveEventmouseReleaseEvent 小窗口移动触发父窗口的重绘事件剪裁效果实现 源码地址&#xff0c;环境&…

Android基于LiquidFun引擎实现软体碰撞效果

一、实现效果 Android使用LiquidFun物理引擎实现果冻碰撞效果 二、Android代码 // 加载liquidfun动态库static {System.loadLibrary("liquidfun");System.loadLibrary("liquidfun_jni");}class ParticleData {long id;ParticleSystem particleSystem;float…

Baklib赋能企业AI知识管理实践

Baklib构建AI-ready知识体系 Baklib作为新一代知识中台的核心引擎&#xff0c;通过知识图谱构建与自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;将碎片化信息转化为结构化知识资产。平台依托智能语义分析能力&#xff0c;自动识别文档中的实体关系与上下文逻辑&am…

如何在 Windows 11 24H2 的任务栏时钟中显示秒数

我们都很熟悉任务栏时钟&#xff0c;或者说&#xff0c;是我们运行 Windows 的电脑屏幕右下角的数字时钟。它显示小时和分钟的时间&#xff0c;这基本上是每个人需要的&#xff0c;但我们有时也需要看到秒数。随着 Windows 11 的最新更新&#xff0c;它可以在任务栏时钟中直接显…

navicate菜单栏不见了怎么办

别慌&#xff01;&#xff01;&#xff01; 将鼠标放到navicate框的最左侧&#xff0c;看到出现两个竖线&#xff08;像这样||&#xff09;&#xff0c;点击拖动鼠标拉出来吧。

张家界溶洞垃圾堆7层楼高 污染触目惊心

近日,一段视频曝光了张家界市慈利县一处天然溶洞遭到人为排污的情况,引发广泛关注。视频中,溶洞内流淌着泛着绿色的污水,伴有黄绿色的淤泥沉积,黑色污染物自洞壁滑落凝固成厚厚的“黑痂”。拍摄者称,垃圾堆积高度达到七八层楼,令人触目惊心。据张家界市生态环境局透露,…

软件安全保障关键之漏洞扫描:原理、分类及意义全解析?

软件安全保障的关键在于漏洞扫描&#xff0c;这项工作通过特定技术和流程进行&#xff0c;旨在发现软件中可能存在的安全隐患&#xff0c;比如缓冲区溢出、跨站脚本攻击等&#xff0c;这些漏洞得以被识别和记录&#xff0c;对确保软件安全具有重要意义。 扫描原理 漏洞扫描依…

韩国大选开始投票 5人竞逐总统 李在明领跑民调

韩国第21届总统大选于当地时间6月3日6时正式开始,全国共设有14295个投票站。没有参加提前投票的选民凭身份证件前往指定投票站即可参与投票,投票将于当日20时结束。本次大选共有7位候选人登记,但其中两位宣布退出并支持国民力量党候选人金文洙。因此,选民将从以下5位候选人…

计算机网络 : 应用层自定义协议与序列化

计算机网络 &#xff1a; 应用层自定义协议与序列化 目录 计算机网络 &#xff1a; 应用层自定义协议与序列化引言1. 应用层协议1.1 再谈协议1.2 网络版计算器1.3 序列化与反序列化 2. 重新理解全双工3. socket和协议的封装4. 关于流失数据的处理5. Jsoncpp5.1 特性5.2 安装5.3…

比亚迪打响降价战为哪般 应对销量与利润双重压力

比亚迪打响降价战为哪般 应对销量与利润双重压力。5月22日,比亚迪宣布对旗下王朝网和海洋网共计22款车型降价,降幅在1.2万元至5.3万元之间,活动将持续到6月底。这是比亚迪自三月底以来的第三次降价,力度最大。作为中国新能源汽车销量冠军,比亚迪的大面积、大幅度降价预示着…