Урок: создание анимации

animation-tutorial

Создание анимации в CSS3 — увлекательный процесс. С помощью несложных манипуляций и, главное, без использования скриптов, можно перемещать и скрывать html-элементы, изменять их размеры, цвет, создавать реалистичные объемные эффекты, анимируя тень элемента, и многое другое.

Анимация состоит из плавных изменений одного состояния элемента в другое с помощью функций перехода animation-timing-function на протяжении указанного времени. На каждом этапе анимации можно задавать свою функцию перехода.

Самое главное при создании анимации — правильно задать ключевые моменты. Анимация может начинаться с 50%, а начальное и конечное состояния анимируемого элемента будут соответствовать заданному в свойствах элемента (так называемые вычисляемые значения).

See the Pen Clouds animation by Elena Nazarova (@nazarelen) on CodePen.

Основные элементы (башня, дом, одиночное облако) рисуются с помощью CSS-стилей, а элементы отделки (крыша, окна и маленькое облачко) — с использованием псевдоэлементов :before и :after.

Разметка HTML
<div class="picture">
  <div class="clouds">
  <div class="cloud one"></div>
  <div class="cloud two"></div>
  <div class="cloud three"></div>
  </div>
  <div class="clouds-two">
  <div class="cloud one"></div>
  <div class="cloud two"></div>
  <div class="cloud three"></div>
  </div>
  <div class="tower"></div>
  <div class="house">
    <ul>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
      <li></li>
    </ul>
  </div>
</div>
Стили CSS
body {
  margin: 0;
  background: white;  /*скрываем облака, когда они будут выходит за границы голубого блока*/
}
.picture {
  width: 270px;
  height: 270px;
  background: #CFDEE6;
  border-radius: 50%;
  margin: 50px auto 0;
  position: relative;  /*задаем относительное позиционирование, чтобы абсолютно позиционировать элементы внутри*/
  overflow: hidden;  /*скрываем облака, когда они будут уходить за границы блока*/
}
.tower {
  width: 36px;
  height: 96px;
  background: white;
  position: absolute;
  bottom: 84px;
  left: 66px;
}
.tower:before {
  content: "";
  width: 0;
  height: 0;
  border-left: 18px solid transparent;
  border-right: 18px solid transparent;
  border-bottom: 24px solid #D56851;
  position: absolute;
  top: -24px;
}
.tower:after {
  content: "";
  width: 12px;
  height: 15px;
  background: #6D6D6D;
  position: absolute;
  top: 12px;
  left: 12px;
}
.house {
  width: 126px;
  height: 36px;
  background: white;
  position: absolute;
  left: 75px;
  bottom: 84px;
}
.house:before {
  content: "";
  width: 110px;
  height: 0;
  border-bottom: 15px solid #D56851;
  border-right: 16px solid transparent;
  position: absolute;
  top: -15px;
}
.house:after {
  content: "";
  width: 83px;
  height: 21px;
  background: #D56851;
  position: absolute;
  top: -36px;
  left: 27px;
}  
ul {
  margin: 7px 0 0 27px;
  padding: 0;
  list-style: none;
}
li {
  display: inline-block;
  width: 12px;
  height: 18px;
  background: #6D6D6D;
}
li:nth-child(3) {
  margin-right: 10px;
}
@-webkit-keyframes clouds {
  50% {left: 270px; opacity: 0.5}  /*перемещаем блок с облаками за правый край голубого блока, постепенно делая блок прозрачным*/
  51% {opacity: 0;}  /*чтобы когда он начал перемещаться за левый край голубого блока, его не было видно*/
  100% {opacity: 0; left: -110px;}  /*смещаем блок с облаками за левую границу голубого блока*/
}
@keyframes clouds {
  50% {left: 270px; opacity: 0.5}
  51% {opacity: 0;}
  100% {opacity: 0; left: -110px;}
}
.clouds {
  width: 110px;
  height: 40px;
  position: relative;
  overflow: hidden;
  top: 60px;
  left: -110px; 
  -webkit-animation: clouds 20s linear infinite;
  animation: clouds 20s linear infinite;
}
.clouds-two {
  width: 110px;
  height: 40px;
  position: relative;
  overflow: hidden;
  top: 20px;
  left: -110px; 
  -webkit-animation: clouds 20s linear infinite 10s;  /*добавляем для второго блока с облаками задержку в анимации*/
  animation: clouds 20s linear infinite 10s;
}
.cloud {
  background: white;
  position: absolute;
}
.one {
  width: 30px;
  height: 15px;
  border-radius: 60px 60px 0 0;
  top: 0;
  left: 0;
}
.one:after {
  content: "";
  width: 20px;
  height: 8px;
  background: white;
  border-radius: 40px 40px 0 0;
  position: absolute;
  left: 20px;
  top: 7px;
}
.two {
  width: 24px;
  height: 10px;
  border-radius: 48px 48px 0 0;
  top: 30px;
  left: 30px;
}
.three {
  width: 30px;
  height: 15px;
  border-radius: 60px 60px 0 0;
  top: 25px;
  left: 80px;
}
.three:before {
  content: "";
  width: 20px;
  height: 8px;
  background: white;
  border-radius: 40px 40px 0 0;
  position: absolute;
  left: -10px;
  top: 7px;
}