CSS Animations: Transform and Transition

Example: Websites using CSS Animation:

Why Animation Matters?

  • Improve the payment experience with animations - Behind the scenes of Stripe Checkout [link]
  • Getting things to move is easy BUT planning HOW they should move is hard!

Pseudo-classes

Background

A CSS pseudo-class is a keyword added to a selector that specifies a special state of the selected element(s). Commonly used pseudo-classes to trigger animations include hover, focus and active

Resource(s): MDN reference: Pseudo-classes [link] CodePen - CSS Psuedo-class Triggers [link]

Syntax

/* No space allowed among "selector", ":" & "pseudo-class"! */
selector:pseudo-class {
  property: value;
}

:hover

The :hover CSS pseudo-class matches when the user interacts with an element with a pointing device, but does not necessarily activate it

div:hover{
  background:purple;
}

Resource(s): MDN reference: :hover [link]

:focus

The :focus CSS pseudo-class represents an element (such as a form input) that has received focus. It is generally triggered when the user clicks or taps on an element or selects it with the keyboard's "tab" key.

/* Selects any <input> when focused */
input:focus {
  color: red;
}

Resource(s): MDN reference: :focus [link]

:active

The :active CSS pseudo-class represents an element (such as a button) that is being activated by the user. When using a mouse, "activation" typically starts when the user presses down the primary mouse button and ends when it is released. The :active pseudo-class is commonly used on <a> and <button> elements, but may be used on other elements, too.

/* Selects any <a> that is being activated */
a:active {
  color: red;
}

Resource(s): MDN reference: :active [link]

Exercise: Building an Animated Button

You can create animation effect on a button with box-shadow & top Syntax box-shadow: x-offset y-offset color;

Resources: CodePen - Button Starter Code [link] CodePen - Button Completion Code [link]

.btn {
  /* Remove default properties*/
  outline: none;
  border: none;

  /* Base state */
  box-shadow: 0 6px #efa424;
}

.btn:hover {
    box-shadow: 0 4px #efa424;
    top: 2px;
}

.btn:active {
    box-shadow: none;
    top: 6px;
}

CSS Transforms

TRANSFORM lets you move, warp, rotate and scale elements. Click here [here] for MDN doc.

/* Syntax */
/* Keyword values */
transform: none;

/* Function values */
transform: functionName();

Although transform functions are discussed separately below, in practice, you need to put these functions on the same line.

div:hover {
  transform: scale(2) rotate(45deg);
}

Translation

Let you move something around by using functions translateX(), translateY() and translate(). Click [here] for a Translation demo

div:hover {
  transform: translateX(100px);
}

transform: scale() and transform-origin

transform:scale() lets you alter the size of an element. Click [here] for MDN doc on the scale() function.

div {
  /* double the size of div */
  transform: scale(2);

  /* shrink to half the size of div */
  transform: scale(0.5);

  /* custom sizing on x & y coordinates*/
  transform: scale(0.5, 2);
}

The transform-origin CSS property sets the origin for an element's transformations. The transform "originate" from the top left corner. Click [here] for MDN doc on transform-origin.

.transformed {
  transform: scale(2);
  transform-origin: 20px 0;
}

Click [here] for a scale() and transform-origin demo.

CSS Rotation

Using CSS to rotate things. The axis of rotation passes through an origin, defined by the transform-origin CSS property. The default origin is center. Click [here] for a demo. Click [here] for MDN doc.

div {
  transform: rotate(45deg);
}

A note on Vendor Prefixes

.example {
  transition: all .5s;
}
.example {
  /* With vendor prefixes */
  -webkit-transition: all .5s;
  -o-transition: all .5s;
  transition: all .5s;
}

For details on vendor prefixes, click [here]. There are online tools known as Auto Prefixer to automatically insert vendor prefixes in your code, click [here] for an example.

CSS Transitions

Transitions allow us to control animation speed when changing CSS properties e.g. double the size of this div over 3 seconds. There are 4 transition properties that we can control:

  • transition-duration
  • transition-property
  • transition-timing-function (acceleration)
  • transition-delay

For MDN doc on Transitions, click [here]. For a simple transition demo, click [here].

Transition Duration & Transition-Property

The property transition-duration determines how long a transition lasts. For a demo, click [here].

transition-duration:0.3s;
/* 2 different durations
for items specified in transition-property */
transition-duration:0.3s, 1s;

The property transition-property specifies what properties should be transitioned.

/* default */
transition-property: all;
transition-property: background;
transition-property: color, opacity;
transition-property: transform;

Transition Timing Function & Transition-Delay

The property transition-delay specifies how long of a pause before the transition starts.

transition-delay: 4ms;
/* 2 different delays
for items specified in transition-property */
transition-delay: 5ms, 1s;

The property transition-timing-function controls the acceleration curve for the transition.

transition-timing-function: ease-in;
transition-timing-function: ease-out;
transition-timing-function: linear;

For MDN doc on transition-timing-function, click [here]. For a demo, click [here].

Additional resources on Easing:

  • Ceaser: CSS Easing Animation Tool [Link]
  • Easing Function Cheat Sheet [Link]

Transition Shorthand

The transition CSS property is a shorthand property for transition-property, transition-duration, transition-timing-function, and transition-delay.

/* Shorthand Transitions */
.animated{
  /* Apply to 2 properties */
  transition: transform 2s ease-out 1s,
  background-color 0.5s linear;
}

For MDN doc on Shorthand Transitions, click [here]. For a demo, click [here].

Animation Performance<a name = "performance"></a>

There are 2 important questions on performance:

  • What can be transitioned?
    • Most of the CSS elements can be transitioned
  • What should be transitioned? What performs best?
    • transform: translate();
    • transform: scale();
    • transform: rotate();
    • opacity

The second question relates to how rendering process works in a browser. Refer to the article "High Performance Animations" [Link]for details.

Structure: Background color + Background image + icon Click [here] for a demo

<h1>An Image Gallery</h1>
<div class="container">
    <div class="item red">
        <img src="https://preview.ibb.co/gQbzQ5/colt_steele_firemarshall.jpg"/>
        <i class="fa fa-camera"></i>
    </div>

    <div class="item blue">
        <img src="http:i.imgur.com/AhCfhrF.jpg"/>
        <i class="fa fa-paw"></i>
    </div>

    <div class="item green">
        <img src="http://preview.ibb.co/kd9Esk/colt_steele_smugglerscave.jpg"/>
        <i class="fa fa-cloud"></i>
    </div>

</div>

Image: Create fade-out effect by changing the img opacity and display the underlying background as we hover over it :hover

div.item:hover img{
    /* Fade-out effect */
    opacity: 0.3;
    filter: grayscale(100%);
}

Transition: We include an "*" after item so that the transition transition shorthand can affect the other "layers" i.e. image and icon

div.item * {
    transition: all 0.35s ease-in-out;
}

Icon: The icons are set to invisible initially transform.scale(). The icon will show as we hover over it. We also need to center the icon transform.translate() at each stage as each transformation overwrites the values already set.

div.item i {
    /* Invisible */
    transform: translate(-50%, -50%) scale(0);
}
div.item:hover i {
    /* Show icon */
    transform: translate(-50%, -50%) scale(1);
}