vue项目中订单完成提交按钮动画

1. 动画1
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <title>Order</title>
  <!-- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css" />
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:400,500,700&amp;display=swap" /> -->
  <style>
    :root {
      --primary: #275EFE;
      --primary-light: #7699FF;
      --dark: #1C212E;
      --grey-dark: #3F4656;
      --grey: #6C7486;
      --grey-light: #CDD9ED;
      --white: #FFF;
      --green: #16BF78;
      --sand: #DCB773;
      --sand-light: #EDD9A9;
    }

    .order {
      -webkit-appearance: none;
      -moz-appearance: none;
      appearance: none;
      border: 0;
      background: var(--dark);
      position: relative;
      height: 63px;
      width: 240px;
      padding: 0;
      outline: none;
      cursor: pointer;
      border-radius: 32px;
      -webkit-mask-image: -webkit-radial-gradient(white, black);
      -webkit-tap-highlight-color: transparent;
      overflow: hidden;
      transition: transform 0.3s ease;
    }

    .order span {
      --o: 1;
      position: absolute;
      left: 0;
      right: 0;
      text-align: center;
      top: 19px;
      line-height: 24px;
      color: var(--white);
      font-size: 16px;
      font-weight: 500;
      opacity: var(--o);
      transition: opacity 0.3s ease;
    }

    .order span.default {
      transition-delay: 0.3s;
    }

    .order span.success {
      --offset: 16px;
      --o: 0;
    }

    .order span.success svg {
      width: 12px;
      height: 10px;
      display: inline-block;
      vertical-align: top;
      fill: none;
      margin: 7px 0 0 4px;
      stroke: var(--green);
      stroke-width: 2;
      stroke-linecap: round;
      stroke-linejoin: round;
      stroke-dasharray: 16px;
      stroke-dashoffset: var(--offset);
      transition: stroke-dashoffset 0.3s ease;
    }

    .order:active {
      transform: scale(0.96);
    }

    .order .lines {
      opacity: 0;
      position: absolute;
      height: 3px;
      background: var(--white);
      border-radius: 2px;
      width: 6px;
      top: 30px;
      left: 100%;
      box-shadow: 15px 0 0 var(--white), 30px 0 0 var(--white), 45px 0 0 var(--white), 60px 0 0 var(--white), 75px 0 0 var(--white), 90px 0 0 var(--white), 105px 0 0 var(--white), 120px 0 0 var(--white), 135px 0 0 var(--white), 150px 0 0 var(--white), 165px 0 0 var(--white), 180px 0 0 var(--white), 195px 0 0 var(--white), 210px 0 0 var(--white), 225px 0 0 var(--white), 240px 0 0 var(--white), 255px 0 0 var(--white), 270px 0 0 var(--white), 285px 0 0 var(--white), 300px 0 0 var(--white), 315px 0 0 var(--white), 330px 0 0 var(--white);
    }

    .order .back,
    .order .box {
      --start: var(--white);
      --stop: var(--grey-light);
      border-radius: 2px;
      background: linear-gradient(var(--start), var(--stop));
      position: absolute;
    }

    .order .truck {
      width: 60px;
      height: 41px;
      left: 100%;
      z-index: 1;
      top: 11px;
      position: absolute;
      transform: translateX(24px);
    }

    .order .truck:before,
    .order .truck:after {
      --r: -90deg;
      content: "";
      height: 2px;
      width: 20px;
      right: 58px;
      position: absolute;
      display: block;
      background: var(--white);
      border-radius: 1px;
      transform-origin: 100% 50%;
      transform: rotate(var(--r));
    }

    .order .truck:before {
      top: 4px;
    }

    .order .truck:after {
      --r: 90deg;
      bottom: 4px;
    }

    .order .truck .back {
      left: 0;
      top: 0;
      width: 60px;
      height: 41px;
      z-index: 1;
    }

    .order .truck .front {
      overflow: hidden;
      position: absolute;
      border-radius: 2px 9px 9px 2px;
      width: 26px;
      height: 41px;
      left: 60px;
    }

    .order .truck .front:before,
    .order .truck .front:after {
      content: "";
      position: absolute;
      display: block;
    }

    .order .truck .front:before {
      height: 13px;
      width: 2px;
      left: 0;
      top: 14px;
      background: linear-gradient(var(--grey), var(--grey-dark));
    }

    .order .truck .front:after {
      border-radius: 2px 9px 9px 2px;
      background: var(--primary);
      width: 24px;
      height: 41px;
      right: 0;
    }

    .order .truck .front .window {
      overflow: hidden;
      border-radius: 2px 8px 8px 2px;
      background: var(--primary-light);
      transform: perspective(4px) rotateY(3deg);
      width: 22px;
      height: 41px;
      position: absolute;
      left: 2px;
      top: 0;
      z-index: 1;
      transform-origin: 0 50%;
    }

    .order .truck .front .window:before,
    .order .truck .front .window:after {
      content: "";
      position: absolute;
      right: 0;
    }

    .order .truck .front .window:before {
      top: 0;
      bottom: 0;
      width: 14px;
      background: var(--dark);
    }

    .order .truck .front .window:after {
      width: 14px;
      top: 7px;
      height: 4px;
      position: absolute;
      background: rgba(255, 255, 255, 0.14);
      transform: skewY(14deg);
      box-shadow: 0 7px 0 rgba(255, 255, 255, 0.14);
    }

    .order .truck .light {
      width: 3px;
      height: 8px;
      left: 83px;
      transform-origin: 100% 50%;
      position: absolute;
      border-radius: 2px;
      transform: scaleX(0.8);
      background: #f0dc5f;
    }

    .order .truck .light:before {
      content: "";
      height: 4px;
      width: 7px;
      opacity: 0;
      transform: perspective(2px) rotateY(-15deg) scaleX(0.94);
      position: absolute;
      transform-origin: 0 50%;
      left: 3px;
      top: 50%;
      margin-top: -2px;
      background: linear-gradient(90deg, #f0dc5f, rgba(240, 220, 95, 0.7), rgba(240, 220, 95, 0));
    }

    .order .truck .light.top {
      top: 4px;
    }

    .order .truck .light.bottom {
      bottom: 4px;
    }

    .order .box {
      --start: var(--sand-light);
      --stop: var(--sand);
      width: 21px;
      height: 21px;
      right: 100%;
      top: 21px;
    }

    .order .box:before,
    .order .box:after {
      content: "";
      top: 10px;
      position: absolute;
      left: 0;
      right: 0;
    }

    .order .box:before {
      height: 3px;
      margin-top: -1px;
      background: rgba(0, 0, 0, 0.1);
    }

    .order .box:after {
      height: 1px;
      background: rgba(0, 0, 0, 0.15);
    }

    .order.animate .default {
      --o: 0;
      transition-delay: 0s;
    }

    .order.animate .success {
      --offset: 0;
      --o: 1;
      transition-delay: 7s;
    }

    .order.animate .success svg {
      transition-delay: 7.3s;
    }

    .order.animate .truck {
      -webkit-animation: truck 10s ease forwards;
      animation: truck 10s ease forwards;
    }

    .order.animate .truck:before {
      -webkit-animation: door1 2.4s ease forwards 0.3s;
      animation: door1 2.4s ease forwards 0.3s;
    }

    .order.animate .truck:after {
      -webkit-animation: door2 2.4s ease forwards 0.6s;
      animation: door2 2.4s ease forwards 0.6s;
    }

    .order.animate .truck .light:before,
    .order.animate .truck .light:after {
      -webkit-animation: light 10s ease forwards;
      animation: light 10s ease forwards;
    }

    .order.animate .box {
      -webkit-animation: box 10s ease forwards;
      animation: box 10s ease forwards;
    }

    .order.animate .lines {
      -webkit-animation: lines 10s ease forwards;
      animation: lines 10s ease forwards;
    }

    @-webkit-keyframes truck {

      10%,
      30% {
        transform: translateX(-164px);
      }

      40% {
        transform: translateX(-104px);
      }

      60% {
        transform: translateX(-224px);
      }

      75%,
      100% {
        transform: translateX(24px);
      }
    }

    @keyframes truck {

      10%,
      30% {
        transform: translateX(-164px);
      }

      40% {
        transform: translateX(-104px);
      }

      60% {
        transform: translateX(-224px);
      }

      75%,
      100% {
        transform: translateX(24px);
      }
    }

    @-webkit-keyframes lines {

      0%,
      30% {
        opacity: 0;
        transform: scaleY(0.7) translateX(0);
      }

      35%,
      65% {
        opacity: 1;
      }

      70% {
        opacity: 0;
      }

      100% {
        transform: scaleY(0.7) translateX(-400px);
      }
    }

    @keyframes lines {

      0%,
      30% {
        opacity: 0;
        transform: scaleY(0.7) translateX(0);
      }

      35%,
      65% {
        opacity: 1;
      }

      70% {
        opacity: 0;
      }

      100% {
        transform: scaleY(0.7) translateX(-400px);
      }
    }

    @-webkit-keyframes light {

      0%,
      30% {
        opacity: 0;
        transform: perspective(2px) rotateY(-15deg) scaleX(0.88);
      }

      40%,
      100% {
        opacity: 1;
        transform: perspective(2px) rotateY(-15deg) scaleX(0.94);
      }
    }

    @keyframes light {

      0%,
      30% {
        opacity: 0;
        transform: perspective(2px) rotateY(-15deg) scaleX(0.88);
      }

      40%,
      100% {
        opacity: 1;
        transform: perspective(2px) rotateY(-15deg) scaleX(0.94);
      }
    }

    @-webkit-keyframes door1 {

      30%,
      50% {
        transform: rotate(32deg);
      }
    }

    @keyframes door1 {

      30%,
      50% {
        transform: rotate(32deg);
      }
    }

    @-webkit-keyframes door2 {

      30%,
      50% {
        transform: rotate(-32deg);
      }
    }

    @keyframes door2 {

      30%,
      50% {
        transform: rotate(-32deg);
      }
    }

    @-webkit-keyframes box {

      8%,
      10% {
        transform: translateX(40px);
        opacity: 1;
      }

      25% {
        transform: translateX(112px);
        opacity: 1;
      }

      26% {
        transform: translateX(112px);
        opacity: 0;
      }

      27%,
      100% {
        transform: translateX(0px);
        opacity: 0;
      }
    }

    @keyframes box {

      8%,
      10% {
        transform: translateX(40px);
        opacity: 1;
      }

      25% {
        transform: translateX(112px);
        opacity: 1;
      }

      26% {
        transform: translateX(112px);
        opacity: 0;
      }

      27%,
      100% {
        transform: translateX(0px);
        opacity: 0;
      }
    }

    html {
      box-sizing: border-box;
      -webkit-font-smoothing: antialiased;
    }

    * {
      box-sizing: inherit;
    }

    *:before,
    *:after {
      box-sizing: inherit;
    }

    body {
      min-height: 100vh;
      font-family: Roboto, Arial;
      display: flex;
      justify-content: center;
      align-items: center;
      background: #E4ECFA;
    }

    body .dribbble {
      position: fixed;
      display: block;
      right: 20px;
      bottom: 20px;
    }

    body .dribbble img {
      display: block;
      height: 28px;
    }
  </style>
</head>

<body>
  <!-- partial:index.partial.html -->
  <button class="order">
    <span class="default">确认订单</span><span class="success">订单已发送
      <svg viewbox="0 0 12 10">
        <polyline points="1.5 6 4.5 9 10.5 1"></polyline>
      </svg></span>
    <div class="box"></div>
    <div class="truck">
      <div class="back"></div>
      <div class="front">
        <div class="window"></div>
      </div>
      <div class="light top"></div>
      <div class="light bottom"></div>
    </div>
    <div class="lines"></div>
  </button>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script>
    $('.order').click(function (e) {
      let button = $(this);
      if (!button.hasClass('animate')) {
        button.addClass('animate');
        setTimeout(() => {
          button.removeClass('animate');
        }, 10000);
      }

    });
  </script>
</body>
</html>

在这里插入图片描述

动画2
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    .truck-button {
      --color: #fff;
      --background: #2B3044;
      --tick: #16BF78;
      --base: #0D0F18;
      --wheel: #2B3044;
      --wheel-inner: #646B8C;
      --wheel-dot: #fff;
      --back: #6D58FF;
      --back-inner: #362A89;
      --back-inner-shadow: #2D246B;
      --front: #A6ACCD;
      --front-shadow: #535A79;
      --front-light: #FFF8B1;
      --window: #2B3044;
      --window-shadow: #404660;
      --street: #646B8C;
      --street-fill: #404660;
      --box: #DCB97A;
      --box-shadow: #B89B66;
      padding: 12px 0;
      width: 172px;
      cursor: pointer;
      text-align: center;
      position: relative;
      border: none;
      outline: none;
      color: var(--color);
      background: var(--background);
      border-radius: var(--br, 5px);
      -webkit-appearance: none;
      -webkit-tap-highlight-color: transparent;
      transform-style: preserve-3d;
      transform: rotateX(var(--rx, 0deg)) translateZ(0);
      transition: transform 0.5s, border-radius 0.3s linear var(--br-d, 0s);
    }

    .truck-button:before,
    .truck-button:after {
      content: "";
      position: absolute;
      left: 0;
      top: 0;
      width: 100%;
      height: 6px;
      display: block;
      background: var(--b, var(--street));
      transform-origin: 0 100%;
      transform: rotateX(90deg) scaleX(var(--sy, 1));
    }

    .truck-button:after {
      --sy: var(--progress, 0);
      --b: var(--street-fill);
    }

    .truck-button .default,
    .truck-button .success {
      display: block;
      font-weight: 500;
      font-size: 14px;
      line-height: 24px;
      opacity: var(--o, 1);
      transition: opacity 0.3s;
    }

    .truck-button .success {
      --o: 0;
      position: absolute;
      top: 12px;
      left: 0;
      right: 0;
    }

    .truck-button .success svg {
      width: 12px;
      height: 10px;
      display: inline-block;
      vertical-align: top;
      fill: none;
      margin: 7px 0 0 4px;
      stroke: var(--tick);
      stroke-width: 2;
      stroke-linecap: round;
      stroke-linejoin: round;
      stroke-dasharray: 16px;
      stroke-dashoffset: var(--offset, 16px);
      transition: stroke-dashoffset 0.4s ease 0.45s;
    }

    .truck-button .truck {
      position: absolute;
      width: 72px;
      height: 28px;
      transform: rotateX(90deg) translate3d(var(--truck-x, 4px), calc(var(--truck-y-n, -26) * 1px), 12px);
    }

    .truck-button .truck:before,
    .truck-button .truck:after {
      content: "";
      position: absolute;
      bottom: -6px;
      left: var(--l, 18px);
      width: 10px;
      height: 10px;
      border-radius: 50%;
      z-index: 2;
      box-shadow: inset 0 0 0 2px var(--wheel), inset 0 0 0 4px var(--wheel-inner);
      background: var(--wheel-dot);
      transform: translateY(calc(var(--truck-y) * -1px)) translateZ(0);
    }

    .truck-button .truck:after {
      --l: 54px;
    }

    .truck-button .truck .wheel,
    .truck-button .truck .wheel:before {
      position: absolute;
      bottom: var(--b, -6px);
      left: var(--l, 6px);
      width: 10px;
      height: 10px;
      border-radius: 50%;
      background: var(--wheel);
      transform: translateZ(0);
    }

    .truck-button .truck .wheel {
      transform: translateY(calc(var(--truck-y) * -1px)) translateZ(0);
    }

    .truck-button .truck .wheel:before {
      --l: 35px;
      --b: 0;
      content: "";
    }

    .truck-button .truck .front,
    .truck-button .truck .back,
    .truck-button .truck .box {
      position: absolute;
    }

    .truck-button .truck .back {
      left: 0;
      bottom: 0;
      z-index: 1;
      width: 47px;
      height: 28px;
      border-radius: 1px 1px 0 0;
      background: linear-gradient(68deg, var(--back-inner) 0%, var(--back-inner) 22%, var(--back-inner-shadow) 22.1%, var(--back-inner-shadow) 100%);
    }

    .truck-button .truck .back:before,
    .truck-button .truck .back:after {
      content: "";
      position: absolute;
    }

    .truck-button .truck .back:before {
      left: 11px;
      top: 0;
      right: 0;
      bottom: 0;
      z-index: 2;
      border-radius: 0 1px 0 0;
      background: var(--back);
    }

    .truck-button .truck .back:after {
      border-radius: 1px;
      width: 73px;
      height: 2px;
      left: -1px;
      bottom: -2px;
      background: var(--base);
    }

    .truck-button .truck .front {
      left: 47px;
      bottom: -1px;
      height: 22px;
      width: 24px;
      -webkit-clip-path: polygon(55% 0, 72% 44%, 100% 58%, 100% 100%, 0 100%, 0 0);
      clip-path: polygon(55% 0, 72% 44%, 100% 58%, 100% 100%, 0 100%, 0 0);
      background: linear-gradient(84deg, var(--front-shadow) 0%, var(--front-shadow) 10%, var(--front) 12%, var(--front) 100%);
    }

    .truck-button .truck .front:before,
    .truck-button .truck .front:after {
      content: "";
      position: absolute;
    }

    .truck-button .truck .front:before {
      width: 7px;
      height: 8px;
      background: #fff;
      left: 7px;
      top: 2px;
      -webkit-clip-path: polygon(0 0, 60% 0%, 100% 100%, 0% 100%);
      clip-path: polygon(0 0, 60% 0%, 100% 100%, 0% 100%);
      background: linear-gradient(59deg, var(--window) 0%, var(--window) 57%, var(--window-shadow) 55%, var(--window-shadow) 100%);
    }

    .truck-button .truck .front:after {
      width: 3px;
      height: 2px;
      right: 0;
      bottom: 3px;
      background: var(--front-light);
    }

    .truck-button .truck .box {
      width: 13px;
      height: 13px;
      right: 56px;
      bottom: 0;
      z-index: 1;
      border-radius: 1px;
      overflow: hidden;
      transform: translate(calc(var(--box-x, -24) * 1px), calc(var(--box-y, -6) * 1px)) scale(var(--box-s, 0.5));
      opacity: var(--box-o, 0);
      background: linear-gradient(68deg, var(--box) 0%, var(--box) 50%, var(--box-shadow) 50.2%, var(--box-shadow) 100%);
      background-size: 250% 100%;
      background-position-x: calc(var(--bx, 0) * 1%);
    }

    .truck-button .truck .box:before,
    .truck-button .truck .box:after {
      content: "";
      position: absolute;
    }

    .truck-button .truck .box:before {
      content: "";
      background: rgba(255, 255, 255, 0.2);
      left: 0;
      right: 0;
      top: 6px;
      height: 1px;
    }

    .truck-button .truck .box:after {
      width: 6px;
      left: 100%;
      top: 0;
      bottom: 0;
      background: var(--back);
      transform: translateX(calc(var(--hx, 0) * 1px));
    }

    .truck-button.animation {
      --rx: -90deg;
      --br: 0;
    }

    .truck-button.animation .default {
      --o: 0;
    }

    .truck-button.animation.done {
      --rx: 0deg;
      --br: 5px;
      --br-d: .2s;
    }

    .truck-button.animation.done .success {
      --o: 1;
      --offset: 0;
    }

    html {
      box-sizing: border-box;
      -webkit-font-smoothing: antialiased;
    }

    * {
      box-sizing: inherit;
    }

    *:before,
    *:after {
      box-sizing: inherit;
    }

    body {
      min-height: 100vh;
      display: flex;
      font-family: "Inter UI", "Inter", Arial;
      justify-content: center;
      align-items: center;
      background: #000;
    }

    body .dribbble {
      position: fixed;
      display: block;
      right: 20px;
      bottom: 20px;
    }

    body .dribbble img {
      display: block;
      height: 28px;
    }

    body .twitter {
      position: fixed;
      display: block;
      right: 64px;
      bottom: 14px;
    }

    body .twitter svg {
      width: 32px;
      height: 32px;
      fill: #1da1f2;
    }
  </style>
</head>

<body>
  <!-- partial:index.partial.html -->
  <button class="truck-button">
    <span class="default">提交订单</span>
    <span class="success">
      订单完成
      <svg viewbox="0 0 12 10">
        <polyline points="1.5 6 4.5 9 10.5 1"></polyline>
      </svg>
    </span>
    <div class="truck">
      <div class="wheel"></div>
      <div class="back"></div>
      <div class="front"></div>
      <div class="box"></div>
    </div>
  </button>
  <script src='https://cdn.jsdelivr.net/npm/gsap@3.0.1/dist/gsap.min.js'></script>
  <script>
    document.querySelectorAll('.truck-button').forEach(button => {
      button.addEventListener('click', e => {
        e.preventDefault();
        let box = button.querySelector('.box'),
          truck = button.querySelector('.truck');

        if (!button.classList.contains('done')) {

          if (!button.classList.contains('animation')) {

            button.classList.add('animation');

            gsap.to(button, {
              '--box-s': 1,
              '--box-o': 1,
              duration: .3,
              delay: .5
            });

            gsap.to(box, {
              x: 0,
              duration: .4,
              delay: .7
            });

            gsap.to(button, {
              '--hx': -5,
              '--bx': 50,
              duration: .18,
              delay: .92
            });

            gsap.to(box, {
              y: 0,
              duration: .1,
              delay: 1.15
            });

            gsap.set(button, {
              '--truck-y': 0,
              '--truck-y-n': -26
            });

            gsap.to(button, {
              '--truck-y': 1,
              '--truck-y-n': -25,
              duration: .2,
              delay: 1.25,
              onComplete() {
                gsap.timeline({
                  onComplete() {
                    button.classList.add('done');
                  }
                }).to(truck, {
                  x: 0,
                  duration: .4
                }).to(truck, {
                  x: 40,
                  duration: 1
                }).to(truck, {
                  x: 20,
                  duration: .6
                }).to(truck, {
                  x: 96,
                  duration: .4
                });
                gsap.to(button, {
                  '--progress': 1,
                  duration: 2.4,
                  ease: "power2.in"
                });
              }
            });

          }

        } else {
          button.classList.remove('animation', 'done');
          gsap.set(truck, {
            x: 4
          });
          gsap.set(button, {
            '--progress': 0,
            '--hx': 0,
            '--bx': 0,
            '--box-s': .5,
            '--box-o': 0,
            '--truck-y': 0,
            '--truck-y-n': -26
          });
          gsap.set(box, {
            x: -24,
            y: -6
          });
        }

      });
    });
  </script>

</body>

</html>

在这里插入图片描述

动画3
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <link rel="stylesheet">
  <style>
    * {
      margin: 0;
      padding: 0;
      font-family: "Montserrat", sans-serif;
    }

    body {
      width: 100vw;
      height: 100vh;
      background-color: #000;
      display: flex;
      justify-content: center;
      align-items: center;
    }

    .place-order {
      width: 160px;
      height: 50px;
      border-radius: 10px;
      background-color: #2b59b5;
      position: relative;
      overflow: hidden;
      border: none;
      cursor: pointer;
    }

    .place-order .text {
      width: 100%;
      height: 100%;
      line-height: 50px;
      opacity: 0;
      color: #fff;
      font-weight: bold;
      font-size: 16px;
      position: absolute;
      top: 0;
      transition: all 0.2s;
      transform: translateY(20px);
    }

    .place-order:focus {
      outline: none;
    }

    .place-order .forklift {
      display: none;
      transform: scale(0.4);
      position: absolute;
      top: -2px;
      left: -65px;
      animation: 4s lift-moving infinite;
    }

    .place-order .forklift .upper {
      width: 34px;
      height: 20px;
      margin-bottom: 2px;
      border: 5px solid #ff7745;
      position: relative;
      border-radius: 10px 50px 10px 5px;
    }

    .place-order .forklift .upper:after {
      content: "";
      width: 30px;
      height: 50px;
      position: absolute;
      left: 170%;
      top: 12px;
      box-sizing: border-box;
      border-left: 5px solid #000;
      border-bottom: 6px solid #000;
      border-radius: 0 0 0 5px;
      transform-origin: center;
    }

    .place-order .forklift .lower {
      width: 60px;
      height: 30px;
      position: relative;
      background-color: #FF4500;
      border-radius: 5px 15px 10px 10px;
    }

    .place-order .forklift .lower:before,
    .place-order .forklift .lower:after {
      content: "";
      width: 20px;
      height: 20px;
      position: absolute;
      left: 0;
      bottom: -10px;
      border: 3px solid #2b59b5;
      border-radius: 50%;
      background-color: #000;
    }

    .place-order .forklift .lower:after {
      left: 36px;
    }

    .place-order .box {
      display: none;
      width: 50px;
      height: 50px;
      background-color: #ad8762;
      border-radius: 5px;
      position: absolute;
      top: 56px;
      left: 50px;
      transform: scale(0.4);
      animation: 4s box infinite;
    }

    .place-order .box:before,
    .place-order .box:after {
      content: "";
      width: 4px;
      height: 12px;
      left: 21px;
      background-color: #ffbf59;
      position: absolute;
    }

    .place-order .box:after {
      height: 10px;
      left: 25px;
    }

    .place-order--default .default {
      opacity: 1;
      transform: translateY(0);
    }

    .place-order--default .done {
      transform: translateY(20px);
    }

    .place-order--placing .forklift {
      display: block;
    }

    .place-order--placing .box {
      display: block;
    }

    .place-order--placing .default {
      transform: translateY(-20px);
    }

    .place-order--done .done {
      opacity: 1;
      transform: translateY(0);
    }

    .place-order--done .default {
      transform: translateY(-20px);
    }

    @keyframes lift-moving {
      0% {
        left: -65px;
      }

      50% {
        left: 20px;
      }

      60% {
        left: 15px;
      }

      100% {
        left: 200px;
      }
    }

    @keyframes box {
      0% {
        top: 56px;
      }

      20% {
        top: 6px;
        left: 50px;
      }

      50% {
        top: 6px;
        left: 50px;
      }

      60% {
        top: 6px;
        left: 45px;
      }

      100% {
        top: 6px;
        left: 230px;
      }
    }
  </style>
</head>

<body>
  <!-- partial:index.partial.html -->
  <button class="place-order place-order--default">
    <div class="default text">提交订单</div>
    <div class="forklift">
      <div class="upper"></div>
      <div class="lower"></div>
    </div>
    <div class="box animation"></div>
    <div class="done text">订单完成</div>
  </button>
  <!-- partial -->
  <script>
    const btn = document.querySelector(".place-order");
    btn.addEventListener("click", () => {
      btn.classList.remove("place-order--default");
      btn.classList.add("place-order--placing");
      setTimeout(() => {
        btn.classList.remove("place-order--placing");
        btn.classList.add("place-order--done");
      }, 4000);
      setTimeout(() => {
        btn.classList.remove("place-order--done");
        btn.classList.add("place-order--default");
      }, 6000);
    })
  </script>

</body>

</html>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/129052.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时序预测 | MATLAB实现WOA-CNN-LSTM-Attention时间序列预测(SE注意力机制)

时序预测 | MATLAB实现WOA-CNN-LSTM-Attention时间序列预测&#xff08;SE注意力机制&#xff09; 目录 时序预测 | MATLAB实现WOA-CNN-LSTM-Attention时间序列预测&#xff08;SE注意力机制&#xff09;预测效果基本描述模型描述程序设计参考资料 预测效果 基本描述 1.MATLAB实…

【C++】STL 标准模板库 ③ ( STL 容器简介 | STL 容器区别 | STL 容器分类 | 常用的 STL 容器 )

文章目录 一、STL 容器简介1、STL 容器区别2、STL 容器分类3、常用的 STL 容器 一、STL 容器简介 1、STL 容器区别 STL 容器 用于管理 一组 数据元素 , 不同类型的 STL 容器 的区别 主要是 节点 和 节点之间的关系模型 不同 ; 容器的内存空间是否连续 : 向量 vector 的内存空间…

微软宣布称Windows 再不会偷偷下载更新文件,真的吗?

导读时钟拨回到2015年&#xff0c;微软刚刚推出Windows 10操作系统时&#xff0c;一些Windows 7用户首次在线Update的升级文件大小居然高达6~8GB。这件事引发了大量的不满&#xff0c;一些按照流量计费和宽带不给力的用户怨言极为严重&#xff0c;其中德国用户把此事闹上了当地…

嵌入式中常见的显示屏接口有哪些?

显示屏接口一般有I2C、SPI、UART、RGB、LVDS、MIPI、EDP和DP等。下面简要总结一下。 01 中小屏接口I2C、SPI、UAR 一般3.5寸以下的小尺寸LCD屏&#xff0c;显示数据量比较少&#xff0c;普遍采用低速串口&#xff0c;如I2C、SPI、UART。 I2C&#xff1a; I2C总线是半双工&…

TCC分布式事务----以Hmily框架为例

插曲&#xff1a;RocketMQ的Half Message 先引入一个插曲&#xff0c;RocketMQ为什么要有Half Message 为什么不在本地事务提交之后&#xff0c;直接发一个commit消息不就行了&#xff0c;为什么还要先发一个可以撤回的、不能被消费的half message&#xff0c;再执行本地事务…

剑指JUC原理-18.同步协作

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

王道数据结构课后代码题p150 15.设有一棵满二叉树(所有结点值均不同),已知其先序序列为 pre,设计一个算法求其后序序列post。(c语言代码实现)

对一般二叉树&#xff0c;仅根据先序或后序序列&#xff0c;不能确定另一个遍历序列。但对满二叉树&#xff0c;任意一个结点的左、右子树均含有相等的结点数&#xff0c;同时&#xff0c;先序序列的第一个结点作为后序序列的最后个结点。 本题代码如下 void pretopost(char …

神奇工具!这7个软件让设计轻松起飞

作为一个设计小白&#xff0c;你还在问前辈们有没有好的设计软件吗&#xff1f;还是没地方问&#xff0c;只能去百度搜索&#xff1f;如果是这样&#xff0c;那么接下来的文章正好可以解决你的问题。本文将介绍7种常用的平面设计工具&#xff0c;每种平面设计工具都有自己的特点…

由于找不到msvcp140_1.dll无法继续执行代码怎么解决

msvcp140_1.dll是Microsoft Visual C库文件之一&#xff0c;丢失后可能导致程序无法正常运行。以下是一些关于解决msvcp140_1.dll丢失问题的方法以及丢失原因的介绍。 一、msvcp140_1.dll是什么&#xff1f; 作用&#xff1a;msvcp140_1.dll是Microsoft Visual C库文件&#…

JVS低代码表单自定义按钮的使用说明和操作示例

在普通的表单设计中&#xff0c;虽然自带的【提交】、【重置】、【取消】按钮可以满足基本操作需求&#xff0c;但在面对更多复杂的业务场景时&#xff0c;这些按钮的显示控制就显得有些力不从心。为了更好地满足用户在表单操作过程中的个性化需求&#xff0c;JVS低代码推出了表…

切换数据库的临时表空间为temp1 / 切换数据库的undo表空间为 undotbs01

目录 ​编辑 一、切换临时表空间 1、登录数据库 2、查询默认临时表空间 3、创建临时表空间temp1&#xff08;我们的目标表空间&#xff09; 4、修改默认temp表空间 5、查询用户默认临时表空间 6、命令总结&#xff1a; 二、切换数据库的undo表空间 1、查询默认undo表…

STM32——端口复用与重映射概述与配置(HAL库)

文章目录 前言一、什么是端口复用&#xff1f;什么是重映射&#xff1f;有什么区别&#xff1f;二、端口复用配置 前言 本篇文章介绍了在单片机开发过程中使用的端口复用与重映射。做自我学习的简单总结&#xff0c;不做权威使用&#xff0c;参考资料为正点原子STM32F1系列精英…

大话IEC104 规约

2. iec104 协议的帧结构 iec104 基于TCP/IP 传输&#xff0c;是一个应用层协议&#xff0c; 其帧结构被称为 APDU&#xff0c;APDU 一般由 APCI 和 ASDU组成。 2.1 APDU (Application Protocol Data Unit) APDU 被称为应用协议数据单元&#xff0c;也就是一个iec104 的协议帧…

【修车案例】一波形一案例(12)

故障车型&#xff1a;丰田CHR 故障现象&#xff1a;发动机异常抖动&#xff0c;尤其是在怠速时&#xff0c;诊断仪显示气缸3失火&#xff0c;先后更换过点火线圈、喷油嘴等&#xff0c;仍然没有修复。 示波器诊断&#xff1a;用示波器采集发动机怠速时气缸2、气缸3的压力波形。…

【Docker】Docker 网络

引言 Docker是一个开源的应用容器引擎&#xff0c;它允许开发者将应用及其依赖打包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器或Windows机器上&#xff0c;也可以实现虚拟化。Docker的主要优势之一是其网络功能&#xff0c;而网络功能的核心就是网络驱动…

浅析网络协议-HTTP协议

1.HTTP简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件, 图…

安卓手机搭建博客网站发布公网访问:Termux+Hexo结合内网穿透工具轻松实现

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…

史上最详细的测试用例写作规范

软件测试用例得出软件测试用例的内容&#xff0c;其次&#xff0c;按照软件测试写作方法&#xff0c;落实到文档中&#xff0c;两者是形式和内容的关系&#xff0c;好的测试用例不仅方便自己和别人查看&#xff0c;而且能帮助设计的时候考虑的更周。 一个好的测试用例必须包含…

windows下QZipReader和QZipWriter解压缩zip格式文件(只针对纯文件,递归目前暂不处理)

# 运行效果 ui设计文件 采用了网格布局,组件跟随窗口最大化最小化 # .pro项目文件 这段代码是一个项目文件(.pro文件)中的内容,用于配置一个Qt项目的构建和部署规则。它包含了一些指令和设置,用于指定项目中需要编译的源代码文件、头文件、UI表单文件以及项目所依赖的Qt…

docker-compose安装es以及ik分词同义词插件

目录 1 前言 2 集成利器Docker 2.1 Docker环境安装 2.1.1 环境检查 2.1.2 在线安装 2.1.3 离线安装 2.2 Docker-Compose的安装 2.2.1 概念简介 2.2.2 安装步骤 2.2.2.1 二进制文件安装 2.2.2.2 离线安装 2.2.2.3 yum安装 3 一键安装ES及Kibana 3.1 yml文件的编写…