Анимированная кнопка лайка при клике и наведении (GSAP)

Интересный вариант анимации кнопки like при клике и наведении. Два состояния кнопки — like/liked + анимация иконки. В этом примере мы используем javascript-библиотеку GSAP. Итак, поехали 🧐

Содержание
  1. HTML
  2. CSS
  3. JS

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
        }]
      });
    }
  })
});

Источник
Оцените статью
( 6 оценок, среднее 4.83 из 5 )
Поделишься в соц. сетях? 🙂 Спасибо 🙏
Devtutor
Добавить комментарий