Animations

Instead of one transition with transitions, can have up to an infinite number of iterations, grandular control

  • @keyframes

  • animation-name

  • animation-duration

  • animation-timing-function

  • animation-iteration-count

  • animation-direction

  • animation-play-state

  • animation-delay

  • animation-fill-mode

  • animation (shorthand)

@Keyframe

@keyframes clever_name_here ...
@keyframes writing {
    from { /*same as 0%*/
        left: 0;
    }

    to { /*same as 100%*/
        left: 100%;
    }
}
  • % basically the total animation time

  • !important not important in animations

  • It repaints the page when you change left/top, should use transform

/*zigzag across screen*/
@keyframes w {
    0% {
        left: 0;
        top: 0;
    }
    25%, 75% {
        top: 400px;
    }
    50% {
        top: 50px;
    }
    100% {
        left: 80%;
        top: 0;
    }
}

Using Keyframe

  • By default happens once

  • Can have multiple animations happening on same element at same time, last declared animation overrides other props if same props

.pencil {
    animation-name: w;
    animation-duration: 3s;
}

Timing Function

linear |ease-in-out|ease-in|ease-out|step-start|step-end|ease|steps(X, start|end)|cubic-bezier(x1, y1, x2, y2)

Steps

Discrete steps

start/end is which frame you drop i.e 2-4-6-8-10 or 0-2-4-6-8-10

Sprites(is a strip animate with:), add second animation to make it move across screen

.biker {
  height: 92px;
  width: 90px;
  background-image: url(../static/img/bike.png);
  background-repeat: no-repeat;
  animation: pedal 400ms steps(4, end) infinite; 
}
@keyframes pedal { 
    100% {background-position: -360px 0;}
}

Iteration-count

Can even do partial count so cuts off

Animation-delay

Can even do negative and skips in animation time

Animation-Direction

normal | alternate|reverse|alternate-reverse

Animation(shorthand)

name duration delay timing-function iteration-count

.pencil {
    animation: test 5s ease-in-out 100ms 5;
}

Animation Fill Mode

None | forwards | backwards | both

What do after last animation?

  • None: go back

  • forwards: keep at 100%

  • backwards: keep at 0% during animation delay/start

Play-state

.pencil:hover{
    Animation-play-state: paused;
}

Running | paused

Events

  • animationstart

  • animationend

  • animationiteration

Can add and remove class of animation at animation end to restart event(put slight delay on regiving class)

Advanced

On Unmount Animation

function OrgOnboarding() {
  const [step, setStep] = useState(1);
  const debouncedStep = useDebounce(step, 5000);

  return (
    <div className="h-screen w-screen bg-gray-100 flex flex-col">
      <div className="flex-1 flex items-center justify-center">
        {(step === 1 || debouncedStep === 1) && (
          <OnboardingPart1
            className={step === 1 ? "animateSlideRight" : "animateSlideLeft"}
            onSubmit={() => setStep(2)}
          />
        )}
        {(step === 2 || debouncedStep === 2) && (
          <OnboardingPart2
            className={step === 2 ? "animateSlideRight" : "animateSlideLeft"}
            onSubmit={() => setStep(1)}
          />
        )}
      </div>
    </div>
  );
}

Last updated