позиционирование SVG на основе анимации SVG - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь заставить подводную лодку (SVG) выглядеть так, как будто она плывет на вершине волны (также SVG).

Поскольку волна постоянно идет вверх и вниз, я хочу, чтобы подводная лодка центрировалась вертикально (x), но двигалась горизонтально над волной.

Это код дляволна

// best seen at 1500px or less

html, body { height: 100%; }
body {
  background:radial-gradient(ellipse at center, rgba(255,254,234,1) 0%, rgba(255,254,234,1) 35%, #B7E8EB 100%);
  overflow: hidden;
}

.ocean { 
  height: 5%;
  width:100%;
  position:absolute;
  bottom:0;
  left:0;
  background: #015871;
}

.wave {
  background: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/85486/wave.svg) repeat-x; 
  position: absolute;
  top: -198px;
  width: 6400px;
  height: 198px;
  animation: wave 7s cubic-bezier( 0.36, 0.45, 0.63, 0.53) infinite;
  transform: translate3d(0, 0, 0);
}

.wave:nth-of-type(2) {
  top: -175px;
  animation: wave 7s cubic-bezier( 0.36, 0.45, 0.63, 0.53) -.125s infinite, swell 7s ease -1.25s infinite;
  opacity: 1;
}

@keyframes wave {
  0% {
    margin-left: 0;
  }
  100% {
    margin-left: -1600px;
  }
}

@keyframes swell {
  0%, 100% {
    transform: translate3d(0,-25px,0);
  }
  50% {
    transform: translate3d(0,5px,0);
  }
}
<div class="ocean">
  <div class="wave"></div>
  <div class="wave"></div>
</div>

1 Ответ

0 голосов
/ 01 июня 2018

Я добавил класс 'sub' для форматирования изображения, а также для добавления анимации.Обратите внимание, что я добавил «замедление» в качестве функции синхронизации анимации, чтобы он быстро снижался, но увеличивался медленнее, чтобы не отставать от синхронизации волны.Но это также просто результат настройки параметров и «обновления» анимации как раз так, чтобы она работала в направлении, противоположном волне, в зависимости от того, как она начинается.Это один из способов сделать это, если вы хотите настроить высоту или замедление, просто измените секунды на замедление в классе «sub» или настройте количество пикселей в функции обновления.Надеюсь, это поможет!

// best seen at 1500px or less

   

 html, body { height: 100%; }
    body {
      background:radial-gradient(ellipse at center, rgba(255,254,234,1) 0%, rgba(255,254,234,1) 35%, #B7E8EB 100%);
      overflow: hidden;
    }


    .sub{
       position: absolute;
       top: 85%;
       left: 50%;
       width: 100px;
       height: 100px;
       margin-top: -100px; /* Start height margin */
       margin-left: -50px; /* Half the width */
       animation: updown 7s cubic-bezier(0.42, 0, 0.58, 1) infinite;
       animation-timing-function:ease-in-out;
       transform: translate3d(0, 0, 0);
     }

    .ocean { 
      height: 5%;
      width:100%;
      position:absolute;
      bottom:0;
      left:0;
      background: #015871;
    }

    .wave {
      background: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/85486/wave.svg) repeat-x; 
      position: absolute;
      top: -198px;
      width: 6400px;
      height: 198px;
      animation: wave 7s cubic-bezier(0.36, 0.48, 0.63, 0.53) infinite;
      transform: translate3d(0, 0, 0);
    }

    .wave:nth-of-type(2) {
      top: -175px;
      animation: wave 7s cubic-bezier( 0.36, 0.45, 0.63, 0.53) -.125s infinite, 
      swell 7s ease -1.25s infinite;
      opacity: 1;
    }

    @keyframes wave {
      0% {
        margin-left: 0;
      }
      100% {
        margin-left: -1600px;
      }
    }

    @keyframes swell {
      0%, 100% {
        transform: translate3d(0,-25px,0);
      }
      50% {
        transform: translate3d(0,5px,0);
      }
    }

        @keyframes updown {
      0%, 100% {
            transform: translate3d(0,-40px,0);
      }
      70% {
            transform: translate3d(0,45px,0);
      }
    }
<img class = "sub" src = "https://image.flaticon.com/icons/svg/447/447773.svg">
    <div class="ocean">
      <div class="wave"></div>
      <div class="wave"></div>
    </div>
...