主要是是从JIE_JOE这里学习的一个可操控性很强的甩臂动画实现 先从他给的样例学习起吧

第一步

用AI矢量绘图软件将你需要的交互svg图形画出来,并且要将他们需要运动的图层之间分开,然后将每个图层分为单独的svg图片

第二步

结构好body

<body>
    <svg viewBox="0 0 550 799.7" class="venus">
      <image width="550" height="799.7" href="venus/venus body.svg" />
      <g class="venus_forearm">
        <image width="550" height="799.7" href="venus/venus forearm.svg" />
        <circle class="venus_circle" cx="214" cy="549.8" r="10.7" />
 
        <line class="venus_line" x1="234.8" y1="527.2" x2="362.5" y2="432.8" />
 
        <image
          width="550"
          height="799.7"
          class="venus_hand"
          href="venus/venus hand.svg"
        />
      </g>
    </svg>
  </body>

其中,每张svg中的viewbox就是svg的可视化区域,其大小就需要填上刚刚导出来的那张整体svg图片的大小

其用image标签(svg中的标签,不是html的标签)的href来分别导入需要运动的每张svg图片,每张的宽高都要和viewBox一样

设置完毕过后就开始用css来写动画了

第三步

学习了一下css当中的CSS animation属性

这里甩臂就用transform:rotate()属性,旋转嘛 效果如下:

示例代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=initial-scale=1.0" />
    <title>venus</title>
    <style>
      * {
        font-size: 2vmin;
        padding: 0;
        margin: 0;
      }
      body {
        display: flex;
        justify-content: center;
        align-items: center;
        width: 100%;
        height: 100vh;
        background-color: #171717;
      }
      .venus {
        position: absolute;
        width: 25rem;
        overflow: visible;
      }
      .venus_forearm {
        animation: venus_forearm 2s ease infinite;
        transform-origin: 159.7px 575.7px;
        transform: rotate(15deg);
        overflow: visible;
      }
      @keyframes venus_forearm {
        0% {
          transform: rotate(-10deg);
        }
        30% {
          transform: rotate(40deg);
        }
 
        100% {
          transform: rotate(-10deg);
        }
      }
      .venus_hand {
        animation:venus_hand 2s ease infinite;
        transform-origin: 395.9px 407.6px;
      }
      @keyframes venus_hand {
        0% {
          transform: rotate(-10deg);
        }
        30% {
          transform: rotate(40deg);
        }
 
        100% {
          transform: rotate(-10deg);
        }
      }
      .venus_circle {
        fill: #b20426;
        animation: venus_circle 2s ease infinite;
      }
 
      .venus_line {
        fill: none;
        stroke: #17f700;
        stroke-width: 10.6454;
        stroke-linecap: round;
        stroke-miterlimit: 10;
        stroke-dasharray: 100, 20;
        animation: venus_line 2s linear infinite;
      }
 
      @keyframes venus_line {
        0% {
          stroke-dashoffset: 0;
        }
        30% {
          stroke-dashoffset: -20;
        }
 
        100% {
          stroke-dashoffset: -120;
        }
      }
      @keyframes venus_circle {
        0% {
          fill: #17f700;
        }
        30% {
          fill: #b20426;
        }
 
        100% {
          fill: #17f700;
        }
      }
    </style>
  </head>
  <body>
    <svg viewBox="0 0 550 799.7" class="venus">
      <image width="550" height="799.7" href="venus/venus body.svg" />
      <g class="venus_forearm">
        <image width="550" height="799.7" href="venus/venus forearm.svg" />
        <circle class="venus_circle" cx="214" cy="549.8" r="10.7" />
 
        <line class="venus_line" x1="234.8" y1="527.2" x2="362.5" y2="432.8" />
 
        <image
          width="550"
          height="799.7"
          class="venus_hand"
          href="venus/venus hand.svg"
        />
      </g>
    </svg>
  </body>
</html>