Entrances

Flip In Y Animation

Rotates in around the vertical axis, like a card turning to face you.

Card title

Supporting copy goes here.

Edit this in the studio

Opens with this animation loaded. Nothing is uploaded — the scene travels in the link.

animation.css
.flip-in-y {
  transform: translate3d(130px, 90px, 0);
  box-shadow: 0px 10px 30px 0px #00000059;
  width: 220px;
  height: 140px;
  background: #1c1e2a;
  border-radius: 18px;
  color: #e7e9ee;
  font-size: 14px;
  animation: flip-in-y-anim 800ms linear 0ms infinite both;
  will-change: transform, opacity;
}

@keyframes flip-in-y-anim {
  0% {
    transform: perspective(800px) translate3d(130px, 90px, 0) rotateY(90deg);
    opacity: 0;
    animation-timing-function: ease-out;
  }
  40% {
    transform: perspective(800px) translate3d(130px, 90px, 0) rotateY(-2.612deg);
    opacity: 1;
  }
  100% {
    transform: translate3d(130px, 90px, 0);
    opacity: 1;
  }
}

@media (prefers-reduced-motion: reduce) {
  .flip-in-y {
    animation: none;
    transition: none;
  }
}

Why it is built this way

rotateY needs a perspective value to look like depth rather than a squash — without it the element just narrows. The generated transform includes perspective ahead of the rotation, which is the order the browser requires.

What it animates

2 properties across 2 CSS declarations. The bar shows when each one is moving.

Opacity
opacity
0 1
3 stopscompositor
Rotate Y
transform
90 0
2 stopscompositor

What it costs to run

Opacity and rotate y are handled by the compositor: no layout, no repaint, and the work can run off the main thread. This is the cheap end of CSS animation, which is why it stays smooth on a slow phone where other properties will not.

It runs for 0.80s across 5 keyframe stops, with every property moving over the same window.

3 curves in play — Ease Out, Linear and Back Out on a card. Different properties easing differently is how a movement gets texture: the eye reads the mismatch as weight rather than as a mistake.

Accessibility

Starting at opacity 0 makes the reduced-motion guard load-bearing rather than polite: strip it and a reader who asked for less movement gets no content at all, because nothing ever fades it in. It fades over 0.80s alongside rotate y, and the guard skips all of it together. The generated CSS ends on the resting state, so skipping straight there is safe.

Related animations

flip3drotateYentrance