CSS Animation-Iteration-Count путается с режимом Animation-fill-mode

Когда режим анимации-заполнения направлен вперед и используется Animation-Iteration-Count для повторения анимации, анимация сбрасывается после каждой итерации до последней, где, похоже, работает режим анимации-заполнения.

Я хотел анимировать перемещение элемента div вперед от 0 до 200 пикселей двумя движениями. Когда я создавал анимацию, она один раз переместилась на 100 пикселей, затем сбросилась на 0 пикселей, затем снова переместилась на 100 пикселей - в итоге она оказалась на 100 пикселей, а не на запланированных 200 пикселей. Я тестировал это на Firefox и Edge - ни один из них не работал. Я не смог найти никого с моей проблемой в Google.

Я собираюсь использовать эту анимацию для нескольких элементов, но хочу, чтобы некоторые из них перемещались вперед больше раз, чем другие. Я бы предпочел не использовать JS.

Прошу прощения за неточности в моем вопросе — я впервые использую stackoverflow.

div {
  width: 100px;
  height: 100px;
  background-color: red;
  animation: animation 2s 2 forwards;
}

@keyframes animation {
  0% {
    transform: translateX(0);
  }
  100% {
    transform: translateX(100px);
  }
}
<div></div>

Я опубликовал ответ, но понимаю, что вы можете захотеть, чтобы анимация достигла 100 пикселей, затем сбросилась до 0 пикселей и перешла на 200 пикселей?

Cédric 30.05.2024 16:06
Улучшение производительности загрузки с помощью 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 страниц, которые помогут...
0
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете удалить повторение в animation и изменить ключевой кадр:

div {
  width: 100px;
  height: 100px;
  background-color: red;
  animation: animation 2s forwards;
}

@keyframes animation {
  0% {
    transform: translateX(0);
  }
  50% {
    transform: translateX(100px);
  }
  100% {
    transform: translateX(200px);
  }
}
<div></div>

Я хотел иметь только одну анимацию для перехода от 0 до 100 пикселей, так как я буду использовать ее для нескольких разных элементов с разным количеством итераций. Есть ли какой-нибудь другой известный вам способ сделать это без сброса? Спасибо!

Sameer R 01.06.2024 18:56

Я бы посоветовал вам сделать 2 ключевых кадра.

Cédric 03.06.2024 09:34
Ответ принят как подходящий

Я нашел решение, используя JS. Проблема, по-видимому, не в прямом режиме анимации-заполнения, а в том, что анимация каждый раз сбрасывает преобразование. Если вместо этого вы используете скрипт для различной настройки преобразования на каждой итерации, а затем добавляете переходы, проблема решена.

div = document.querySelector("div");
console.info(div);
i = 1;
x = setInterval(() => {
  var transform = "translateX("+i*100+"px)";
  div.style.transform = transform;
  div.style.webkitTransform = transform;
  div.style.msTransform = transform;
  if (i==2) {
    clearInterval(x);
  }
  i++;
  console.info(div.style.transform);
}, 1500);
div {
  width:100px;
  height:100px;
  background-color:red;
  transition:transform 1s ease-in-out;
}
<div></div>

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