Сегодня хочу рассказать о том, как я создавал анимированную колбу, используя только 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 пикселей. В результате мы имеем прямоугольник.
Теперь начинается самое интересное! Как же мы сделаем треугольник?! Для этого я буду использовать псевдоэлементы :before и :after. Используя их, мы создадим прямоугольные треугольники и расположим их поверх белого прямоугольника с левого и с правого края соответственно. Таким образом, скрыв часть его площади.
Но сначала нам требуется сделать прямоугольные треугольники. Для этого я добавлю следующий 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. И у нас получился треугольник!
Создаем элементы основания
Теперь мы перейдем к реализации элементов основания. Для этого добавлю следующую разметку:
<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 – для указания точки, вокруг которой будем вращать элементы. Также, используя абсолютное позиционирование, располагаем элементы по своим местам. В результате мы получим:
Создаем горлышко и его элементы
Для создания горлышка нам потребуется создать прямоугольник с размерами 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;
}
Принцип расположения элементов точно такой же как и у элементов основания. Так что это задача уже не должна вызывать у вас сложности! В результате у нас получилась законченная колба!
Анимация пузырьков
У нас будет загружаться колба и через некоторое время из нее будут появляться пузырьки. Они будут разного размера и цвета. Периодичность появления будет разной.
Для реализации пузырьков мы будем использовать современные возможности 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. Спасибо!
Автор: melnik909