Интересный вариант анимации кнопки like при клике и наведении. Два состояния кнопки — like/liked + анимация иконки. В этом примере мы используем javascript-библиотеку GSAP. Итак, поехали 🧐
HTML
<button class="button dark">
<div class="hand">
<div class="thumb"></div>
</div>
<span>Like<span>d</span></span>
</button>
<button class="button">
<div class="hand">
<div class="thumb"></div>
</div>
<span>Like<span>d</span></span>
</button>
CSS
.button {
--color: #1e2235;
--color-hover: #1e2235;
--color-active: #fff;
--icon: #bbc1e1;
--icon-hover: #8a91b4;
--icon-active: #fff;
--background: #fff;
--background-hover: #fff;
--background-active: #362a89;
--border: #e1e6f9;
--border-active: #362a89;
--shadow: rgba(0, 17, 119, 0.025);
display: block;
outline: none;
cursor: pointer;
position: relative;
border: 0;
background: none;
padding: 8px 20px 8px 24px;
border-radius: 9px;
line-height: 27px;
font-family: inherit;
font-weight: 600;
font-size: 14px;
color: var(--color);
-webkit-appearance: none;
-webkit-tap-highlight-color: transparent;
-webkit-transition: color 0.2s linear;
transition: color 0.2s linear;
}
.button.dark {
--color: #f6f8ff;
--color-hover: #f6f8ff;
--color-active: #fff;
--icon: #8a91b4;
--icon-hover: #bbc1e1;
--icon-active: #fff;
--background: #1e2235;
--background-hover: #171827;
--background-active: #275efe;
--border: transparent;
--border-active: transparent;
--shadow: rgba(0, 17, 119, 0.16);
}
.button:hover {
--icon: var(--icon-hover);
--color: var(--color-hover);
--background: var(--background-hover);
--border-width: 2px;
}
.button:active {
--scale: 0.95;
}
.button:not(.liked):hover {
--hand-rotate: 8;
--hand-thumb-1: -12deg;
--hand-thumb-2: 36deg;
}
.button.liked {
--span-x: 2px;
--span-d-o: 1;
--span-d-x: 0;
--icon: var(--icon-active);
--color: var(--color-active);
--border: var(--border-active);
--background: var(--background-active);
}
.button:before {
content: "";
min-width: 103px;
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
border-radius: inherit;
-webkit-transition: background 0.2s linear, box-shadow 0.2s linear, -webkit-transform 0.2s;
transition: background 0.2s linear, box-shadow 0.2s linear, -webkit-transform 0.2s;
transition: background 0.2s linear, transform 0.2s, box-shadow 0.2s linear;
transition: background 0.2s linear, transform 0.2s, box-shadow 0.2s linear, -webkit-transform 0.2s;
-webkit-transform: scale(var(--scale, 1)) translateZ(0);
transform: scale(var(--scale, 1)) translateZ(0);
background: var(--background);
box-shadow: inset 0 0 0 var(--border-width, 1px) var(--border), 0 4px 8px var(--shadow), 0 8px 20px var(--shadow);
}
.button .hand {
width: 11px;
height: 11px;
border-radius: 2px 0 0 0;
background: var(--icon);
position: relative;
margin: 10px 8px 0 0;
-webkit-transform-origin: -5px -1px;
transform-origin: -5px -1px;
-webkit-transition: background 0.2s linear, -webkit-transform 0.25s;
transition: background 0.2s linear, -webkit-transform 0.25s;
transition: transform 0.25s, background 0.2s linear;
transition: transform 0.25s, background 0.2s linear, -webkit-transform 0.25s;
-webkit-transform: rotate(calc(var(--hand-rotate, 0) * 1deg)) translateZ(0);
transform: rotate(calc(var(--hand-rotate, 0) * 1deg)) translateZ(0);
}
.button .hand:before,
.button .hand:after {
content: "";
background: var(--icon);
position: absolute;
-webkit-transition: background 0.2s linear, box-shadow 0.2s linear;
transition: background 0.2s linear, box-shadow 0.2s linear;
}
.button .hand:before {
left: -5px;
bottom: 0;
height: 12px;
width: 4px;
border-radius: 1px 1px 0 1px;
}
.button .hand:after {
right: -3px;
top: 0;
width: 4px;
height: 4px;
border-radius: 0 2px 2px 0;
background: var(--icon);
box-shadow: -0.5px 4px 0 var(--icon), -1px 8px 0 var(--icon), -1.5px 12px 0 var(--icon);
-webkit-transform: scaleY(0.6825);
transform: scaleY(0.6825);
-webkit-transform-origin: 0 0;
transform-origin: 0 0;
}
.button .hand .thumb {
background: var(--icon);
width: 10px;
height: 4px;
border-radius: 2px;
-webkit-transform-origin: 2px 2px;
transform-origin: 2px 2px;
position: absolute;
left: 0;
top: 0;
-webkit-transition: background 0.2s linear, -webkit-transform 0.25s;
transition: background 0.2s linear, -webkit-transform 0.25s;
transition: transform 0.25s, background 0.2s linear;
transition: transform 0.25s, background 0.2s linear, -webkit-transform 0.25s;
-webkit-transform: scale(0.85) translateY(-0.5px) rotate(var(--hand-thumb-1, -45deg)) translateZ(0);
transform: scale(0.85) translateY(-0.5px) rotate(var(--hand-thumb-1, -45deg)) translateZ(0);
}
.button .hand .thumb:before {
content: "";
height: 4px;
width: 7px;
border-radius: 2px;
-webkit-transform-origin: 2px 2px;
transform-origin: 2px 2px;
background: var(--icon);
position: absolute;
left: 7px;
top: 0;
-webkit-transition: background 0.2s linear, -webkit-transform 0.25s;
transition: background 0.2s linear, -webkit-transform 0.25s;
transition: transform 0.25s, background 0.2s linear;
transition: transform 0.25s, background 0.2s linear, -webkit-transform 0.25s;
-webkit-transform: rotate(var(--hand-thumb-2, -45deg)) translateZ(0);
transform: rotate(var(--hand-thumb-2, -45deg)) translateZ(0);
}
.button .hand,
.button span {
display: inline-block;
vertical-align: top;
}
.button .hand span,
.button span span {
opacity: var(--span-d-o, 0);
-webkit-transition: opacity 0.2s linear, -webkit-transform 0.25s;
transition: opacity 0.2s linear, -webkit-transform 0.25s;
transition: transform 0.25s, opacity 0.2s linear;
transition: transform 0.25s, opacity 0.2s linear, -webkit-transform 0.25s;
-webkit-transform: translateX(var(--span-d-x, 4px)) translateZ(0);
transform: translateX(var(--span-d-x, 4px)) translateZ(0);
}
.button>span {
-webkit-transition: -webkit-transform 0.25s;
transition: -webkit-transform 0.25s;
transition: transform 0.25s;
transition: transform 0.25s, -webkit-transform 0.25s;
-webkit-transform: translateX(var(--span-x, 4px)) translateZ(0);
transform: translateX(var(--span-x, 4px)) translateZ(0);
}
JS
Подключаем GSAP
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.2.6/gsap.min.js"></script>
Для чего нужна библиотека GSAP? 🤔
Анимации, конечно же, лучше делать через CSS. Однако, это требует прокачанных навыков, и не работает в старых браузерах. Поэтому, если нужна поддержка старых браузеров и нужно сделать быстро, то эта библиотека нас выручает. Более подробнее смотрите тут.
document.querySelectorAll('.button').forEach(button => {
button.addEventListener('click', e => {
button.classList.toggle('liked');
if (button.classList.contains('liked')) {
gsap.fromTo(button, {
'--hand-rotate': 8
}, {
ease: 'none',
keyframes: [{
'--hand-rotate': -45,
duration: .16,
ease: 'none'
}, {
'--hand-rotate': 15,
duration: .12,
ease: 'none'
}, {
'--hand-rotate': 0,
duration: .2,
ease: 'none',
clearProps: true
}]
});
}
})
});