CSS должен быть волновой подвесной мячом?

CSS

В последнее время появился спрос на проект компании по управлению виртуальной машиной на веб-странице. Давайте, я облазил несколько ям, прежде чем, наконец, внедрить в проект функцию виртуальной машины. Глядя на знакомое рабочее окно Linux, не останавливайте меня, дайте мне установить его на время *

Лидер был очень доволен, прочитав это, а затем сказал... Я вижу этот плавающий шар на компьютере, он должен быть у нас тоже.

? ? ? Что за черт? ? ? Я подошел к его компьютеру и обнаружил, что это плавающий шар показывает использование компьютера, WTF! ! Какой Linux вы видели с этим плавающим шаром? Почему бы тебе не позволить мне подарить тебе целого маленького Восходящего Льва, чтобы он танцевал для тебя рядом с ним? ? Забудь об этом, не говори этого, скажи, что это действительно позволяет мне делать то, что нужно делать. …

нужно

Требования очень просты: «Маленький шарик, подвешенный на верхнем слое страницы, имеет внутри волновую энергию, высота волны связана с использованием виртуальной машины, и мышь помещается на него для отображения. подробная информация, которая, вероятно, принадлежит тете Цзян.

Начало

окружающая обстановка

В проекте используется фреймворк vue, поэтому все демонстрации находятся в среде vue, но на самом деле код не имеет требований к среде.

Идеи дизайна

Когда я увидел это требование, моей первой мыслью было использовать холст для рисования плавающего мяча. Это не сложно. В Интернете много случаев. Могу ли я попробовать это с анимацией CSS позже? Производительность может быть и лучше, ведь страница с виртуалкой уже немного подвисла, и нужно какое-то улучшение производительности.

Основной принцип реализации состоит в том, чтобы использовать движущийся a для покрытия блока b, а затем сделать цвет a таким же, как цвет фона, что приводит к постоянным колебаниям края b.

1. Нарисуйте большой круг над маленьким кругом
<div class="container">
    <div class="wave"></div>
</div>

<style>
    .container {
        width: 100px;
        height: 100px;
        border-radius: 50%;
        border: 3px solid #67c23a;
        background: #ffffff;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        padding: 5px;
    }
    .wave {
        position: relative;
        width: 100px;
        height: 100px;
        background-image: linear-gradient(-180deg, #aaff80 13%, #67c23a 91%);
        border-radius: 50%;
    }
</style>

Тогда мы получили это

2. Нарисуйте маску и скрутите ее
<div class="container">
    <div class="wave"></div>
    <div class="wave-mask"></div>
</div>
<style>
.wave-mask {
    position: absolute;
    width: 200px;
    height: 200px;
    top: 0;
    left: 50%;
    border-radius: 40%;
    background-color: rgba(212, 24, 24, 0.9);
    transform: translate(-50%, -70%) rotate(0);
    animation: toRotate 10s linear -5s infinite;
    z-index: 20;
}
@keyframes toRotate {
  50% {
    transform: translate(-50%, -70%) rotate(180deg);
  }
  100% {
    transform: translate(-50%, -70%) rotate(360deg);
  }
}
</style>

Потом становится вот так (чтобы лучше видеть, простите, что использую большой красный)

3. Обрезать
.container {
  overflow: hidden;
}
.wave-mask {
  background-color: rgba(255, 255, 255, 0.9);
}

Готовый продукт - соус.

4. Идеально

На высоту волны полностью влияет свойство top волны-маски, поэтому для динамического изменения состояния плавающего шара вам нужно только рассчитать и затем соответствующим образом изменить значение top, а затем немного улучшить код кусочек.

<template>
  <div class="home">
    <div class="container" :class="{ warning: parseInt(usingRate) > 60, danger: parseInt(usingRate) > 80 }">
      <div class="wave"></div>
      <div class="wave-mask" :style="`top: ${40 - parseInt(usingRate)}px`"></div>
    </div>
    <div class="using-slider">
      <span>使用率:{{usingRate}} %</span>
      <el-slider v-model="usingRate"></el-slider>
    </div>
  </div>
</template>

<script>
export default {
  data () {
    return {
      usingRate: 0
    }
  }
}
</script>

<style lang="scss" scoped>
.container {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  border: 3px solid #67c23a;
  background: #ffffff;
  overflow: hidden;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  padding: 5px;
  .wave {
    position: relative;
    width: 100px;
    height: 100px;
    background-image: linear-gradient(-180deg, #aaff80 13%, #67c23a 91%);
    border-radius: 50%;
  }
  .wave-mask {
    position: absolute;
    width: 200px;
    height: 200px;
    top: 0;
    left: 50%;
    border-radius: 40%;
    background-color: rgba(255, 255, 255, 0.9);
    transform: translate(-50%, -70%) rotate(0);
    animation: toRotate 10s linear -5s infinite;
    z-index: 20;
  }
  &.warning {
    border: 3px solid #e6a23c;
    .wave {
      background-image: linear-gradient(-180deg, #f0c78a 13%, #e6a23c 91%);
    }
    &.danger {
      border: 3px solid #f56c6c;
      .wave {
        background-image: linear-gradient(-180deg, #f78989 13%, #f56c6c 91%);
      }
    }
  }
}
.using-slider {
  width: 400px;
  margin: 0 auto;
}

@keyframes toRotate {
  50% {
    transform: translate(-50%, -70%) rotate(180deg);
  }
  100% {
    transform: translate(-50%, -70%) rotate(360deg);
  }
}
</style>

увидеть эффект

Это, наверное, тетя Соус Я впервые пишу эссе Прошу прощения за плохой почерк Не говори, что я незакончен, потому что... Я собираюсь уйти с работы.