Сейчас мы создадим с вами анимированный блок из сот используя только HTML и CSS. Его можно установить на любую веб-страницу и применять по своему назначению. Размеры блока адаптируем под мобильные устройства, но если вы захотите увеличить, это не составит большого труда, просто, пропорционально изменяются размеры шрифтов, картинок и координаты.
Для работы нам понадобится заготовка, в виде объединенного шестиугольника с треугольником. Её можно нарисовать в любом векторном редакторе, но мы сделаем это с помощью svg-фигуры.
Координаты всем вершин можно посчитать, разместив фигуру на системе координат (подробно делаем в видео). Итоговый код svg-фигуры:
<svg viewBox="0 0 212.5 212.5"> <polygon fill="url(#hexagonBg1)" points="86.6 0, 173 50, 173 150, 147 165, 151.5 212.5, 112.5 185, 86.6 200, 0 150, 0 50" /> <defs> <linearGradient id="hexagonBg1" x1="0%" y1="0%" x2="50%" y2="100%"> <stop offset="30%" stop-color="#fec200"></stop> <stop offset="80%" stop-color="#ff5d14"></stop> </linearGradient> </defs> </svg>
На следующем этапе создаем еще 5 копий фигуры и развернув каждую с шагом в 600.
Поверх блока размещаем текст с использованием абсолютного позиционирования.
<div class="hexagon__block hexagon__block-1"> <!--Создаем родительский блок, относительного которого будем использовать абсолютное позиционирование--> <div> <!--Используем блок как фон, в виде нижнего слоя--> <div class="hexagon__background"> <svg viewBox="0 0 212.5 212.5"> <polygon fill="url(#hexagonBg1)" points="86.6 0, 173 50, 173 150, 147 165, 151.5 212.5, 112.5 185, 86.6 200, 0 150, 0 50" /> <defs> <linearGradient id="hexagonBg1" x1="0%" y1="0%" x2="50%" y2="100%"> <stop offset="30%" stop-color="#fec200"></stop> <stop offset="80%" stop-color="#ff5d14"></stop> </linearGradient> </defs> </svg> </div> <!--Текстовый блок--> <div class="hexagon__info"> <div> <div class="hexagon__step"> STEP <span>01</span> </div> <div class="hexagon__text"> <h4>Instagram</h4> <p>Lorem ipsum dolor sit amet, consectetur.</p> <img src="img/1.svg" alt=""> </div> </div> </div> </div> </div>
Центральный блок с текстом:
<div class="hexagon__middle"> <h3>Social media</h3> <p>Lorem ipsum dolor sit amet, consectetur. Lorem ipsum dolor sit.</p> <img src="img/like.svg" alt=""> </div>
Верстка готова, остается прописать стили, которые и сделают основную работу. Для написания будем использовать SASS.
/* Сброс всех стандартных отступов */ * { padding: 0; margin:0; font-family: Oswald, serif; } /* Создаем стили для сот (шестиугольников) */ .hexagon { /* Область ограничена разрами под мобильные устройства */ &__wrapper { position: relative; width:352px; height: 337px; margin:50px auto; } /* Стили отдельно взятой соты */ &__block { width:140px; height:140px; position:absolute; & > div { position: relative; } /* Стиль для первой соты, остальные похожие, отличаются отступами и добавлен поворот на 60 градусов */ &-1 { /* Задаем позиции для старта анимации (-60px по горизотали и вертикали) */ top:-60px; left:0; opacity: 0; /* Запускаем анимацию showBlock1 длительностью в 1 сек с задержкой 0.5 сек */ animation: showBlock1 1s 1; animation-fill-mode: forwards; animation-delay: .5s; /* Стили для текстового блока внутри соты */ .hexagon__info { width:114px; padding-top:33px; } } &-2 { top:-52px; left:216px; opacity: 0; animation: showBlock2 1s 1; animation-fill-mode: forwards; animation-delay: 1s; .hexagon__background { transform: rotate(60deg); } .hexagon__info { width: 114px; padding-top: 25px; padding-left: 12px; } } &-3 { top:104px; left:272px; opacity: 0; animation: showBlock3 1s 1; animation-fill-mode: forwards; animation-delay: 1.5s; .hexagon__background { transform: rotate(120deg); } .hexagon__info { width: 114px; padding-top: 31px; padding-left: 25px; } } &-4 { top:252px; left:212px; opacity: 0; animation: showBlock4 1s 1; animation-fill-mode: forwards; animation-delay: 2s; .hexagon__background { transform: rotate(180deg); } .hexagon__info { width: 114px; padding-top: 45px; padding-left: 26px; } } &-5 { top:244px; left:-14px; opacity: 0; animation: showBlock5 1s 1; animation-fill-mode: forwards; animation-delay: 2.5s; .hexagon__background { transform: rotate(240deg); } .hexagon__info { width: 114px; padding-top: 53px; padding-left: 14px; } } &-6 { top:88px; left:-60px; opacity: 0; animation: showBlock6 1s 1; animation-fill-mode: forwards; animation-delay: 3s; .hexagon__background { transform: rotate(300deg); } .hexagon__info { width: 114px; padding-top: 47px; padding-left: 1px; } } } /* Блок с сотой является фоном и имеет абсолютное позиционирование относительно родителя */ &__background { position:absolute; width:100%; } &__info { position: relative; & > div { display: flex; justify-content: center; } } /* Размеры текста заданы с учетом того, чтобы нормально отображались на мобильных устройствах */ &__step { font-size:12px; text-transform: uppercase; text-align: center; padding: 0 5px; width: 35px; color:#fff; text-shadow: 1px 1px rgba(0,0,0,.3); margin-top:8px; & > span { font-size:30px; display: block; margin-top:-12px; } } &__text { font-size:11px; padding:0 5px; & h4 { text-transform: uppercase; } & p { font-size:9px; line-height: 11px; } & img { width:18px; margin: 7px 0 0 10px; opacity: .7; } } /* Блок внутри между сотами с описанием */ &__middle { position:absolute; top:140px; left:calc(50% - 42px); text-align:center; width:85px; font-size:12px; opacity: .4; /* Задана анимация увеличения до появления, после анимации всех сот */ transform: scale(0); animation: middle 1s 1; animation-fill-mode: forwards; animation-delay: 3.5s; & h3 { text-transform: uppercase; } & p { font-size:8px; line-height: 10px; padding:0 10px 5px; } & img { width:18px; } } } /* Анимация (движение) */ @keyframes showBlock1 { 100% { top:0; left:60px; opacity:1; } } @keyframes showBlock2 { 100% { top:8px; left:166px; opacity:1; } } @keyframes showBlock3 { 100% { top:104px; left:212px; opacity:1; } } @keyframes showBlock4 { 100% { top:192px; left:152px; opacity:1; } } @keyframes showBlock5 { 100% { top:184px; left:46px; opacity:1; } } @keyframes showBlock6 { 100% { top:88px; left:0px; opacity:1; } } /* Анимация (увеличение) */ @keyframes middle { 100% { transform: scale(1); } } .color-white { color:#fff; }
На этом все, для просмотра доступно демо. Если у вас остались вопрос или пожелания, пишите в комментариях.