Text

Fade In Up Animation

The dependable entrance: content rises a little as it fades in.

Design it once, ship it everywhere.
Edit this in the studio

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

animation.css
.body-copy {
  transform: translate3d(70px, 143px, 0);
  width: 340px;
  height: 34px;
  background: #00000000;
  color: #8b90a0;
  font-size: 18px;
  font-weight: 400;
  animation: body-copy-anim 1200ms linear 0ms infinite both;
  will-change: transform, opacity;
}

@keyframes body-copy-anim {
  0% {
    transform: translate3d(70px, 161px, 0);
    opacity: 0;
    animation-timing-function: ease-out;
  }
  50% {
    transform: translate3d(70px, 143px, 0);
    opacity: 1;
  }
  100% {
    transform: translate3d(70px, 143px, 0);
    opacity: 1;
  }
}

@media (prefers-reduced-motion: reduce) {
  .body-copy {
    animation: none;
    transition: none;
  }
}

Why it is built this way

Keep the distance small — 16 to 24px. Long travel makes a page feel slow to read because the eye follows the movement instead of the words. This is the entrance to reach for when you are not sure which to use.

What it animates

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

Opacity
opacity
0 1
2 stopscompositor
Y
transform
18 0px
2 stopscompositor

What it costs to run

Opacity and 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 1.20s across 4 keyframe stops, with every property moving over the same window.

One curve throughout: Ease Out on a text. Keeping a single easing across every property is what makes a multi-property animation read as one movement rather than several things happening at once.

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 1.20s alongside 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

fadeentrancescrollreveal