CSS анимация не в 60FPS - PullRequest
       61

CSS анимация не в 60FPS

0 голосов
/ 05 марта 2019

Я читал несколько блогов о том, как добиться плавной CSS-анимации, например, здесь .

Я буквально пытаюсь добиться анимации в виде красного круга, как показано ниже:

enter image description here

Но анимация не такая плавная, как мне хочется.

Вот мой Jsfiddle

body,
html {
  width: 100vw;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}

.circle {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
}

.circle .first,
.circle .second {
  width: 2200px;
  height: 2200px;
  position: absolute;
}

.circle .first {
  animation: scale 2s cubic-bezier(0.5, 0.01, 0, 0.08) infinite;
  opacity: 0;
}

.circle .second {
  animation: scale-second 1s cubic-bezier(0.5, 0.01, 0, 0.08) infinite;
  animation-delay: 7s;
  opacity: 0
}

@keyframes scale {
  from {
    transform: scale(0);
    opacity: 1;
  }
  to {
    transform: scale(1.5);
    opacity: 1;
  }
}

@keyframes scale-second {
  from {
    transform: scale(0);
    opacity: 1;
  }
  to {
    transform: scale(1.2);
    opacity: 1;
  }
}
<body>
  <div class="circle">
    <svg class="first" viewBox="0 0 100 100" fill="#ff948d">
      <circle cx="50" cy="50" r="50"></circle>
    </svg>

    <svg class="second" viewBox="0 0 100 100" fill="white">
      <circle cx="50" cy="50" r="50"></circle>
    </svg>
  </div>
</body>

Вы можете видеть, что анимация не плавная, когда вы делаете экран полноразмерным.

1 Ответ

0 голосов
/ 05 марта 2019

Вместо этого вы можете рассмотреть CSS переходы преобразований. Они могут отображаться более плавно, поскольку браузеру не нужно вычислять кадры между указанными ключевыми кадрами.

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

document.body.onload = _ =>
  document.querySelectorAll('.circle').forEach(e => {
    e.classList.add('loaded')
  })


// handle the resize for this demo
document.body.onresize = _ => {
  console.log('Demo Resized - Resetting the Transition')
  // remove the class
  document.querySelectorAll('.circle').forEach(e => {
    e.classList.remove('loaded')
  })
  setTimeout(_ => {
    console.log('Transition Start');
    document.body.onload()
  }, 3000)
}
body,
html {
  width: 100vw;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}

.circle {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  width: 50px;
  height: 50px;
  position: absolute;
  transition: transform 1s cubic-bezier(0.5, 0.01, 0, 0.08), opacity 0s;
  -webkit-transition: transform 1s cubic-bezier(0.5, 0.01, 0, 0.08), opacity 0s;
  -moz-transition: transform 1s cubic-bezier(0.5, 0.01, 0, 0.08), opacity 0s;
  -o-transition: transform 1s cubic-bezier(0.5, 0.01, 0, 0.08), opacity 0s;
}

.circle.first {
  background: #ff948d;
}

.circle.second {
  transition-delay: 0.5s;
  background: white;
  opacity: 0;
}

.circle.loaded {
  transform: scale(100);
  -webkit-transform: scale(100);
  -moz-transform: scale(100);
  -o-transform: scale(100);
  -ms-transform: scale(100);
  opacity: 1;
}
<body>
  <div class="circle first"></div>
  <div class="circle second"></div>
</body>
...