You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSS 3D立方体旋转时部分面出现裁切凹陷问题的原因排查求助

CSS 3D立方体旋转时部分面出现裁切凹陷问题的原因排查求助

大家好,我用HTML/CSS搭配JavaScript做了一个可旋转的3D立方体,整体效果基本符合预期,但遇到了一个完全摸不着头脑的问题:立方体的每个面都是独立的div元素,在特定旋转角度下,部分面会出现「裁切」的异常情况。

问题复现方式

最直观的复现方法就是按一次向下方向键:此时立方体的顶部(红色)和底部(绿色)面会像是向内“缩进”了近四分之一的长度,立方体的内部直接暴露了出来,看起来很怪异。

我已经排查过的方向

  • 排除性能问题:一开始我以为是电脑性能不足,部分面的变换没及时生效,但不管动画速度多慢,甚至让立方体静止在那个角度,问题都依然存在。
  • 排除代码拼接bug:因为最初的代码是从几个不同来源拼凑的,我一开始也没完全吃透逻辑,所以怀疑是代码里藏了bug。于是我逐行梳理代码,把它精简到最核心的状态,结果问题还是一模一样(不过倒是把代码逻辑彻底搞懂了,也算意外收获😂)。

发现的线索

我尝试隐藏除了上下两个面之外的所有面,结果问题居然消失了!另外我还发现,把代码嵌入到帖子里时问题不会重现,只有在单独的演示页面里才能复现,所以我怀疑这可能和视口的形状有关?

我还做了一个纯CSS版本的演示,把立方体固定在出现裁切问题的角度,同样能看到这个异常。

核心代码片段

JavaScript 旋转逻辑

// 获取立方体及各面元素
const cube = document.querySelector(".cube");
const topFace = document.querySelector(".cube-face-top");
const bottomFace = document.querySelector(".cube-face-bottom");

// 保存初始变换矩阵
const resetMatrix = new DOMMatrix();
let matrix = new DOMMatrix();

// 应用旋转变换的核心函数
function applyRotation(x, y, z, angle) {
  const newMatrix = new DOMMatrix().rotateAxisAngle(x, y, z, angle).multiply(matrix);
  cube.style.transform = newMatrix;
  matrix = newMatrix;
}

// 键盘事件监听
function keyboardTurn(event) {
  switch (event.key) {
    case "ArrowRight":
      applyRotation(0, 1, 0, 45);
      break;
    case "ArrowLeft":
      applyRotation(0, 1, 0, -45);
      break;
    case "ArrowUp":
      applyRotation(1, 0, 0, 45);
      break;
    case "ArrowDown":
      applyRotation(1, 0, 0, -45);
      break;
    case "r":
      cube.style.transform = resetMatrix;
      matrix = resetMatrix;
      break;
    default:
      break;
  }
}
document.addEventListener("keydown", keyboardTurn);

CSS 3D布局核心

body {
  margin: 0;
  box-sizing: border-box;
  height: 100vh;
  width: 100vw;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
  overflow: hidden;
}

.perspective-container {
  perspective: 500vmin;
  width: 96vmin;
  height: 96vmin;
}

.z-translation-container {
  position: relative;
  transform: translateZ(-48vmin);
  width: 100%;
  height: 100%;
  transform-style: preserve-3d;
}

.cube {
  width: 100%;
  height: 100%;
  position: relative;
  transform-style: preserve-3d;
  transition: transform 2s;
}

.cube-face {
  box-sizing: border-box;
  position: absolute;
  width: 96vmin;
  height: 96vmin;
  border: 0.5vmin solid black;
  opacity: 0.55;
}

.cube-face-top {
  transform: rotateX(90deg) translateZ(48vmin);
  background-color: red;
}

.cube-face-bottom {
  transform: rotateX(-90deg) translateZ(48vmin);
  background-color: green;
}

有没有大佬遇到过类似的3D变换异常?或者能帮我分析下这个裁切问题到底是怎么回事吗?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:45:28