AI CSS Animations

3D Dice Roll Hover Effect

A six-sided die built from six faces with dotted pips. On hover it tumbles on two axes and comes to rest showing a six. Both rotations are one transition, so leaving rolls it back the other way.

Also known as: css 3d dice, rolling die hover, cube tumble animation.

HTML

<div class="hfx-dice-roll-3d" role="img" aria-label="Die">
  <div class="hfx-dice-roll-3d-die">
    <span class="hfx-dice-roll-3d-f1"></span>
    <span class="hfx-dice-roll-3d-f2"></span>
    <span class="hfx-dice-roll-3d-f3"></span>
    <span class="hfx-dice-roll-3d-f4"></span>
    <span class="hfx-dice-roll-3d-f5"></span>
    <span class="hfx-dice-roll-3d-f6"></span>
  </div>
</div>

CSS

.hfx-dice-roll-3d {
  --c: var(--hfx-color, #3b82f6);
  font-size: var(--hfx-size, 16px);
  position: relative;
  display: grid;
  place-items: center;
  width: 8em;
  height: 8em;
  perspective: 25em;
}
.hfx-dice-roll-3d::after {
  content: "";
  position: absolute;
  bottom: 0.9em;
  left: 50%;
  width: 4.4em;
  height: 0.8em;
  margin-left: -2.2em;
  border-radius: 50%;
  background: color-mix(in srgb, var(--c) 30%, transparent);
  filter: blur(0.25em);
}
.hfx-dice-roll-3d-die {
  position: relative;
  width: 3.6em;
  height: 3.6em;
  transform-style: preserve-3d;
  transform: rotateX(-25deg) rotateY(-35deg);
  transition: transform 1.2s cubic-bezier(0.2, 0.85, 0.25, 1.04);
}
.hfx-dice-roll-3d-die span {
  --pip: var(--c) 0 0.3em, transparent 0.33em;
  position: absolute;
  inset: 0;
  border-radius: 0.45em;
  background-color: #fff;
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--c) 20%, transparent), inset 0 0 0.6em color-mix(in srgb, var(--c) 12%, transparent);
}
.hfx-dice-roll-3d-f1 {
  background-image: radial-gradient(circle at 50% 50%, var(--c) 0 0.42em, transparent 0.45em);
  transform: translateZ(1.8em);
}
.hfx-dice-roll-3d-f2 {
  background-image: radial-gradient(circle at 27% 27%, var(--pip)), radial-gradient(circle at 73% 73%, var(--pip));
  transform: rotateX(90deg) translateZ(1.8em);
}
.hfx-dice-roll-3d-f3 {
  background-image: radial-gradient(circle at 27% 27%, var(--pip)), radial-gradient(circle at 50% 50%, var(--pip)), radial-gradient(circle at 73% 73%, var(--pip));
  transform: rotateY(90deg) translateZ(1.8em);
}
.hfx-dice-roll-3d-f4 {
  background-image: radial-gradient(circle at 27% 27%, var(--pip)), radial-gradient(circle at 73% 27%, var(--pip)), radial-gradient(circle at 27% 73%, var(--pip)), radial-gradient(circle at 73% 73%, var(--pip));
  transform: rotateY(-90deg) translateZ(1.8em);
}
.hfx-dice-roll-3d-f5 {
  background-image: radial-gradient(circle at 27% 27%, var(--pip)), radial-gradient(circle at 73% 27%, var(--pip)), radial-gradient(circle at 50% 50%, var(--pip)), radial-gradient(circle at 27% 73%, var(--pip)), radial-gradient(circle at 73% 73%, var(--pip));
  transform: rotateX(-90deg) translateZ(1.8em);
}
.hfx-dice-roll-3d-f6 {
  background-image: radial-gradient(circle at 27% 25%, var(--pip)), radial-gradient(circle at 73% 25%, var(--pip)), radial-gradient(circle at 27% 50%, var(--pip)), radial-gradient(circle at 73% 50%, var(--pip)), radial-gradient(circle at 27% 75%, var(--pip)), radial-gradient(circle at 73% 75%, var(--pip));
  transform: rotateY(180deg) translateZ(1.8em);
}
.hfx-dice-roll-3d:hover .hfx-dice-roll-3d-die {
  transform: rotateX(335deg) rotateY(505deg);
}

@media (prefers-reduced-motion: reduce) {
  .hfx-dice-roll-3d, .hfx-dice-roll-3d *, .hfx-dice-roll-3d::before, .hfx-dice-roll-3d::after, .hfx-dice-roll-3d *::before, .hfx-dice-roll-3d *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

Customizing this snippet

  • Color: set --hfx-color on the element or a parent. Currently previewing #3b82f6.
  • Base size: set --hfx-size. Every other dimension is in em, so the whole thing scales together. Currently previewing 16px.
  • Speed: change the duration on the transition or animation shorthand. Staggered delays are relative, so they keep their rhythm.
  • Reduced motion: the rule at the end of the CSS turns the motion off for people who asked their OS for less of it. Keep it.

Similar hover effects