3D魔方-Css实现方法

效果:

实现思路:

  1. 在根节点定义尺寸与配色等CSS变量(w、gap、allW、c1...bg)。

  2. 创建容器结构:.container 包裹 .container-box,并将页面居中显示。

  3. 设置透视与3D:给 .container 设置 perspective;给 .container-box 开启 preserve-3d。

  4. 构建六个面:创建 .cube-side(front/back/right/left/top/bottom),每个面内添加一个 .cube-grid。

  5. 使用 box-shadow 生成 3×3 方格阵列,依据 w 与 gap 计算偏移量形成九宫格。

  6. 用 translateZ/rotateX/rotateY 将六个面定位到立方体的正确位置。

  7. 启用背面隐藏:backface-visibility: hidden,避免背面闪烁或穿透导致的视觉问题。

  8. 添加旋转动画:定义 @keyframes rotate,并在 .container-box 上应用 animation。

  9. 可通过调整变量改变魔方大小、间距与颜色主题,实现快速定制。

附代码:

html 复制代码
<!doctype html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>3D魔方</title>
  <style>
    :root {
      --w: 60px;
      --gap: 10px;
      --allW: calc(3 * var(--w) + 4 * var(--gap));
      --c1: #FF0000;
      --c2: green;
      --c3: #fff;
      --c4: #97d497;
      --c5: #291a80;
      --c6: rgb(255, 0, 212);
      --bg: #0d0e0d;
    }

    * { box-sizing: border-box; }
    html, body { height: 100%; }
    body {
      margin: 0;
      display: grid;
      place-items: center;
      background: var(--bg);
      color: #fff;
      font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Noto Sans", "Apple Color Emoji", "Segoe UI Emoji";
    }

    .container {
      width: var(--allW);
      height: var(--allW);
      perspective: 900px;
    }

    .container-box {
      position: relative;
      width: var(--allW);
      height: var(--allW);
      transform-style: preserve-3d;
      animation: rotate 10s infinite alternate;
    }

    .cube-side {
      width: 100%;
      height: 100%;
      position: absolute;
      background: var(--bg);
      border-radius: 7px;
      padding: var(--gap);
      backface-visibility: hidden;
    }

    .cube-side .cube-grid {
      width: var(--w);
      height: var(--w);
      border-radius: calc(var(--w) / 5);
      color: var(--c);
      background: currentColor;
    }

    .cube-grid {
      box-shadow:
        calc(var(--w) + var(--gap)) 0 0 currentColor,
        calc(var(--w) * 2 + var(--gap) * 2) 0 currentColor,
        0 calc(var(--w) + var(--gap)) currentColor,
        calc(var(--w) + var(--gap)) calc(var(--w) + var(--gap)) currentColor,
        calc(var(--w) * 2 + var(--gap) * 2) calc(var(--w) + var(--gap)) currentColor,
        0 calc(var(--w) * 2 + var(--gap) * 2) currentColor,
        calc(var(--w) + var(--gap)) calc(var(--w) * 2 + var(--gap) * 2) currentColor,
        calc(var(--w) * 2 + var(--gap) * 2) calc(var(--w) * 2 + var(--gap) * 2) currentColor;
    }

    /* Faces positioning */
    .cube-side.side-front { transform: translateZ(calc(var(--allW) / 2)); }
    .cube-side.side-back { transform: rotateX(-180deg) translateZ(calc(var(--allW) / 2)); }
    .cube-side.side-right { transform: rotateY(90deg) translateZ(calc(var(--allW) / 2)); }
    .cube-side.side-left { transform: rotateY(-90deg) translateZ(calc(var(--allW) / 2)); }
    .cube-side.side-top { transform: rotateX(90deg) translateZ(calc(var(--allW) / 2)); }
    .cube-side.side-bottom { transform: rotateX(-90deg) translateZ(calc(var(--allW) / 2)); }

    @keyframes rotate {
      0%   { transform: rotateZ(0deg)  rotateX(0deg)   rotateY(0deg); }
      15%  { transform: rotateZ(45deg) rotateX(45deg)  rotateY(45deg); }
      30%  { transform: rotateZ(45deg) rotateX(90deg)  rotateY(90deg); }
      45%  { transform: rotateZ(45deg) rotateX(135deg) rotateY(135deg); }
      60%  { transform: rotateZ(45deg) rotateX(90deg)  rotateY(180deg); }
      75%  { transform: rotateZ(45deg) rotateX(45deg)  rotateY(225deg); }
      100% { transform: rotateZ(45deg) rotateX(0deg)   rotateY(270deg); }
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="container-box">
      <div class="cube-side side-front">
        <div class="cube-grid" style="--c: var(--c1)"></div>
      </div>
      <div class="cube-side side-back">
        <div class="cube-grid" style="--c: var(--c2)"></div>
      </div>
      <div class="cube-side side-right">
        <div class="cube-grid" style="--c: var(--c3)"></div>
      </div>
      <div class="cube-side side-left">
        <div class="cube-grid" style="--c: var(--c4)"></div>
      </div>
      <div class="cube-side side-top">
        <div class="cube-grid" style="--c: var(--c5)"></div>
      </div>
      <div class="cube-side side-bottom">
        <div class="cube-grid" style="--c: var(--c6)"></div>
      </div>
    </div>
  </div>
</body>
</html>
相关推荐
0思必得04 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5164 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino4 小时前
图片、文件的预览
前端·javascript
mocoding5 小时前
Flutter 3D 翻转动画flip_card三方库在鸿蒙版天气预报卡片中的实战教程
flutter·3d·harmonyos
layman05286 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔6 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李6 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN6 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒6 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库6 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css