Эта статья является логическим продолжением моей предыдущей статьи, посвященной основам CSS3 transitions и, если в ней я показывала принципы работы этих основ на простых примерах, сейчас я хотела бы перейти к более сложным, красивым и интересным эффектам.
Из-за большого размера статья разбита на три части. Первая часть. Вторая часть
Демо материалы лежат здесь. Все префиксы проставлены в демо, здесь же я не буду на них акцентировать.
Предупреждение: эффекты работают только в современных браузерах, поддерживающих возможности CSS3.
Эффект #22
Для создания этого эффекта нам понадобится дополнить базовую html-структуру двумя блоками с изображениями и одним блоком с иконкой:
<div class="effect eff-22">
<div class="img-block img-block-left">
<img src="img/ef22.jpg" alt="Effect #22" />
</div>
<div class="img-block img-block-right">
<img src="img/ef22.jpg" alt="Effect #22" />
</div>
<div class="overlay">
<div class="icon"></div>
</div>
<div class="caption">
<h4>Title is Here</h4>
<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut.
</p>
<a class="btn" href="#" title="View More">View More</a>
</div>
</div>
В данном эффекте, чтобы картинка распалась на две части, мы создаем два блока по половине ширины от блока с эффектом, в каждый из которых помещаем одну и ту же картинку. Вот общие для обоих блоков стили:
.eff-22 .img-block {
height: 100%;
width: 50%;
overflow: hidden;
position: absolute;
z-index: 5;
transition: all 0.3s linear 0s;
}
Чтобы блоки расходились в разные стороны указанным образом, нам надо задать для них точку, относительно которой будет происходить анимация. Вот стили для каждого блока отдельно:
.eff-22 .img-block-left {
top: 0px;
left: 0px;
transform-origin: right bottom;
}
.eff-22 .img-block-right {
top: 0px;
right: 0px;
transform-origin: left bottom;
}
Сейчас у нас и в правом, и в левом блоке отображается по одному и тому же кусочку картинки, поэтому в правом блоке мы сместим картинку влево на 50%:
.eff-22 .img-block-right img {
transform: translate(-50%, 0);
}
Теперь стилизуем .caption. Мы делаем блок прозрачным, чтобы, пока подгружаются картинки, .caption не было видно:
.eff-22 .caption {
position: absolute;
top: 0px;
left: 0px;
width: 100%;
height: 100%;
text-align: center;
color: white;
background: rgba(0,0,0,0.6);
opacity: 0;
z-index: 1;
transition: all 0.01s linear 0.3s;
}
У внутренних элементов .caption сохраняются дефолтные стили.
И стилизуем .overlay: подробнее о составлении равнобедренных треугольников я рассказывала в эффекте #19.
.eff-22 .overlay {
position: absolute;
width: 0px;
height: 0px;
bottom: 0px;
left: 0px;
z-index: 10;
border: 150px solid transparent;
border-bottom: 50px solid rgba(255,255,255,0.6);
transition: all 0.2s linear 0.2s;
}
.eff-22 .overlay .icon {
width: 35px;
height: 23px;
background: url('https://eisenpar.com/view-icon.png') 0 0 no-repeat;
position: absolute;
top: 17px;
left: -18px;
}
Собираем эффект.
Сжимаем .overlay:
.eff-22:hover .overlay {
border-bottom: 0px solid rgba(255,255,255,0.6);
transition-delay: 0s;
}
.eff-22:hover .overlay .icon {
opacity: 0;
}
Стилизуем “распадающуюся” картинку:
.eff-22:hover .img-block-left {
transform: rotate(-90deg);
}
.eff-22:hover .img-block-right {
transform: rotate(90deg);
}
.eff-22:hover .img-block {
transition-delay: 0.2s;
}
Убираем прозрачность .caption:
.eff-22:hover .caption {
opacity: 1;
transition-delay: 0s;
}
Эффект #23
Для создания этого эффекта нам понадобится дополнить базовую html-структуру двумя блоками с изображениями и одним блоком с иконкой:
<div class="effect eff-23">
<div class="img-block img-block-top">
<img src="img/ef23.jpg" alt="Effect #23" />
</div>
<div class="img-block img-block-bottom">
<img src="img/ef23.jpg" alt="Effect #23" />
</div>
<div class="overlay">
<div class="icon"></div>
</div>
<div class="caption">
<h4>Title is Here</h4>
<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut.
</p>
<a class="btn" href="#" title="View More">View More</a>
</div>
</div>
Чтобы картинка раскрывалась на две части, мы, как и в эффекте #22, создаем два блока, каждый из которых занимает половину высоты блока с эффектом, и в каждый из этих блоков кладем одну и ту же картинку. Общие стили для обоих блоков:
.eff-23 .img-block {
height: 50%;
width: 100%;
overflow: hidden;
position: absolute;
z-index: 5;
transition: all 0.3s linear 0s;
}
Чтобы блоки “сжимались” относительно верхней и нижней границы блока с эффектом, нам надо задать transform-origin для каждого из них:
.eff-23 .img-block-top {
top: 0px;
left: 0px;
transform-origin: top;
}
.eff-23 .img-block-bottom {
bottom: 0px;
left: 0px;
transform-origin: bottom;
}
Теперь мы можем видеть и на верхнем, и на нижнем блоке одну и ту же часть изображения, поэтому подвинем изображение в нижнем блоке на 50% вверх, чтобы стало видно его нижнюю часть:
.eff-23 .img-block-bottom img {
transform: translate(0, -50%);
}
Теперь стилизуем .caption. Мы делаем блок прозрачным, чтобы, пока подгружаются картинки, .caption не было видно:
.eff-23 .caption {
position: absolute;
top: 0px;
left: 0px;
width: 100%;
height: 100%;
text-align: center;
color: white;
background: rgba(0,0,0,0.6);
opacity: 0;
z-index: 1;
transition: all 0.01s linear 0.3s;
}
У внутренних элементов .caption сохраняются дефолтные стили.
Стилизуем .overlay: подробнее о составлении равнобедренных треугольников я рассказывала в эффекте #19.
.eff-23 .overlay {
position: absolute;
width: 0px;
height: 0px;
bottom: 0px;
left: 0px;
z-index: 10;
border: 150px solid transparent;
border-bottom: 50px solid rgba(255,255,255,0.6);
transition: all 0.2s linear 0.1s;
}
.eff-23 .overlay .icon {
width: 35px;
height: 23px;
background: url('https://eisenpar.com/view-icon.png') 0 0 no-repeat;
position: absolute;
top: 17px;
left: -18px;
}
Собираем эффект.
Сжимаем блоки с картинками к краям блока с эффектами:
.eff-23:hover .img-block {
transform: scaleY(0);
transition-delay: 0.2s;
}
Убираем .overlay:
.eff-23:hover .overlay {
border-bottom: 0px solid rgba(255,255,255,0.6);
transition-delay: 0s;
}
.eff-23:hover .overlay .icon {
opacity: 0;
}
Возвращаем .caption непрозрачность:
.eff-23:hover .caption {
opacity: 1;
transition-delay: 0s;
}
Эффект #24
Для создания этого эффекта нам необходимо дополнить дефолтную html-структуру четырьмя блоками с картинками внутри и блоком с иконкой:
<div class="effect eff-24">
<div class="img-block img-block-1">
<img src="img/ef24.jpg" alt="Effect #24" />
</div>
<div class="img-block img-block-2">
<img src="img/ef24.jpg" alt="Effect #24" />
</div>
<div class="img-block img-block-3">
<img src="img/ef24.jpg" alt="Effect #24" />
</div>
<div class="img-block img-block-4">
<img src="img/ef24.jpg" alt="Effect #24" />
</div>
<div class="overlay">
<div class="icon"></div>
</div>
<div class="caption">
<h4>Title is Here</h4>
<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut.
</p>
<a class="btn" href="#" title="View More">View More</a>
</div>
</div>
Чтобы создать такой эффект поднимающейся “шторки”, необходимо взять четыре блока и поместить в них одну и ту же картинку. Высота каждого блока составляет четверть от высоты блока с эффектом:
.eff-24 .img-block {
width: 100%;
height: 25%;
position: absolute;
overflow: hidden;
left: 0px;
}
Каждый блок располагается ниже предыдущего на 25%, а изображение в каждом следующем блоке поднимается на 25% относительно положения картинки в предыдущем блоке (более подробно о такой организации блоков и картинок можно почитать в описании эффектов #7-9). Поскольку, при наведении, четвертый блок уходит вверх и прячется под третий, потом они оба уходят еще выше и прячутся под второй, а потом все три — под первый, самый большой z-index будет у первого блока, а самый маленький — у четвертого. Вот стили для всех четырех блоков и их изображений:
.eff-24 .img-block-1 {
top: 0px;
z-index: 5;
transition: all 0.15s linear 0s;
}
.eff-24 .img-block-2 {
top: 25%;
z-index: 4;
transition: all 0.3s linear 0s;
}
.eff-24 .img-block-2 img {
transform: translateY(-25%);
}
.eff-24 .img-block-3 {
top: 50%;
z-index: 3;
transition: all 0.45s linear 0s;
}
.eff-24 .img-block-3 img {
transform: translateY(-50%);
}
.eff-24 .img-block-4 {
top: 75%;
z-index: 2;
transition: all 0.6s linear 0s;
}
.eff-24 .img-block-4 img {
transform: translateY(-75%);
}
Теперь стилизуем .caption. Мы делаем блок прозрачным, чтобы, пока подгружаются картинки, .caption не было видно:
.eff-24 .caption {
position: absolute;
top: 0px;
left: 0px;
width: 100%;
height: 100%;
text-align: center;
color: white;
background: rgba(0,0,0,0.6);
opacity: 0;
z-index: 1;
transition: all 0.01s linear 0.6s;
}
У внутренних элементов .caption сохраняются дефолтные стили.
Стилизуем .overlay. Подробнее о составлении равнобедренных треугольников я рассказывала в эффекте #19.
.eff-24 .overlay {
position: absolute;
width: 0px;
height: 0px;
bottom: 0px;
left: 0px;
z-index: 10;
border: 150px solid transparent;
border-bottom: 50px solid rgba(255,255,255,0.6);
transition: all 0.2s linear 0.5s;
}
.eff-24 .overlay .icon {
width: 35px;
height: 23px;
background: url('https://eisenpar.com/view-icon.png') 0 0 no-repeat;
position: absolute;
top: 17px;
left: -18px;
}
Собираем эффект.
Задача — убрать все блоки с изображениями так, чтобы скрыть даже самый первый блок за пределы блока с эффектом. Таким образом, поднимем их все до 25% выше верхнего края блока с эффектом:
.eff-24:hover .img-block {
top: -25%;
}
Эффект “шторки” достигается комбинацией времени, выделенного на анимацию (мы прописывали это выше) и задержки подъема:
.eff-24:hover .img-block-3 {
transition-delay: 0.15s;
}
.eff-24:hover .img-block-2 {
transition-delay: 0.3s;
}
.eff-24:hover .img-block-1 {
transition-delay: 0.45s;
}
Убираем .overlay:
.eff-24:hover .overlay {
border-bottom: 0px solid rgba(255,255,255,0.6);
transition-delay: 0s;
}
.eff-24:hover .overlay .icon {
opacity: 0;
}
Делаем .caption непрозрачным:
.eff-24:hover .caption {
opacity: 1;
transition-delay: 0s;
}
Эффект #25
Для создания этого эффекта в дефолтную html-структуру включен блок с иконкой и три блока, которые будут поочередно появляться:
<div class="effect eff-25">
<img src="img/ef25.jpg" alt="Effect #25" />
<div class="overlay">
<div class="icon"></div>
</div>
<div class="flash flash-1"></div>
<div class="flash flash-2"></div>
<div class="flash flash-3"></div>
<div class="caption">
<h4>Title is Here</h4>
<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut.
</p>
<a class="btn" href="#" title="View More">View More</a>
</div>
</div>
Начнем со стилей для .flash блоков. Их три, они занимают по трети высоты блока с эффектом каждый:
.eff-25 .flash {
position: absolute;
width: 100%;
height: 100px;
opacity: 0;
left: 0px;
background: rgba(255,255,255,0.4);
}
.eff-25 .flash-1 {
top: 0px;
}
.eff-25 .flash-2 {
top: 100px;
}
.eff-25 .flash-3 {
top: 200px;
}
Теперь стилизуем .overlay, у которого сначала изменяется ширина, и он словно растягивается, а потом положение относительно блока, поскольку он отъезжает влево, за пределы блока с эффектом:
.eff-25 .overlay {
position: absolute;
width: 140px;
height: 40px;
top: 130px;
left: 0px;
background: rgba(255,255,255,0.6);
transition: width 0.2s linear 0s, left 0.15s linear 0.2s;
}
.eff-25 .overlay:after {
content: " ";
display: block;
position: absolute;
width: 0px;
top: 0;
left: 100%;
border: 20px solid transparent;
border-left: 20px solid rgba(255,255,255,0.6);
}
.eff-25 .overlay .icon {
width: 35px;
height: 23px;
background: url('https://eisenpar.com/view-icon.png') 0 0 no-repeat;
position: absolute;
top: 9px;
left: 83%;
z-index: 10;
}
Прячем .caption за нижний край блока с эффектом и даем ей более сложный transition-timing-function:
.eff-25 .caption {
position: absolute;
top: 100%;
left: 0px;
width: 100%;
height: 100%;
text-align: center;
color: white;
transition: all 0.3s cubic-bezier(0.16, 0.32, 0, 0.86) 0s;
}
Стили элементов .caption остаются дефолтными.
Теперь наша задача сделать так, чтобы при наведении сначала один .flash появлялся и исчезал, и только потом появлялся следующий. Чтобы это сделать, мы должны воспользоваться свойством animation и сопутствующим ему @keyframes. Начнем с @keyframes: он нужен для того, чтобы задать имя будущей анимации и ключевые точки, который проходит в своем движении анимируемый элемент. У .flash есть три ключевый точки:
- начальная, в которой он прозрачен
- средняя, в которой он появляется
- конечная, в которой он снова прозрачен
Таким образом, мы можем задать такой @keyframes, где flash — это имя анимации:
@keyframes flash {
from {opacity: 0;}
50% {opacity: 1;}
to {opacity: 0;}
}
Теперь собираем эффект.
При наведении нам нужно запустить анимацию. Для этого мы используем свойство animation. Здесь мы используем три параметра: имя, время, необходимое на прохождение всех ключевых точек каждой вспышки и animation-timing-function, аналогичная transition-timing-function.
.eff-25:hover .flash {
animation: flash 0.3s linear;
}
Теперь, если посмотреть, что получилось, станет видно, что все .flash вспыхивают одновременно и гаснут, таким образом, нам надо использовать еще один параметр animation — задержку, работающую аналогично задержке для transition:
.eff-25:hover .flash-1 {
animation-delay: 0.45s;
}
.eff-25:hover .flash-2 {
animation-delay: 0.55s;
}
.eff-25:hover .flash-3 {
animation-delay: 0.65s;
}
Добавляем “растяжение” и исчезновение .overlay:
.eff-25:hover .overlay {
width: 170px;
left: -190px;
}
И поднимаем .caption:
.eff-25:hover .caption {
top: 0px;
transition-delay: 0.8s;
}
Эффект #26
Для создания этого эффекта необходимо добавить в дефолтную структуру блок с иконкой и блок-полоску, который будет видно при наведении:
<div class="effect eff-26">
<img src="img/ef26.jpg" alt="Effect #26" />
<div class="overlay">
<div class="icon"></div>
</div>
<div class="flash"></div>
<div class="caption">
<h4>Title is Here</h4>
<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut.
</p>
<a class="btn" href="#" title="View More">View More</a>
</div>
</div>
Начнем со стилизации полоски. Это узкий длинный блок, который будет опускаться и подниматься при наведении. Он вынесен в начальную точку анимации: вверх, за пределы блока с эффектом.
.eff-26 .flash {
position: absolute;
left: -200px;
top: -200px;
background-color: rgba(255,255,255,0.6);
width: 590px;
height: 100px;
transform: rotate(-25deg);
}
Теперь зададим @keyframes для определения ключевых точек анимации (подробнее про это написано в эффекте #25):
@keyframes flash-movement {
from {top: -200px;}
to {top: 400px;}
}
Зададим стили для .overlay, о котором подробнее тоже рассказано в эффекте #25:
.eff-26 .overlay {
position: absolute;
width: 140px;
height: 40px;
top: 130px;
left: 0px;
background: rgba(255,255,255,0.6);
transition: width 0.2s linear 0s, left 0.15s linear 0.2s;
}
.eff-26 .overlay:after {
content: " ";
display: block;
position: absolute;
width: 0px;
top: 0;
left: 100%;
border: 20px solid transparent;
border-left: 20px solid rgba(255,255,255,0.6);
}
.eff-26 .overlay .icon {
width: 35px;
height: 23px;
background: url('https://eisenpar.com/view-icon.png') 0 0 no-repeat;
position: absolute;
top: 9px;
left: 83%;
z-index: 10;
}
И зададим прозрачность для .caption:
.eff-26 .caption {
position: absolute;
top: 0;
left: 0px;
width: 100%;
height: 100%;
text-align: center;
color: white;
opacity: 0;
transition: all 0.2s linear 0s;
}
У внутренних элементов .caption остаются дефолтные стили.
Собираем эффект.
Запускаем анимацию блока с полоской. Как видите, здесь используется больше параметров свойства animation, чем в прошлом эффекте. Кроме названия анимации, времени и animation-timing-function используется еще:
- iteration-count — сколько раз будем проигрывать анимацию. В данном случае — дважды: сверху вниз и снизу вверх.
- animation-direction — показывает, будет ли элемент проходить ключевые точки в прямом порядке (от from к to) или в обратном (от to к from). Значение alternate означает, что в каждый нечетный проигрыш анимация будет идти в прямом порядке, а в каждый четный — в обратном, вот почему первый раз полоска движется сверху вниз, а второй раз — снизу вверх.
.eff-26:hover .flash {
animation: flash-movement 0.4s linear 0.45s 2 alternate;
}
Убираем .overlay:
.eff-26:hover .overlay {
width: 170px;
left: -190px;
}
Меняем прозрачность .caption:
.eff-26:hover .caption {
opacity: 1;
transition-delay: 0.8s;
}
Эффект #27
Для работы с этим эффектом необходимо дополнить дефолтную html-структуру блоком с иконкой и блоком с кругом:
<div class="effect eff-27">
<img src="img/ef27.jpg" alt="Effect #27" />
<div class="overlay">
<div class="icon"></div>
</div>
<div class="circle">
<div class="half-circle half-circle-left"></div>
<div class="half-circle half-circle-right"></div>
</div>
<div class="caption">
<h4>Title is Here</h4>
<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut.
</p>
<a class="btn" href="#" title="View More">View More</a>
</div>
</div>
Начнем с блока с кругом, который появляется при наведении. Стили для самого блока:
.eff-27 .circle {
width: 100px;
height: 100px;
position: absolute;
top: 100px;
left: 100px;
opacity: 0;
}
При наведении круг распадается на две половины, чтобы это осуществить, соберем его из двух полукруглых блоков, которые и будем потом отодвигать друг от друга:
.eff-27 .circle .half-circle {
background: rgba(255,255,255,0.6);
width: 50px;
height: 100px;
position: absolute;
}
.eff-27 .circle .half-circle-left {
top: 0px;
left: 0px;
border-radius: 100px 0px 0px 100px;
}
.eff-27 .circle .half-circle-right {
top: 0px;
right: 0px;
border-radius: 0px 100px 100px 0px;
}
Теперь создаем @keyframes для каждого из полукруглых блоков. Подробнее о @keyframes я писала в эффекте #25. Как видим, каждый из полукругов проходит три ключевых точки:
- полукруг находится на своем дефолтном месте и является частью круга
- он отходит в сторону, уменьшается в размерах и превращается в полноценный круг
- улетает за пределы блока с эффектом
@keyframes half-circle-left {
from {
top: 0px;
left: 0px;
border-radius: 100px 0px 0px 100px;
}
20% {
top: 25px;
left: -15px;
height: 50px;
border-radius: 100px;
}
to {
top: 0px;
left: -500px;
height: 50px;
border-radius: 100px;
}
}
@keyframes half-circle-right {
from {
top: 0px;
right: 0px;
border-radius: 0px 100px 100px 0px;
}
20% {
top: 25px;
right: -15px;
height: 50px;
border-radius: 100px;
}
to {
top: 0px;
right: -500px;
height: 50px;
border-radius: 100px;
}
}
Зададим стили для .overlay, о котором подробнее тоже рассказано в эффекте #25:
.eff-27 .overlay {
position: absolute;
width: 140px;
height: 40px;
top: 130px;
left: 0px;
background: rgba(255,255,255,0.6);
transition: width 0.2s linear 0s, left 0.15s linear 0.2s;
}
.eff-27 .overlay:after {
content: " ";
display: block;
position: absolute;
width: 0px;
top: 0;
left: 100%;
border: 20px solid transparent;
border-left: 20px solid rgba(255,255,255,0.6);
}
.eff-27 .overlay .icon {
width: 35px;
height: 23px;
background: url('https://eisenpar.com/view-icon.png') 0 0 no-repeat;
position: absolute;
top: 9px;
left: 83%;
z-index: 10;
}
Уберем вниз .caption
.eff-27 .caption {
position: absolute;
top: 100%;
left: 0px;
width: 100%;
height: 100%;
text-align: center;
color: white;
transition: all 0.2s linear 0s;
}
У остальных элементов .caption остаются дефолтные стили.
Собираем эффект.
Сначала меняем прозрачность блока с кругом:
.eff-27:hover .circle {
opacity: 1;
transition-delay: 0.4s;
}
Потом вызываем анимации каждого из полукругов. Кроме параметров, рассмотренных в эффектах #25-26, мы используем тут один новый параметр: animation-fill-mode. Этот параметр определяет, какие стили применяются к анимированным элементам, когда анимация закончена или остановлена. По дефолту, после анимации элементы возвращаются в положение, заданное первой ключевой точкой @keyframes, что нам здесь совершенно не нужно, иначе прямо за .caption снова появится белый круг. Значение forwards необходимо для того, чтобы элементы оставались в положении, заданном последней ключевой точкой @keyframes, то есть, за пределами блока с эффектом:
.eff-27:hover .half-circle-left {
animation: half-circle-left 1s linear 0.55s forwards;
}
.eff-27:hover .half-circle-right {
animation: half-circle-right 1s linear 0.55s forwards;
}
Теперь убираем .overlay:
.eff-27:hover .overlay {
width: 170px;
left: -190px;
}
И выдвигаем вверх .caption:
.eff-27:hover .caption {
top: 0px;
transition-delay: 1s;
}
Эффект #28
Для работы с этим эффектом необходимо дополнить дефолтную html-структуру блоком с иконкой и блоком с полукруглой выемкой, который становится виден при наведении:
<div class="effect eff-28">
<img src="img/ef28.jpg" alt="Effect #28" />
<div class="overlay">
<div class="icon"></div>
</div>
<div class="circle"></div>
<div class="caption">
<h4>Title is Here</h4>
<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut.
</p>
<a class="btn" href="#" title="View More">View More</a>
</div>
</div>
Начнем с блока с выемкой. Сам по себе этот блок — большая окружность с границей, ширина которой — 3px, расположенная так, чтобы только часть ее находилась в пределах блока с эффектом. Чтобы заполнить фоном все пространство блока с эффектом по левую сторону от окружности, дадим ей большую полупрозрачную тень:
.eff-28 .circle {
width: 600px;
height: 600px;
border: 3px solid rgba(255,255,255,0.6);
-webkit-border-radius: 300px;
border-radius: 300px;
position: absolute;
bottom: -50px;
left: 50px;
box-shadow: 0px 0px 235px 1000px rgba(255,255,255,0.5);
opacity: 0;
transition: width 0.4s linear 0s, height 0.4s linear 0s, opacity 0.15s linear 0s;
}
Теперь уменьшим размер .caption до нуля:
.eff-28 .caption {
position: absolute;
top: 0;
left: 0px;
width: 100%;
height: 100%;
text-align: center;
color: white;
transform: scale(0);
transition: all 0.2s linear 0s;
}
У прочих элементов .caption остаются дефолтные стили.
Остается только стилизовать блок с иконкой. Вот его базовые стили:
.eff-28 .overlay {
position: absolute;
width: 100px;
height: 100px;
top: 100px;
left: 100px;
border-radius: 500px;
background: rgba(255,255,255,0.6);
}
.eff-28 .overlay .icon {
width: 35px;
height: 23px;
background: url('https://eisenpar.com/view-icon.png') 0 0 no-repeat;
position: absolute;
top: 39px;
left: 33px;
}
Задача — прописать ему анимацию “подпрыгивания”, и для этого нам понадобится вот такой @keyframes (подробнее о @keyframes можно прочитать в эффекте #25). Элемент проходит пять ключевых точек:
- Исходное положение
- Ударяется о нижний край блока с эффектом
- Возвращается в исходное положение
- Ударяется о верхний край блока с эффектом
- Ускоряясь, улетает за край блока с эффектом
@keyframes bounce {
from {top: 100px;}
25% {top: 200px;}
50% {top: 100px;}
75% {top: 0px;}
to {top: -200px;}
}
Собираем эффект.
Сначала применяем анимацию к блоку с иконкой. Animation подробно рассматривался в эффекте #25, параметр animation-fill-mode в эффекте #27:
.eff-28:hover .overlay {
animation: bounce 0.5s linear forwards;
}
Потом, изменяя прозрачность, ширину и высоту элемента с выемкой, создаем иллюзию движения этого блока:
.eff-28:hover .circle {
opacity: 1;
width: 400px;
height: 400px;
transition-delay: 0.35s;
}
И, наконец, увеличиваем .caption:
.eff-28:hover .caption {
transform: scale(1);
transition-delay: 0.9s;
}
Эффект #29
Для этого эффекта необходимо дополнить дефолтную html-структуру блоком с иконкой и квадратным блоком, появляющимся при наведении:
<div class="effect eff-29">
<img src="img/ef29.jpg" alt="Effect #29" />
<div class="overlay">
<div class="icon"></div>
</div>
<div class="square"></div>
<div class="caption">
<h4>Title is Here</h4>
<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut.
</p>
<a class="btn" href="#" title="View More">View More</a>
</div>
</div>
Начнем с квадратного блока. Начальных стилей у этого блока совсем немного, потому что основные стили, включая transition, будут применены к нему только при наведении:
.eff-29 .square {
width: 84%;
height: 84%;
position: absolute;
top: 7%;
left: 7%;
border: 3px solid rgba(255,255,255,0.6);
border-radius: 10px;
transform: scale(0);
opacity: 0;
}
Перемещаем .caption наверх, за пределы блока с эффектом:
.eff-29 .caption {
position: absolute;
top: -100%;
left: 0px;
width: 100%;
height: 100%;
text-align: center;
color: white;
transition: all 0.2s linear 0s;
}
Внутренние элементы .caption сохраняют дефолтные стили.
Стилизуем блок с иконкой полностью аналогично этому же блоку из эффекта #28, где я рассматривала эти стили подробнее, здесь я только приведу сами стили и @keyframes:
.eff-29 .overlay {
position: absolute;
width: 100px;
height: 100px;
top: 100px;
left: 100px;
border-radius: 500px;
background: rgba(255,255,255,0.6);
}
.eff-29 .overlay .icon {
width: 35px;
height: 23px;
background: url('https://eisenpar.com/view-icon.png') 0 0 no-repeat;
position: absolute;
top: 39px;
left: 33px;
}
@keyframes bounce {
from {top: 100px;}
25% {top: 200px;}
50% {top: 100px;}
75% {top: 0px;}
to {top: -200px;}
}
Собираем эффект.
Сначала добавляем стили для квадратного блока. Увеличиваем его в размерах, делаем его непрозрачным и добавляем тень, чтобы создать иллюзию наличия фона за границами квадрата. Почему мы добавляем transition только при наведении — потому что при отмене hover квадрат сразу должен исчезать.
.eff-29:hover .square {
transform: scale(1);
opacity: 1;
box-shadow: 0px 0px 200px 60px rgba(255,255,255,0.4);
transition: transform 0.3s linear 0.3s, opacity 0.2s linear 0.3s, box-shadow 0.2s linear 0.7s;
}
Добавляем анимацию блока с иконкой, animation подробно рассматривался в эффекте #25, параметр animation-fill-mode в эффекте #27:
.eff-29:hover .overlay {
animation: bounce 0.5s linear forwards;
}
И опускаем .caption:
.eff-29:hover .caption {
top: 0px;
transition-delay: 0.8s;
}
Эффект #30
Чтобы создать этот эффект, нам необходимо дополнить дефолтную html-структуру блоком с иконкой и блоком с пузырьками, в котором нужно создать столько блоков-пузырьков, сколько вы хотите видеть в вашем эффекте:
<div class="effect eff-30">
<img src="img/ef30.jpg" alt="Effect #30" />
<div class="overlay">
<div class="icon"></div>
</div>
<div class="bubbles">
<div class="bubble"></div>
<div class="bubble bubble-2"></div>
<div class="bubble bubble-3"></div>
<div class="bubble bubble-4"></div>
<div class="bubble bubble-5"></div>
<div class="bubble bubble-6"></div>
<div class="bubble bubble-7"></div>
<div class="bubble bubble-8"></div>
<div class="bubble bubble-9"></div>
<div class="bubble bubble-10"></div>
<div class="bubble bubble-11"></div>
<div class="bubble bubble-12"></div>
<div class="bubble bubble-13"></div>
</div>
<div class="caption">
<h4>Title is Here</h4>
<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut.
</p>
<a class="btn" href="#" title="View More">View More</a>
</div>
</div>
Начнем с блока с иконкой. Он полностью аналогичен этому же блоку из эффекта #28, где и можно прочитать про него подробнее, здесь я только приведу сами стили и @keyframes:
.eff-30 .overlay {
position: absolute;
width: 100px;
height: 100px;
top: 100px;
left: 100px;
border-radius: 500px;
background: rgba(255,255,255,0.6);
}
.eff-30 .overlay .icon {
width: 35px;
height: 23px;
background: url('https://eisenpar.com/view-icon.png') 0 0 no-repeat;
position: absolute;
top: 39px;
left: 33px;
}
@keyframes bounce {
from {top: 100px;}
25% {top: 200px;}
50% {top: 100px;}
75% {top: 0px;}
to {top: -200px;}
}
Теперь прячем .caption за нижней границей блока с эффектом:
.eff-30 .caption {
position: absolute;
top: 100%;
left: 0px;
width: 100%;
height: 100%;
text-align: center;
color: white;
transition: all 0.4s linear 0s;
}
Внутренние элементы .caption сохраняют дефолтные стили.
Теперь самое интересное — блок с пузырьками и сами пузырьки.
Стили для блока с пузырьками:
.eff-30 .bubbles {
width: 100%;
height: 100%;
position: absolute;
top: 0px;
left: 0px;
}
Стили для каждого пузырька (почитать подробнее про радиальные градиенты можно в эффекте #10):
.eff-30 .bubbles .bubble {
width: 43px;
height: 43px;
position: absolute;
top: 100%;
background: radial-gradient(circle at center center, rgba(255,255,255,0) 25%, rgba(255,255,255,0.7) );
border-radius: 300px;
}
Дальше наша задача расположить пузырьки по горизонтали вразнобой, чтобы они не поднимались в одном и том же месте:
.eff-30 .bubbles .bubble-2 {
left: 20px;
}
.eff-30 .bubbles .bubble-3 {
left: 60px;
}
.eff-30 .bubbles .bubble-4 {
left: 90px;
}
.eff-30 .bubbles .bubble-5 {
left: 120px;
}
.eff-30 .bubbles .bubble-6 {
left: 150px;
}
.eff-30 .bubbles .bubble-7 {
left: 250px;
}
.eff-30 .bubbles .bubble-8 {
left: 300px;
}
.eff-30 .bubbles .bubble-9 {
left: 190px;
}
.eff-30 .bubbles .bubble-10 {
left: 220px;
}
.eff-30 .bubbles .bubble-11 {
left: 270px;
}
.eff-30 .bubbles .bubble-12 {
left: 45px;
}
.eff-30 .bubbles .bubble-13 {
left: 15px;
}
И @keyframes (подробнее о котором я написала в эффекте #25) для них самый простой, состоящий из двух ключевых точек:
@keyframes bubble {
from {
top: 100%;
}
to {
top: -100%;
}
}
Собираем эффект.
Добавляем анимацию блока с иконкой, animation подробно рассматривался в эффекте #25, параметр animation-fill-mode в эффекте #27:
.eff-30:hover .overlay {
animation: bounce 0.6s linear forwards;
}
Потом запускаем пузырьки. Вызываем анимацию для них. В данном случае мы используем, кроме прочих, рассмотреных в эффекте #25 параметров, параметр animation-iteration-count со значением infinite, что означает, что анимация будет проигрываться бесконечное количество раз. Пока курсор наведен на блок с эффектом, пузырьки не перестанут лететь:
.eff-30:hover .bubbles .bubble {
animation: bubble 9s infinite;
}
Теперь, чтобы пузырьки вылетали еще и в разное время, выставим им задержку:
.eff-30:hover .bubbles .bubble-2 {
animation-delay: 2s;
}
.eff-30:hover .bubbles .bubble-3 {
animation-delay: 6s;
}
.eff-30:hover .bubbles .bubble-4 {
animation-delay: 3.5s;
}
.eff-30:hover .bubbles .bubble-5 {
animation-delay: 4s;
}
.eff-30:hover .bubbles .bubble-6 {
animation-delay: 7.2s;
}
.eff-30:hover .bubbles .bubble-7 {
animation-delay: 1s;
}
.eff-30:hover .bubbles .bubble-8 {
animation-delay: 2.6s;
}
.eff-30:hover .bubbles .bubble-9 {
animation-delay: 5s;
}
.eff-30:hover .bubbles .bubble-10 {
animation-delay: 6.4s;
}
.eff-30:hover .bubbles .bubble-11 {
animation-delay: 8s;
}
.eff-30:hover .bubbles .bubble-12 {
animation-delay: 5.3s;
}
.eff-30:hover .bubbles .bubble-13 {
animation-delay: 8.5s;
}
Остается только поднять .caption:
.eff-30:hover .caption {
top: 0px;
transition-delay: 0.7s;
}
Надеюсь, моя статья оказалась вам полезна и вдохновила на украшение ваших сайтов новыми, интересными эффектами!
Автор: eisenfox