پیش‌نمایش زنده
کد HTML
<div class="scene">
  <div class="cube-shadow">
    <div class="face face-bottom"></div>
  </div>
  <div class="cube-shadow">
    <div class="face face-bottom"></div>
  </div>
  <div class="blur">
    <div class="cube-inner">
      <div class="face face-front bg-color-in"></div>
      <div class="face face-back bg-color-in"></div>
      <div class="face face-right bg-color-in"></div>
      <div class="face face-left bg-color-in"></div>
      <div class="face face-top bg-color-in"></div>
      <div class="face face-bottom bg-color-in"></div>
    </div>
  </div>
  <div class="cube-outer">
    <div class="face face-front bg-color-out">Processing</div>
    <div class="face face-back bg-color-out">Please wait</div>
    <div class="face face-right bg-color-out">...</div>
    <div class="face face-left bg-color-out">...</div>
    <div class="face face-top bg-color-out"></div>
    <div class="face face-bottom bg-color-out"></div>
  </div>
  <div class="light"></div>
  <div class="shadow"></div>
</div>
کد CSS
.scene {
  --cube-size: 120px;
  --inner-multiplier: 0.5;
  /* [0.1,0.6] */
  --color-inner: hsla(85, 100%, 50%, 0.85);
  --color-outer: hsla(170, 70%, 50%, 0.2);
  --blur: 2px;
  --angle: -10deg;
  /* [-40,40] */
  --duration: 7s;

  position: relative;
  width: var(--cube-size);
  height: var(--cube-size);
  perspective: 750px;
}

.cube-outer,
.cube-inner {
  width: 100%;
  height: 100%;
  position: relative;
  transform-style: preserve-3d;
}

.cube-inner {
  --inner-scale: clamp(0.1, var(--inner-multiplier), 0.6);
  scale: var(--inner-scale);
  top: calc((1 - var(--inner-scale)) * var(--cube-size) / 2);
}

.face {
  user-select: none;
  display: grid;
  place-items: center;
  position: absolute;
  width: var(--cube-size);
  height: var(--cube-size);
  box-shadow:
    inset 0 0 2px 0 #fff5,
    inset 0 0 12px -8px #fff1,
    inset 0 0 32px -10px #fff1,
    inset 0 0 64px -8px #fff1,
    inset 0 0 32px 16px #00000015;
  overflow: clip;

  font:
    500 1em "Inter",
    sans-serif;
  letter-spacing: -0.01em;
  color: #111;
  text-shadow:
    0 3px 4px #0008,
    0 -6px 6px #0005;
  animation: blur var(--duration, 10s) linear infinite reverse;

  &.face-front {
    transform: rotateY(0deg) translateZ(calc(var(--cube-size) / 2));
    animation-delay: 0s;
  }

  &.face-right {
    transform: rotateY(90deg) translateZ(calc(var(--cube-size) / 2));
    animation-delay: calc(var(--duration, 10s) * -0.75);
  }

  &.face-back {
    transform: rotateY(180deg) translateZ(calc(var(--cube-size) / 2));
    animation-delay: calc(var(--duration, 10s) * -0.5);
  }

  &.face-left {
    transform: rotateY(-90deg) translateZ(calc(var(--cube-size) / 2));
    animation-delay: calc(var(--duration, 10s) * -0.25);
  }

  &.face-top {
    transform: rotateX(90deg) translateZ(calc(var(--cube-size) / 2));
    animation: none;
  }

  &.face-bottom {
    transform: rotateX(-90deg) translateZ(calc(var(--cube-size) / 2));
    filter: blur(20px);
    animation: none;
  }
}

.cube-inner .face {
  animation: none;
  box-shadow:
    inset 0 0 1px 0px #000e,
    inset 0 0 12px -2px #0005,
    inset 0 0 32px 0px #0001,
    inset 0 0 64px 8px #0001;
}

@keyframes blur {
  0%,
  9% {
    filter: blur(0px);
  }

  10%,
  64% {
    filter: blur(10px);
  }

  65%,
  100% {
    filter: blur(0px);
  }
}

.bg-color-in {
  background: var(--color-inner);
}

.bg-color-out {
  background-color: var(--color-outer);
  background: linear-gradient(to bottom, #fff5, #0000),
    radial-gradient(
      circle at 50% -50%,
      var(--color-inner) -20%,
      #fff0 30%,
      var(--color-outer)
    );
}

.cube-outer,
.cube-inner {
  transform: rotateX(-20deg) rotateY(45deg);
}

.cube-inner {
  position: absolute;
  transform-origin: center;
  scale: clamp(0.1, var(--inner-multiplier), 0.6);
  animation: rotate var(--duration, 10s) linear infinite;
}

.cube-outer {
  animation: rotate var(--duration, 10s) linear infinite reverse;
}

@keyframes rotate {
  from {
    transform: rotateX(clamp(-40deg, var(--angle), 40deg)) rotateY(45deg);
  }

  to {
    transform: rotateX(clamp(-40deg, var(--angle), 40deg)) rotateY(405deg);
  }
}

.blur {
  filter: blur(clamp(1px, var(--blur, 7px), 20px));
}

.cube-shadow {
  inset: 25%;
  transform-style: preserve-3d;
  position: absolute;
  background-color: #00000015;
  filter: blur(5px);
  animation: rotate-shadow var(--duration, 10s) linear infinite;
  z-index: 1;
  mix-blend-mode: multiply;
}

.cube-shadow:nth-child(2) {
  inset: 0%;
  transform-style: preserve-3d;
  position: absolute;
  background-color: #00000015;
  filter: blur(5px);
  animation: rotate-shadow var(--duration, 10s) linear infinite reverse;
  z-index: 0;
}

@keyframes rotate-shadow {
  from {
    transform: rotateX(calc(-100deg + clamp(-40deg, var(--angle), 40deg)))
      rotateZ(45deg) translateZ(calc(var(--cube-size) / 1.5));
  }

  to {
    transform: rotateX(calc(-100deg + clamp(-40deg, var(--angle), 40deg)))
      rotateZ(405deg) translateZ(calc(var(--cube-size) / 1.5));
  }
}

.scene .shadow {
  position: absolute;
  top: 45%;
  left: 35%;
  width: 50%;
  aspect-ratio: 1 / 1.5;
  background-color: #999;
  border-radius: 50%;
  transform: rotate(45deg);
  filter: blur(24px);
  mix-blend-mode: color-burn;
}

.scene .light {
  position: absolute;
  background-color: #555b;
  filter: blur(30px);
  mix-blend-mode: color-dodge;
  inset: 22%;
}

.scene::before {
  content: "";
  position: absolute;
  inset: -100%;
  top: 50%;
  background-color: #0002;
  filter: blur(70px);
}
نوع: loader
تاریخ ایجاد: 2026/06/06
آخرین بروزرسانی: 2026/06/06