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

如何放大CSS 3D旋转立方体且保持尺寸正常?

纯CSS 3D立方体尺寸调整变形问题解决

我实现了一个纯CSS 3D立方体,初始尺寸为200px×200px时显示正常(半透明规整形态),但调整尺寸后立方体就会变形。尝试过参考现实立方体尺寸和相关技术方案,问题仍未解决。

问题代码

body {
  margin: 0;
  width: 100%;
  /*border: 1px solid orange;*/
}

.wrap {
  margin: 0 100px;
  perspective: 800px;
  perspective-origin: 50% 100px;
  /*border: 1px solid red;*/
  width: 100%;
  height: 300px;
  margin: 0;
  margin-top: 50px;
}

.cube {
  position: center;
  margin: 5 auto;
  width: 500px;
  transform-style: preserve-3d;
  animation: spin 20s infinite linear;
  /*border: 1px solid blue;*/
}

.cube div {
  position: absolute;
  width:200px;
  height: 200px;
  background-color: rgba(54,39,39,0.53);
  /*border: 1px solid green;*/
  box-shadow: inset 4px 4px 30px rgba(0,0,0,0.25);
  text-align: center;
  font-family: sans-serif;
  line-height: 200px;
  transition: background-color 3s ease;
}

.cube div:hover {
  background-color: rgba(239,179,210,.45);
}

.back {
  transform: translateZ(-100px) rotateY(180deg);
}

.right {
  transform: rotateY(-270deg) translateX(100px);
  transform-origin: top right;
}

.left {
  transform: rotateY(270deg) translateX(-100px);
  transform-origin: center left;
}

.top {
  transform: rotateX(-90deg) translateY(-100px);
  transform-origin: top center;
}

.bottom {
  transform: rotateX(90deg) translateY(100px);
  transform-origin: bottom center;
}

.front {
  transform: translateZ(100px);
}

@keyframes spin {
  from { transform: rotateY(0) }
  to { transform: rotateY(360deg) }
}

问题根源

代码里所有的位移值(比如translateZ(-100px)、translateX(100px))都是硬编码的100px,这个值刚好是初始200px边长的一半。一旦修改立方体面的尺寸,固定的位移值就不再匹配边长的一半,导致各个面的位置错位,立方体自然变形。另外.cube的position: center是无效属性,width:500px也和实际面尺寸不匹配,会干扰居中布局。

修复方案

用CSS变量统一管理立方体边长,让位移值动态计算为边长的一半,同时修正居中布局:

body {
  margin: 0;
  width: 100%;
}

.wrap {
  perspective: 800px;
  perspective-origin: 50% 100px;
  width: 100%;
  height: 400px; /* 根据立方体尺寸调整高度 */
  display: flex;
  justify-content: center;
  align-items: center;
  margin-top: 50px;
}

.cube {
  --cube-size: 300px; /* 这里修改立方体尺寸,所有面会自动适配 */
  width: var(--cube-size);
  height: var(--cube-size);
  transform-style: preserve-3d;
  animation: spin 20s infinite linear;
}

.cube div {
  position: absolute;
  width: var(--cube-size);
  height: var(--cube-size);
  background-color: rgba(54,39,39,0.53);
  box-shadow: inset 4px 4px 30px rgba(0,0,0,0.25);
  text-align: center;
  font-family: sans-serif;
  line-height: var(--cube-size);
  transition: background-color 3s ease;
}

.cube div:hover {
  background-color: rgba(239,179,210,.45);
}

.back {
  transform: translateZ(calc(var(--cube-size) / -2)) rotateY(180deg);
}

.right {
  transform: rotateY(-270deg) translateX(calc(var(--cube-size) / 2));
  transform-origin: top right;
}

.left {
  transform: rotateY(270deg) translateX(calc(var(--cube-size) / -2));
  transform-origin: center left;
}

.top {
  transform: rotateX(-90deg) translateY(calc(var(--cube-size) / -2));
  transform-origin: top center;
}

.bottom {
  transform: rotateX(90deg) translateY(calc(var(--cube-size) / 2));
  transform-origin: bottom center;
}

.front {
  transform: translateZ(calc(var(--cube-size) / 2));
}

@keyframes spin {
  from { transform: rotateY(0) }
  to { transform: rotateY(360deg) }
}

关键修改点

  • 新增--cube-size变量,统一控制立方体的尺寸,修改这个值就能调整大小,无需手动修改每个面的尺寸和位移。
  • 用calc(var(--cube-size) / 2)替代硬编码的100px,确保位移值始终是边长的一半,保证各个面的位置正确。
  • 修改.wrap为flex布局,实现立方体的居中对齐,替代原来无效的居中方式。
  • 给.cube设置和边长一致的宽高,让容器和立方体尺寸匹配。

现在无论你把--cube-size改成200px、300px还是其他值,立方体都会保持规整形态,不会变形。

内容的提问来源于stack exchange,提问作者midyow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:53:26