Индикатор загрузки для сайта

Урок посвящён созданию оригинального индикатора загрузки для сайта с использованием простых css-фигур и анимации, базирующейся на трансформации элементов. Такой индикатор можно использовать для свадебного сайта, сайта ресторана или интернет-магазина алкогольных напитков.

Находить новые идеи не сложно. Нужно быть лишь чуточку внимательней к окружающему нас миру. И как приятно видеть привычные вещи, воссозданные на экране с помощью HTML и CSS.

See the Pen wineshop loader by Elena Nazarova (@nazarelen) on CodePen.

wineshop
Рис. 1. Разметка индикатора загрузки для сайта
<div class="loader">
  <ul>
    <li></li>
    <li></li>
    <li></li>
  </ul>
  <div class="wineglass left">
    <div class="top"></div>
  </div>
  <div class="wineglass right">
    <div class="top"></div>
  </div>
</div>

Для сглаживания неровности краёв при движении добавим элементам тень такого же цвета, что и сами элементы. Напиток внутри бокала сделан в виде круга с градиентом, одна половина прозрачная, другая — цветная. Ножку и подставку бокала сместим на 1px, чтобы при движении не образовывался промежуток между элементами.

body {
  margin: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background: #C4D9EB;
}
.wineglass {
  height: 36px;
  position: relative;
}
.wineglass:after {
  content: ''; 
  position: absolute;
  top: 47px;
  left: 5px;
  width: 20px;
  height: 5px;
  background: white;
  box-shadow: 0 0 1px white;
}
.top {
  background: white;
  width: 30px;
  height: 36px;
  border-radius: 0 0 36px 36px;
  box-shadow: 0 0 1px white;
}
.top:before {
  content: ''; 
  position: absolute;
  left: 4px;
  bottom: 4px;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: linear-gradient(transparent 50%, #F36E3E 50%);
}
.left .top:before {
  animation: rotate2 2s linear infinite;
}
.right .top:before {
  animation: rotate1 2s linear infinite;
}
.top:after {
  content: ''; 
  position: absolute;
  top: 35px;
  left: 12px;
  width: 6px;
  height: 13px;
  background: white;
  box-shadow: 0 0 1px white;
}
.left {
  display: inline-block;
  margin-right: 10px;
  animation: rotate1 2s cubic-bezier(.39,1.52,.46,.92) infinite;
}
.right {
  display: inline-block;
  animation: rotate2 2s cubic-bezier(.39,1.52,.46,.92) infinite;
}
@keyframes rotate1{
  0% {transform: rotate(0deg);}
  50% {transform:rotate(22deg);}
}
@keyframes rotate2{
  0% {transform:rotate(0deg);}
  50% {transform:rotate(-22deg);}
}
ul {
  list-style: none;
  margin: 0;
  padding: 0;
  width: 70px;
  height: 25px;
  position: relative;
  opacity: 0;
  animation: 2s fadeInUp infinite linear 2s;
}
li {
  width: 6px;
  height: 15px;
  background: white;
  position: absolute;
  box-shadow: 0 0 1px white;
  transform-origin: bottom;
}
li:nth-child(1) {
  left: 26px;
  bottom: 5px;
  transform: rotate(-35deg);
}
li:nth-child(2) {
  left: 34px;
  bottom: 8px;
}
li:nth-child(3) {
  left: 42px;
  bottom: 5px;
  transform: rotate(35deg);
}
@keyframes fadeInUp {
  0% {
    opacity: 0;
    transform: scaleY(1);
  }
  33% {
    opacity: 1;
    transform: scaleY(1.4);
  }
  64% {
     opacity: .1;
     transform: scaleY(1);
  }
  100% { 
    opacity: 0;
    transform: scaleY(.3);
  }
}

Поделиться: