Элемент качается CSS

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

html,
body,
.container {
  height: 100%;
}

.container {
  display: flex;
  justify-content: center;
  align-items: center;
}

.heart {
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: red;
  transform: rotate(-45deg);
  transform-style: preserve-3d;
  animation: growMain 1s;
  animation-iteration-count: infinite;
  animation-direction: alternate;
}

.heart:after,
.heart:before {
  background-color: red;
  content: "";
  border-radius: 50%;
  position: absolute;
  transform: translateZ(-1px);
}

.heart:after {
  animation: growAfter 1s;
  animation-iteration-count: infinite;
  animation-direction: alternate;
}

.heart:before {
  animation: growBefore 1s;
  animation-iteration-count: infinite;
  animation-direction: alternate;
}

@keyframes growMain {
  from {
    width: 50px;
    height: 50px;
  }
  to {
    width: 80px;
    height: 80px;
  }
}

@keyframes growAfter {
  from {
    left: 25px;
    width: 50px;
    height: 50px;
  }
  to {
    left: 40px;
    width: 80px;
    height: 80px;
  }
}

@keyframes growBefore {
  from {
    top: -25px;
    width: 50px;
    height: 50px;
  }
  to {
    top: -40px;
    width: 80px;
    height: 80px;
  }
}

.inner {
  display: initial;
  transform: rotate(45deg);
}

.text {
  text-align: center;
  color: white;
  font-family: "Comic Sans MS";
  font-size: 100%;
  margin: 0;
}
<div class = "container">
  <div class = "heart">
    <div class = "inner">
      <p class = "text">Some text</p>
    </div>
  </div>
</div>

что проблема?

doğukan 15.12.2018 20:43

Он трясется как сумасшедший @DogukanCavus, по крайней мере, в Opera и Chrome, даже если я не написал этого в своем коде. Может, в других браузерах этого не происходит

Đumić Branislav 15.12.2018 20:58

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

David Thomas 15.12.2018 21:09
stackoverflow.com/questions/34762009/…
A. Meshu 15.12.2018 21:11

@DavidThomas. Я сделал именно это, но как я могу узнать, повторяется ли проблема и в вашем браузере. Как я уже сказал, сердце колышется, чуть-чуть, но это видно, а смотреть на него больно.

Đumić Branislav 15.12.2018 21:15

@ A.Meshu не совсем то, чем я хочу заниматься

Đumić Branislav 15.12.2018 21:16
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
6
279
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Анимация фактической ширины / высоты / положения, как правило, не очень хорошо работает, особенно при одновременном выполнении нескольких анимаций, как вы здесь. Перемещение / изменение размера элементов с помощью transform, как правило, работает лучше.

В этом случае я бы рекомендовал установить начальный размер вашего сердца, а затем использовать преобразование scale для создания эффекта пульса. При таком подходе вы также получаете дополнительное преимущество перехода от трех анимаций к одной, что проще для браузера, и вам не нужно беспокоиться о их синхронизации.

Чтобы текст не сжимался вместе с сердечком, вы можете обернуть его оберткой и расположить текст по центру обертки над сердечком. Тогда просто трансформируйте само сердце, а не обертку. (Или, если вы хотите, чтобы текст уменьшался вместе с сердцем, сохраните ту же структуру HTML, что и сейчас.)

html,
body,
.container {
  height: 100%;
}

.container {
  display: flex;
  justify-content: center;
  align-items: center;
}

.heart-wrapper {
  position: relative;
  width: 80px;
  height: 80px;
}

.heart {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100%;
  background-color: red;
  transform: rotate(-45deg) scale(1);
  transform-style: preserve-3d;
  animation: pulse 1s;
  animation-iteration-count: infinite;
  animation-direction: alternate;
}

.heart::before {
  left: 40px;
}
.heart::after {
  top: -40px;
}
.heart::after,
.heart::before {
  background-color: red;
  content: "";
  width: 80px;
  height: 80px;
  border-radius: 50%;
  position: absolute;
  transform: translateZ(-1px);
}

@keyframes pulse {
  from {
    transform: rotate(-45deg) scale(1);
  }
  to {
    transform: rotate(-45deg) scale(0.6);
  }
}

.text {
  position: absolute;
  top: 40%; /* slightly off-center to the top, so it appears centered when the heart shrinks */
  left: 50%;
  transform: translate(-50%, -50%);
  text-align: center;
  color: white;
  font-family: "Comic Sans MS";
  font-size: 100%;
  margin: 0;
}
<div class = "container">
  <div class = "heart-wrapper">
    <div class = "heart"></div>
    <div class = "text">some text</div>
  </div>
</div>

Спасибо, @ cjl750, за объяснение, почему происходит лаг и как его исправить, это то, что я искал!

Đumić Branislav 15.12.2018 23:09

Другие вопросы по теме