Как создать анимированную колбу, используя CSS

от автора

Сегодня хочу рассказать о том, как я создавал анимированную колбу, используя только CSS3. Полученный результат можно увидеть здесь. Ну что интересно? Тогда давай приступим!

Изучаем задачу

Колба состоит из множества разносторонних фигур, но возможности CSS ограничены и не позволяют нам создавать такого рода элементы. Как же мы поступим? Мы реализуем их с помощью треугольников и прямоугольников.

  • Псевдоэлементы :Before и :After
  • Position, top, right, bottom, left, z-index
  • Border, width и height

Реализация основания колбы

Основание имеет треугольную форму, поэтому мы и сделаем его с помощью треугольника. Для этого я создам следующую разметку:

<div class="flask">     <div class="flask_bottom">         <div class="big_triangle"></div>     </div> </div>

Я использую основной элемент с классом flask, в котором будет располагаться основание с классом flask_bottom. В него мы добавили заготовку для будущего треугольника. Далее я стилизую разметку:

body {   background-color: #292548; }  .flask {   height: 405px;   width: 368px;   position: absolute;   bottom: 0; }  .flask_bottom {   bottom: 0;   position: absolute; }  .big_triangle {   overflow: hidden;   position: relative;   width: 368px;   height: 250px;   background-color: #fff; }

Основание я закрепил в нижней части колбы, используя свойства position: absolute и bottom: 0. Далее задал ему ширину 368 пикселей и высоту 250 пикселей. В результате мы имеем прямоугольник.

image

Теперь начинается самое интересное! Как же мы сделаем треугольник?! Для этого я буду использовать псевдоэлементы :before и :after. Используя их, мы создадим прямоугольные треугольники и расположим их поверх белого прямоугольника с левого и с правого края соответственно. Таким образом, скрыв часть его площади.

image

Но сначала нам требуется сделать прямоугольные треугольники. Для этого я добавлю следующий CSS код:

.big_triangle:before, .big_triangle:after {   content: "";   display: block;   width: 0;   height: 0;   border-top: 250px solid #292548;   position: absolute;   top: 0;   z-index: 100; }  .big_triangle:before {   border-right: 152px solid transparent;   left: 0; }  .big_triangle:after {   border-left: 152px solid transparent;   right: 0; }

Основная техника создания CSS треугольников — использоние свойства border. Но сначала нужно установить ширину и высоту элементов равные 0, для правильного рассчета размера треугольников. Дальше для них задаю свойство border-top равное 250 пикселей и цветом #292548(цвет фона). Далее для левого треугольника указываю свойство border-left с значением 152 пикселя. Тоже самое сделаю и для правого треугольника, только вместо border-left пропишу border-right. После чего располагаю их по краям прямоугольника, используя свойства left и right. И у нас получился треугольник!

image

Создаем элементы основания

Теперь мы перейдем к реализации элементов основания. Для этого добавлю следующую разметку:

<div class="flask">     <div class="flask_bottom">         <div class="big_triangle">             <div class="flask_bottom_one"></div>             <div class="flask_bottom_two"></div>             <div class="flask_bottom_three"></div>             <div class="flask_bottom_four"></div>             <div class="flask_bottom_five"></div>             <div class="flask_bottom_six"></div>         </div>     </div> </div>

И стилизую ее при помощи следующего кода:

.flask_bottom_one {   width: 0;   height: 0;   border-bottom: 55px solid #3a2481;   border-left: 32px solid transparent;   border-right: 42px solid transparent;   position: absolute;   bottom: 0;   z-index: 4; }  .flask_bottom_two {   border-bottom: 165px solid #4266c0;   border-left: 93px solid transparent;   border-right: 200px solid transparent;   width: 0;   height: 0;   position: absolute;   left: 0;   bottom: 0;   z-index: 2; }  .flask_bottom_three {   position: absolute;   background-color: #4248c0;   width: 100%;   height: 75px;   position: absolute;   z-index: 3;   left: 50px;   bottom: 18px;   transform: rotate(24deg);   transform-origin: left top; }  .flask_bottom_four {   position: absolute;   background-color: #37acdd;   width: 100%;   height: 170px;   position: absolute;   z-index: 1;   right: 0;   bottom: 0; }  .flask_bottom_five {   position: absolute;   background-color: #1493c8;   width: 100%;   height: 218px;   position: absolute;   z-index: 3;   right: -95px;   bottom: 24px;   transform: rotate(24deg);   transform-origin: right top; }  .flask_bottom_six {   position: absolute;   background-color: #5c30ae;   width: 100%;   height: 50px;   position: absolute;   z-index: 3;   right: -95px;   bottom: 218px;   transform: rotate(-12deg);   transform-origin: left top; }

Важным шагом при создании элементов является сохранение треугольной формы основания. При позиционирования внутренних элементов, они будут выходить за пределы треугольника. Чтобы избежать это, я добавил к классу big_triangle свойство overflow с значением hidden. Когда браузер прочитает данное свойство, то он скроет все, что выходит за пределы элемента с классом big_triangle.

Далее нам надо создать 6 элементов и, используя свойства transform( с значением rotate) и transform-origin, расположить их как нам нужно. В нашем случае трансформация нужна для того, чтобы повернуть элементы, а transform-origin – для указания точки, вокруг которой будем вращать элементы. Также, используя абсолютное позиционирование, располагаем элементы по своим местам. В результате мы получим:

image

Создаем горлышко и его элементы

Для создания горлышка нам потребуется создать прямоугольник с размерами 62 пикселей на 152 пикселей и поместить внутрь все 4 элемента. Для этого я добавлю следующую разметку:

<div class="flask">     <div class="flask_throat">         <div class="flask_throat_one"></div>         <div class="flask_throat_two"></div>         <div class="flask_throat_three"></div>         <div class="flask_throat_four"></div>     </div>     <div class="flask_bottom">         <div class="big_triangle">             <div class="flask_bottom_one"></div>             <div class="flask_bottom_two"></div>             <div class="flask_bottom_three"></div>             <div class="flask_bottom_four"></div>             <div class="flask_bottom_five"></div>             <div class="flask_bottom_six"></div>         </div>     </div> </div>

И css:

.flask_throat {   overflow: hidden;   height: 155px;   width: 64px;   position: absolute;   left: 152px;   top: 0; }  .flask_throat_one {   position: absolute;   transform: rotate(24deg);   transform-origin: right top;   background-color: #5c30ae;   width: 150px;   height: 50px;   position: absolute;   z-index: 3;   right: -26px;   top: 110px; }  .flask_throat_two {   position: absolute;   transform: rotate(20deg);   transform-origin: right top;   background-color: #37acdd;   width: 150px;   height: 60px;   position: absolute;   z-index: 3;   right: -35px;   top: 35px; }  .flask_throat_three {   position: absolute;   background-color: #5c30ae;   width: 100%;   height: 50px;   position: absolute;   z-index: 3;   right: 0;   bottom: 0; }  .flask_throat_four {   position: absolute;   transform: rotate(20deg);   transform-origin: right top;   background-color: #6c49ac;   width: 150px;   height: 20px;   position: absolute;   z-index: 3;   right: -45px;   top: 100px; }

Принцип расположения элементов точно такой же как и у элементов основания. Так что это задача уже не должна вызывать у вас сложности! В результате у нас получилась законченная колба!

image

Анимация пузырьков

У нас будет загружаться колба и через некоторое время из нее будут появляться пузырьки. Они будут разного размера и цвета. Периодичность появления будет разной.

Для реализации пузырьков мы будем использовать современные возможности CSS, а именно свойство border-radius. С помощью данного свойства можно скруглить углы у элемента. Теперь мы создадим 3 разноцветных пузырька одного размера, один чуть большего, и еще один большого размера. Для этого нам понадобится добавить следующую разметку:

<div class="flask">     <div class="circle small_circle"></div>     <div class="circle middle_circle"></div>     <div class="circle little_circle little_circle_white"></div>     <div class="circle little_circle little_circle_purpure"></div>     <div class="circle little_circle little_circle_blue"></div>     <div class="flask_throat">         <div class="flask_throat_one"></div>         <div class="flask_throat_two"></div>         <div class="flask_throat_three"></div>         <div class="flask_throat_four"></div>     </div>     <div class="flask_bottom">         <div class="big_triangle">             <div class="flask_bottom_one"></div>             <div class="flask_bottom_two"></div>             <div class="flask_bottom_three"></div>             <div class="flask_bottom_four"></div>             <div class="flask_bottom_five"></div>             <div class="flask_bottom_six"></div>         </div>     </div> </div>

И добавим css:

.circle {   border-radius: 50%;   border: 1px solid #fff;   position: absolute;   left: 45%;   top: 30px; }  .little_circle {   width: 5px;   height: 5px; }  .little_circle_white {   background-color: #fff;   left: 48%; }  .little_circle_purpure {   background-color: #6c49ac;   border: 1px solid #6c49ac;   left: 52%; }  .little_circle_blue {   background-color: #117fba;   border: 1px solid #117fba;   left: 45%; }  .small_circle {   width: 20px;   height: 20px; }  .middle_circle {   width: 45px;   height: 45px; }

Следующим шагом будет создание сценария анимации, используя свойство @ keyframes. Сам сценарий будет следующим. При загрузке страницы пузырьки имеют начальные координаты 20 пикселей по оси Y. При запуске анимации пузырьки начинают двигаться по оси Y от начальной координаты до -200px. Параллельно движению по оси Y пузырьки будут постепенно удаляться от пользоваться. Для этого мы используем свойство transform. Также, при движении пузырьков они плавно исчезают с помощью свойства opacity.

Сценарий создан, теперь нам требуется указать его в классе circle. Для этого используем свойство animation-name и указываем имя сценария – circle. Далее, для каждого пузырька установим задержку при помощи animation-delay, и таким образом они будут появляться в разный промежуток времени. Последним шагом будет установить параметр animation-iteration-count для бесконечного повторения сценария анимации.

.circle {   animation-name: circle;   animation-duration: 5s;   animation-iteration-count: infinite;   animation-delay: 0s; }  .little_circle_white {   animation-duration: 2000ms; }  .little_circle_purpure {   animation-duration: 2000ms;   animation-delay: 100ms; }  .little_circle_blue {   animation-duration: 2000ms;   animation-delay: 200ms; }  .small_circle {   animation-duration: 4200ms;   animation-delay: 300ms; }  @keyframes circle {   0% {     transform: translateZ(0px) translateY(20px) scale(1);     opacity: 1;   }   85% {     opacity: 0;   }   100% {     transform: translateZ(0px) translateY(-200px) scale(0);     opacity: 0;   } }

Анимация колбы

Для анимации колбы я создал для каждого элемента свой сценарий:

 @keyframes animation_bg_element1 {   0% {     border-bottom-color: #3a2481;   }   25% {     border-bottom-color: #242781;   }   50% {     border-bottom-color: #244081;   }   75% {     border-bottom-color: #242781;   } }  @keyframes animation_bg_element2 {   0% {     border-bottom-color: #4266c0;   }   25% {     border-bottom-color: #4287c0;   }   50% {     border-bottom-color: #42a8c0;   }   75% {     border-bottom-color: #4287c0;   } }  @keyframes animation_bg_element3 {   0% {     background-color: #4248c0;   }   25% {     background-color: #4269c0;   }   50% {     background-color: #428ac0;   }   75% {     background-color: #4269c0;   } }  @keyframes animation_bg_element4 {   0% {     background-color: #37acdd;   }   25% {     background-color: #37d8dd;   }   50% {     background-color: #37ddb5;   }   75% {     background-color: #37d8dd;   } }  @keyframes animation_bg_element5 {   0% {     background-color: #1493c8;   }   25% {     background-color: #14c2c8;   }   50% {     background-color: #14c89d;   }   75% {     background-color: #14c2c8;   } }  @keyframes animation_bg_element6 {   0% {     background-color: #5c30ae;   }   25% {     background-color: #3a30ae;   }   50% {     background-color: #3048ae;   }   75% {     background-color: #3a30ae;   } }  @keyframes animation_bg_element7 {   0% {     background-color: #6c49ac;   }   25% {     background-color: #5249ac;   }   50% {     background-color: #495aac;   }   75% {     background-color: #5249ac;   } }

Теперь я добавлю вызов анимации в каждом классе:

.flask_throat_one {   animation-name: animation_bg_element6;   animation-duration: 5s;   animation-iteration-count: infinite;   animation-delay: 0s; }  .flask_throat_two {   animation-name: animation_bg_element5;   animation-duration: 5s;   animation-iteration-count: infinite;   animation-delay: 0s; }  .flask_throat_three {   animation-name: animation_bg_element6;   animation-duration: 5s;   animation-iteration-count: infinite;   animation-delay: 0s; }  .flask_throat_four {   animation-name: animation_bg_element7;   animation-duration: 5s;   animation-iteration-count: infinite;   animation-delay: 0s; }             .flask_bottom_one {   animation-name: animation_bg_element1;   animation-duration: 5s;   animation-iteration-count: infinite;   animation-delay: 0s; }  .flask_bottom_two {   animation-name: animation_bg_element2;   animation-duration: 5s;   animation-iteration-count: infinite;   animation-delay: 0s; }  .flask_bottom_three {   animation-name: animation_bg_element3;   animation-duration: 5s;   animation-iteration-count: infinite;   animation-delay: 0s; }  .flask_bottom_four {   animation-name: animation_bg_element4;   animation-duration: 5s;   animation-iteration-count: infinite;   animation-delay: 0s; }  .flask_bottom_five {   animation-name: animation_bg_element5;   animation-duration: 5s;   animation-iteration-count: infinite;   animation-delay: 0s; }  .flask_bottom_six {   animation-name: animation_bg_element6;   animation-duration: 5s;   animation-iteration-count: infinite;   animation-delay: 0s; }

Заключение

В этой статье я показал вам современные возможности CSS. Я надеюсь, что у вас появится интерес к этому, и вы сможете создавать эффектные работы. Весь код я сохранил на GitHub. Спасибо!

ссылка на оригинал статьи https://habrahabr.ru/post/277253/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *