ANIMATIONS

WITH CSS

WHY ANIMATIONS MATTER

Getting things to move is easy

Planning HOW they should move is hard

BUT

LETS START ANIMATING

BUT FIRST...

We need something to trigger our animations

Pseudoclasses

commonly used triggers

:hover

div:hover {
   background: purple;
}

Trigger by a user mousing over 

:focus

input:focus {
  color: red;
}

Triggers when an element "receives focus"

:active

button:active {
  color: green;
}

Triggers when an element is "being activated by user"

Passive Voice 😱

LET'S BUILD A BUTTON!

ONE MORE THING

CSS TRANSFORMS

TRANSFORM

"lets you manipulate the coordinate space of the CSS visual formatting model"

"lets you move, warp, rotate, and scale elements"

none | <transform-list>
where 
<transform-list> = <transform-function>+
where 
<transform-function> = [ <matrix()> || <translate()> || <translateX()> || <translateY()> || <scale()> || <scaleX()> || <scaleY()> || <rotate()> || <skew()> || <skewX()> || <skewY()> || <matrix3d()> || <translate3d()> || <translateZ()> || <scale3d()> || <scaleZ()> || <rotate3d()> || <rotateX()> || <rotateY()> || <rotateZ()> || <perspective()> ]+
where 
<matrix()> = matrix( <number> [, <number> ]{5,5} )
<translate()> = translate( <length-percentage> [, <length-percentage> ]? )
<translateX()> = translateX( <length-percentage> )
<translateY()> = translateY( <length-percentage> )
<scale()> = scale( <number> [, <number> ]? )
<scaleX()> = scaleX( <number> )
<scaleY()> = scaleY( <number> )
<rotate()> = rotate( <angle> )
<skew()> = skew( <angle> [, <angle> ]? )
<skewX()> = skewX( <angle> )
<skewY()> = skewY( <angle> )
<matrix3d()> = matrix3d( <number> [, <number> ]{15,15} )
<translate3d()> = translate3d( <length-percentage> , <length-percentage> , <length> )
<translateZ()> = translateZ( <length> )
<scale3d()> = scale3d( <number> , <number> , <number> )
<scaleZ()> = scaleZ( <number> )
<rotate3d()> = rotate3d( <number> , <number> , <number> , <angle> )
<rotateX()> = rotateX( <angle> )
<rotateY()> = rotateY( <angle> )
<rotateZ()> = rotateZ( <angle> )
<perspective()> = perspective( <length> )
where 
<length-percentage> = <length> | <percentage>

The Official Transform Syntax

Let's start with a couple examples

Translation

Move Something Around 

div {
  transform: translateX(100px);
}

Scaling

Alter the size of an element

div {
  transform: scale(2);
  /* doubles size of divs */
}

transform-origin

Where does the transform "originate"

div {
  transform: translateX(100px);
}

Rotations

Using CSS to...rotate things

div {
  transform: rotate(45deg);
}

BUT WHAT ABOUT

BROWSER

PREFIXES??

They clutter demo code!

.transformed {
  background-color: #9b59b6;
  transform: rotate(90deg);
  transform-origin: top left;
}
.transformed {
  background-color: #9b59b6;
  -webkit-transform: rotate(90deg);
      -ms-transform: rotate(90deg);
          transform: rotate(90deg);
  -webkit-transform-origin: top left;
      -ms-transform-origin: top left;
          transform-origin: top left;
}

Use an auto-prefixer

Translating/Scaling/Rotating is cool...

BUT IT'S NOT

ANIMATION!

(yet)

CSS

TRANSITIONS

TRANSITIONS

Allow us to control animation speed when changing CSS properties.

double the size of this div over 3 seconds

4 TRANSITION PROPERTIES

transition-duration

transition-property

transition-timing-function

transition-delay

transition-duration

transition-duration: 1s;

How long should the transition last?

transition-duration: 0.5s;

transition-duration: 3s, 1s;

We'll come back to this one in a second

transition-property

transition-property: background;
transition-property: opacity;
transition-property: all;
transition-property: transform;

What properties should be transitioned?

transition-property: color, opacity;

transition-delay

transition-delay: 4s;

How long of a delay before the transition starts?

transition-delay: 5ms, 10s;

transition-timing-function

transition-timing-function: ease-in;
transition-timing-function: ease-out;
transition-timing-function: linear;
transition-timing-function: cubic-bezier(0.950, 0.050, 0.795, 0.035);

And even...

What's the "acceleration curve" for the transition?

Shorthand Transitions

 transition: background 1.5s ease-in 1;
 <property>
 <duration>
 <timing-function>
 <delay>

1. What can be transitioned?

2 IMPORTANT QUESTIONS

2. What should be transitioned?

1. What can be transitioned?

-moz-outline-radius
-moz-outline-radius-bottomleft
-moz-outline-radius-bottomright
-moz-outline-radius-topleft
-moz-outline-radius-topright
-webkit-text-fill-color
-webkit-text-stroke
-webkit-text-stroke-color
all
backdrop-filter
background
background-color
background-position
background-size
border
border-bottom
border-bottom-color
border-bottom-left-radius
border-bottom-right-radius
border-bottom-width
border-color
border-left
border-left-color
border-left-width
border-radius
border-right
border-right-color
border-right-width
border-top
border-top-color
border-top-left-radius
border-top-right-radius
border-top-width
border-width
bottom
box-shadow
caret-color
clip
clip-path
color
column-count
column-gap
column-rule
column-rule-color
column-rule-width
column-width
columns
filter
flex
flex-basis
flex-grow
flex-shrink
font
font-size
font-size-adjust
font-stretch
font-variation-settings
font-weight
grid-column-gap
grid-gap
grid-row-gap
height
left
letter-spacing
line-height
margin
margin-bottom
margin-left
margin-right
margin-top
mask
mask-position
mask-size
max-height
max-width
min-height
min-width
object-position
offset
offset-anchor
offset-distance
offset-path
offset-position
offset-rotate
opacity
order
outline
outline-color
outline-offset
outline-width
padding
padding-bottom
padding-left
padding-right
padding-top
perspective
perspective-origin
right
scroll-snap-coordinate
scroll-snap-destination
shape-image-threshold
shape-margin
shape-outside
tab-size
text-decoration
text-decoration-color
text-emphasis
text-emphasis-color
text-indent
text-shadow
top
transform
transform-origin
vertical-align
visibility
width
word-spacing
z-index

2. What should be transitioned?

transform: translate();
transform: scale();
transform: rotate();
opacity

(What performs best?)

This is NOT a hard rule

Just keep it in mind!

LET'S MAKE

SOMETHING

A PLAIN IMAGE GALLERY

Needs some animated hover effects!

THE STRUCTURE

A background, the image, and an icon

KEYRAME

ANIMATIONS

Transitions allow us to animate a

single state change.

Keyframes allow for much more complex 

multi-state animations

TRANSITIONS

Go from state A to state B

KEYFRAMES

Go from state A to state B to state C to state D to state E...

0%

100%

50%

25%

75%

color:red

HELLO!!

color:orange

color:yellow

color:green

color:blue

HELLO!!

HELLO!!

HELLO!!

HELLO!!

font-size: 40px

font-size: 20px

font-size: 20px

Keyframe Syntax

@keyframes rainbowtext {
  0%{
    color: red;
    font-size:20px;
  }
  25%{
    color:orange;
  }
  50%{
    color:yellow;
    font-size:40px;
  }
  75%{
    color:green;
  }
  100%{
    color: blue;
    font-size:20px;
  }
}

NAME IT

ADD AS MANY AS

YOU WANT

 

MUST START

WITH THIS

Step 1: Define

Keyframe Syntax

p {
  animation-name: rainbowtext;
  animation-duration: 3s;
  animation-timing-function: linear;
  animation-delay: 0s;
  animation-iteration-count: infinite;
}

MUST MATCH

NAME

Step 2: Apply

Keyframe Syntax

@keyframes rainbowtext {
  0%{
    color: red;
    font-size:20px;
  }
  25%{
    color:orange;
  }
  50%{
    color:yellow;
    font-size:40px;
  }
  75%{
    color:green;
  }
  100%{
    color: blue;
    font-size:20px;
  }
}

NAME IT

ADD AS MANY AS

YOU WANT

 

MUST START

WITH THIS

Let's take a look at some of the other  "newer" animation properties

All the usual suspects are here...

  • animation-name
  • animation-duration
  • animation-timing-function
  • animation-delay

 

  • animation-iteration-count
  • animation-fill-mode
  • animation-direction
  • animation-play-state

animation-iteration-count

How many times should it repeat?

animation-iteration-count: 1;
animation-iteration-count: infinite;
animation-iteration-count: 7;

animation-direction

Let's just look at an example, it'll be easier!

animation-direction: forward;
animation-direction: reverse;
animation-direction: alternate;

animation-fill-mode

Specifies how an animation should apply styles before and after the animation

 

animation-fill-mode: forwards;
animation-fill-mode: backwards;
animation-fill-mode: both;
animation-fill-mode: none;

It makes more sense with an example, I promise

animation-play-state

Specifies whether the animation is running or paused

 

animation-play-state: paused;
animation-play-state: running;

YOUR

TURN

ANIMATED

SUN/SKY

EXERCISE

0%

100%

50%

25%

75%

THE SUN

0%

100%

30%

10%

90%

THE SKY COLOR

70%

Shorthand Animations

animation: 3s ease-in 1s 2 reverse both paused slidein;
animation: jiggle 4s;
animation: changecolor 3s linear 1s infinite alternate;

CSS Animations

By Colt Steele

CSS Animations

  • 4,075