Форма входа

Бесплатный раздел

Уважаемые пользователи!
Доводим до вашего сведения, что мы не занимаемся обучениями по системе uCoz и настройками Ваших сайтов.
Подобные просьбы и вопросы - будут игнорироваться!

Анимированные кнопки для скачивания/закгрузок на вашем сайте.

Дата добавления: 03.10.2019 - 20:12
Добавил: Buger
Количество просмотров: 43
Количество комментариев: 0
Размер файла: 15.5 Kb
Рейтинг материала: 5.0 / 1
Анимированные кнопки для скачивания/закгрузок на вашем сайте.
БЕСПЛАТНО
рейтинг 5.0
/
голосов 1
Хотелось бы поделиться с вами несколькими удивительными анимациями для кнопок загрузки (скачивания). Данные кнопки имеют современный стиль и кроссбраузерную анимацию при клике. Настроить их цветовую гамму вы сможете в стилях.

Смотрите демонстрацию!

Давайте приступим к установке этих красивых кнопок.

Для начала нам нужно прописать HTML-код для кнопок:
Код
<a href="" class="button">
  <ul>
  <li>Download</li>
  <li>Downloading</li>
  <li>Open File</li>
  </ul>
  <div>
  <svg viewBox="0 0 24 24"></svg>
  </div>
</a>

<a href="" class="button dark-single">
  <div>
  <svg viewBox="0 0 24 24"></svg>
  </div>
</a>

<div></div>

<a href="" class="button white-single">
  <div>
  <svg viewBox="0 0 24 24"></svg>
  </div>
</a>

<a href="" class="button dark">
  <ul>
  <li>Download</li>
  <li>Downloading</li>
  <li>Open File</li>
  </ul>
  <div>
  <svg viewBox="0 0 24 24"></svg>
  </div>
</a>

Затем добавьте в файл стилей (.css) в самый низ, следующий код:
Код
.button.dark-single {
  --background: none;
  --rectangle: #242836;
  --success: #4bc793;
}
.button.white-single {
  --background: none;
  --rectangle: #f5f9ff;
  --arrow: #275efe;
  --success: #275efe;
  --shadow: rgba(10, 22, 50, 0.1);
}
.button.dark {
  --background: #242836;
  --rectangle: #1c212e;
  --arrow: #f5f9ff;
  --text: #f5f9ff;
  --success: #2f3545;
}

.button {
  --background: #275efe;
  --rectangle: #184fee;
  --success: #4672f1;
  --text: #fff;
  --arrow: #fff;
  --checkmark: #fff;
  --shadow: rgba(10, 22, 50, 0.24);
  display: flex;
  overflow: hidden;
  text-decoration: none;
  -webkit-mask-image: -webkit-radial-gradient(white, black);
  background: var(--background);
  border-radius: 8px;
  box-shadow: 0 2px 8px -1px var(--shadow);
  transition: box-shadow 0.2s ease, -webkit-transform 0.2s ease;
  transition: transform 0.2s ease, box-shadow 0.2s ease;
  transition: transform 0.2s ease, box-shadow 0.2s ease, -webkit-transform 0.2s ease;
}
.button:active {
  -webkit-transform: scale(0.95);
  transform: scale(0.95);
  box-shadow: 0 1px 4px -1px var(--shadow);
}
.button ul {
  margin: 0;
  padding: 16px 40px;
  list-style: none;
  text-align: center;
  position: relative;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
  font-size: 16px;
  font-weight: 500;
  line-height: 28px;
  color: var(--text);
}
.button ul li:not(:first-child) {
  top: 16px;
  left: 0;
  right: 0;
  position: absolute;
}
.button ul li:nth-child(2) {
  top: 76px;
}
.button ul li:nth-child(3) {
  top: 136px;
}
.button > div {
  position: relative;
  width: 60px;
  height: 60px;
  background: var(--rectangle);
}
.button > div:before, .button > div:after {
  content: "";
  display: block;
  position: absolute;
}
.button > div:before {
  border-radius: 1px;
  width: 2px;
  top: 50%;
  left: 50%;
  height: 17px;
  margin: -9px 0 0 -1px;
  background: var(--arrow);
}
.button > div:after {
  width: 60px;
  height: 60px;
  -webkit-transform-origin: 50% 0;
  transform-origin: 50% 0;
  border-radius: 0 0 80% 80%;
  background: var(--success);
  top: 0;
  left: 0;
  -webkit-transform: scaleY(0);
  transform: scaleY(0);
}
.button > div svg {
  display: block;
  position: absolute;
  width: 20px;
  height: 20px;
  left: 50%;
  top: 50%;
  margin: -9px 0 0 -10px;
  fill: none;
  z-index: 1;
  stroke-width: 2px;
  stroke: var(--arrow);
  stroke-linecap: round;
  stroke-linejoin: round;
}
.button.loading ul {
  -webkit-animation: text calc(var(--duration) * 1ms) linear forwards calc(var(--duration) * 0.065ms);
  animation: text calc(var(--duration) * 1ms) linear forwards calc(var(--duration) * 0.065ms);
}
.button.loading > div:before {
  -webkit-animation: line calc(var(--duration) * 1ms) linear forwards calc(var(--duration) * 0.065ms);
  animation: line calc(var(--duration) * 1ms) linear forwards calc(var(--duration) * 0.065ms);
}
.button.loading > div:after {
  -webkit-animation: background calc(var(--duration) * 1ms) linear forwards calc(var(--duration) * 0.065ms);
  animation: background calc(var(--duration) * 1ms) linear forwards calc(var(--duration) * 0.065ms);
}
.button.loading > div svg {
  -webkit-animation: svg calc(var(--duration) * 1ms) linear forwards calc(var(--duration) * 0.065ms);
  animation: svg calc(var(--duration) * 1ms) linear forwards calc(var(--duration) * 0.065ms);
}

@-webkit-keyframes text {
  10%,
  85% {
  -webkit-transform: translateY(-100%);
  transform: translateY(-100%);
  }
  95%,
  100% {
  -webkit-transform: translateY(-200%);
  transform: translateY(-200%);
  }
}

@keyframes text {
  10%,
  85% {
  -webkit-transform: translateY(-100%);
  transform: translateY(-100%);
  }
  95%,
  100% {
  -webkit-transform: translateY(-200%);
  transform: translateY(-200%);
  }
}
@-webkit-keyframes line {
  5%,
  10% {
  -webkit-transform: translateY(-30px);
  transform: translateY(-30px);
  }
  40% {
  -webkit-transform: translateY(-20px);
  transform: translateY(-20px);
  }
  65% {
  -webkit-transform: translateY(0);
  transform: translateY(0);
  }
  75%,
  100% {
  -webkit-transform: translateY(30px);
  transform: translateY(30px);
  }
}
@keyframes line {
  5%,
  10% {
  -webkit-transform: translateY(-30px);
  transform: translateY(-30px);
  }
  40% {
  -webkit-transform: translateY(-20px);
  transform: translateY(-20px);
  }
  65% {
  -webkit-transform: translateY(0);
  transform: translateY(0);
  }
  75%,
  100% {
  -webkit-transform: translateY(30px);
  transform: translateY(30px);
  }
}
@-webkit-keyframes svg {
  0%,
  20% {
  stroke-dasharray: 0;
  stroke-dashoffset: 0;
  }
  21%,
  89% {
  stroke-dasharray: 26px;
  stroke-dashoffset: 26px;
  stroke-width: 3px;
  margin: -10px 0 0 -10px;
  stroke: var(--checkmark);
  }
  100% {
  stroke-dasharray: 26px;
  stroke-dashoffset: 0;
  margin: -10px 0 0 -10px;
  stroke: var(--checkmark);
  }
  12% {
  opacity: 1;
  }
  20%,
  89% {
  opacity: 0;
  }
  90%,
  100% {
  opacity: 1;
  }
}
@keyframes svg {
  0%,
  20% {
  stroke-dasharray: 0;
  stroke-dashoffset: 0;
  }
  21%,
  89% {
  stroke-dasharray: 26px;
  stroke-dashoffset: 26px;
  stroke-width: 3px;
  margin: -10px 0 0 -10px;
  stroke: var(--checkmark);
  }
  100% {
  stroke-dasharray: 26px;
  stroke-dashoffset: 0;
  margin: -10px 0 0 -10px;
  stroke: var(--checkmark);
  }
  12% {
  opacity: 1;
  }
  20%,
  89% {
  opacity: 0;
  }
  90%,
  100% {
  opacity: 1;
  }
}
@-webkit-keyframes background {
  10% {
  -webkit-transform: scaleY(0);
  transform: scaleY(0);
  }
  40% {
  -webkit-transform: scaleY(0.15);
  transform: scaleY(0.15);
  }
  65% {
  -webkit-transform: scaleY(0.5);
  transform: scaleY(0.5);
  border-radius: 0 0 50% 50%;
  }
  75% {
  border-radius: 0 0 50% 50%;
  }
  90%,
  100% {
  border-radius: 0;
  }
  75%,
  100% {
  -webkit-transform: scaleY(1);
  transform: scaleY(1);
  }
}
@keyframes background {
  10% {
  -webkit-transform: scaleY(0);
  transform: scaleY(0);
  }
  40% {
  -webkit-transform: scaleY(0.15);
  transform: scaleY(0.15);
  }
  65% {
  -webkit-transform: scaleY(0.5);
  transform: scaleY(0.5);
  border-radius: 0 0 50% 50%;
  }
  75% {
  border-radius: 0 0 50% 50%;
  }
  90%,
  100% {
  border-radius: 0;
  }
  75%,
  100% {
  -webkit-transform: scaleY(1);
  transform: scaleY(1);
  }
}

И теперь нам остается вставить js-код перед закрывающим тегом </body> (внизу страницы).
Обратите внимание, что код написан для вставки в HTML документ, и имеет подключеную библиотеку TweenMax из репозитория CDNJS.
Код
<script src='https://cdnjs.cloudflare.com/ajax/libs/gsap/2.1.3/TweenMax.min.js'></script>
<script>$('.button').each(function(e) {

  let duration = 3000,
  btn = $(this),
  svg = btn.find('svg'),
  svgPath = new Proxy({
  y: null,
  smoothing: null
  }, {
  set(target, key, value) {
  target[key] = value;
  if(target.y !== null && target.smoothing !== null) {
  svg.html(getPath(target.y, target.smoothing, null))
  }
  return true;
  },
  get(target, key) {
  return target[key];
  }
  });

  btn.css('--duration', duration);

  svgPath.y = 20;
  svgPath.smoothing = 0;

  btn.on('click', e => {

  if(!btn.hasClass('loading')) {

  btn.addClass('loading');

  TweenMax.to(svgPath, duration * .065 / 1000, {
  smoothing: .3
  });

  TweenMax.to(svgPath, duration * .265 / 1000, {
  y: 12,
  ease: Elastic.easeOut.config(1.12, .4)
  }).delay(duration * .065 / 1000);

  setTimeout(() => {
  svg.html(getPath(0, 0, [
  [3, 14],
  [8, 19],
  [21, 6]
  ]));
  }, (duration / 2));

  }

  return false;

  });

});

function getPoint(point, i, a, smoothing) {
  let cp = (current, previous, next, reverse) => {
  let p = previous || current,
  n = next || current,
  o = {
  length: Math.sqrt(Math.pow(n[0] - p[0], 2) + Math.pow(n[1] - p[1], 2)),
  angle: Math.atan2(n[1] - p[1], n[0] - p[0])
  },
  angle = o.angle + (reverse ? Math.PI : 0),
  length = o.length * smoothing;
  return [current[0] + Math.cos(angle) * length, current[1] + Math.sin(angle) * length];
  },
  cps = cp(a[i - 1], a[i - 2], point, false),
  cpe = cp(point, a[i - 1], a[i + 1], true);
  return `C ${cps[0]},${cps[1]} ${cpe[0]},${cpe[1]} ${point[0]},${point[1]}`;
}

function getPath(update, smoothing, pointsNew) {
  let points = pointsNew ? pointsNew : [
  [4, 12],
  [12, update],
  [20, 12]
  ],
  d = points.reduce((acc, point, i, a) => i === 0 ? `M ${point[0]},${point[1]}` : `${acc} ${getPoint(point, i, a, smoothing)}`, '');
  return `<path d="${d}" />`;
}</script>

Не забывайте, что у вас должен быть подключен файл библиотеки jQuery
Вот и всё, вам остается только настроить всё под свои нужды.
Всем Успехов!!!
Добавлять комментарии могут только зарегистрированные пользователи.


Поделись с друзьями: