Цикл изображения анимации ключевого кадра css

Я создаю анимацию ключевого кадра css, в которой изображение будет выдвигаться, парковаться на минуту, а затем выдвигаться, когда вставляется следующее изображение, и это будет выполняться в `` бесконечном '' цикле (до тех пор, пока есть ' animate 'класс родительского элемента, который переключается с помощью js при прокрутке).

То, что у меня есть (https://jsfiddle.net/WhiskeyT/Lurkf4f6/), представляет две проблемы:

Во-первых, требуемые тайминги казались простыми - общая продолжительность анимации 3 секунды, продолжительность анимации изображений 1, 2 и 3 установлена ​​на 0, 3 с, 6 с, но, похоже, есть небольшая задержка или разрыв между выходящим изображением и входом. изображение, и я бы очень хотел его подтянуть. Несмотря на часы настройки, я не могу настроить ключевые кадры так, чтобы они были ближе к моей цели.

Вторая проблема более существенна и очевидна: 3 изображения анимируются, и по мере зацикливания анимации повторно загружается только 3-е изображение.

Любая помощь приветствуется.

Виски Т.

<div class = "slide" id = "slide-02">
    <div class = "image-rotator">
        <img src = "img1.jpg" alt = "img" />
        <img src = "img2.jpg" alt = "img" />
        <img src = "img3.jpg" alt = "img" />
    </div>
</div><!-- #slide-02 -->


.slide {
    width: 100%;
    height: 100vh;
    position: relative;
}


#slide-02 .image-rotator {
    position: relative;
    width: 50%;
    max-width: 450px;
    height: 100%;
    overflow: hidden;
}

#slide-02.animate .image-rotator img {
    position: absolute;
    top: 0;
    left: -450px; // I remain confused as to how init rule collides w/0% keyframe ;(
    width: 100%;
    height: 100%;
}

#slide-02.animate .image-rotator img:nth-child(1) { animation: imgRotator 3s ease-in-out infinite 0s; }
#slide-02.animate .image-rotator img:nth-child(2) { animation: imgRotator 3s ease-in-out infinite 3s; }
#slide-02.animate .image-rotator img:nth-child(3) { animation: imgRotator 3s ease-in-out infinite 6s; }

@keyframes imgRotator {
    0% {
        opacity: 0;
        left: 450px;
    }
    15%, 84% {
        opacity: 1;
        left: 0;
    }
    100% {
        opacity: 0;
        left: -450px;
    }
}
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в 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. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
4
0
2 453
2

Ответы 2

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

Вы можете уменьшить непрозрачность, и вы четко увидите, что происходит:

.slide {
   width: 100%;
   height: 80vh;
   position: relative;
}

#slide-02 .image-rotator {
   position: relative;
   max-width: 300px;
   height: 100%;
   overflow: hidden;
   border: 1px solid lime;
}

#slide-02.animate .image-rotator img {
   position: absolute;
   top: 0;
   left: -450px;
   width: 100%;
   height: 100%;
   overflow: hidden;
   border-radius: 3px;
}

#slide-02.animate .image-rotator img:nth-child(1) {
   animation: imgRotator 3s ease-in-out infinite 0s;
}

#slide-02.animate .image-rotator img:nth-child(2) {
   animation: imgRotator 3s ease-in-out infinite 3s;
}

#slide-02.animate .image-rotator img:nth-child(3) {
   animation: imgRotator 3s ease-in-out infinite 6s;
}

@keyframes imgRotator {
   0% {
      opacity: 0;
      left: 450px;
   }
   15%,
   84% {
      opacity:0.8;
      left: 0;
   }
   100% {
      opacity: 0;
      left: -450px;
   }
}
<div class = "slide animate" id = "slide-02">
   <div class = "image-rotator">
      <img src = "https://s22.postimg.cc/7hgn7691t/pexels-photo-39803.jpg" alt = "apple" />
      <img src = "https://s22.postimg.cc/d5mxy25oh/bananas-fruit-carbohydrates-sweet-38283.jpg" alt = "bananas" />
      <img src = "https://s22.postimg.cc/hrj26ejht/pexels-photo-109274.jpg" alt = "cherries" />
   </div>
</div>
<!-- #slide-02 -->

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

.slide {
   width: 100%;
   height: 80vh;
   position: relative;
}

#slide-02 .image-rotator {
   position: relative;
   max-width: 300px;
   height: 100%;
   overflow: hidden;
   border: 1px solid lime;
}

#slide-02.animate .image-rotator img {
   position: absolute;
   top: 0;
   left: -450px;
   width: 100%;
   height: 100%;
   overflow: hidden;
   border-radius: 3px;
}

#slide-02.animate .image-rotator img:nth-child(1) {
   animation: imgRotator 3s ease-in-out infinite 0s;
}

#slide-02.animate .image-rotator img:nth-child(2) {
   animation: imgRotator 3s ease-in-out infinite 1s;
}

#slide-02.animate .image-rotator img:nth-child(3) {
   animation: imgRotator 3s ease-in-out infinite 2s;
}

@keyframes imgRotator {
   0% {
      opacity: 0;
      left: 450px;
   }
   50%{
      opacity: 1;
      left: 0;
   }
}
<div class = "slide animate" id = "slide-02">
   <div class = "image-rotator">
      <img src = "https://s22.postimg.cc/7hgn7691t/pexels-photo-39803.jpg" alt = "apple" >
      <img src = "https://s22.postimg.cc/d5mxy25oh/bananas-fruit-carbohydrates-sweet-38283.jpg" alt = "bananas" >
      <img src = "https://s22.postimg.cc/hrj26ejht/pexels-photo-109274.jpg" alt = "cherries" >
   </div>
</div>

Спасибо за вашу помощь. Ваши предложения действительно решают проблему последовательности / цикла. Но при такой продолжительности / задержках изображения не останавливаются. Итак, я восстановил свои ключевые кадры (15% и т. д.) С отключенными временными интервалами, и в цикле снова образовался гигантский промежуток. Пытаясь предотвратить перекрытие, я использовал линейную синхронизацию, но со значениями ступенчатой ​​задержки результаты (jsfiddle.net/WhiskeyT/mw9ze8wq/1) все еще не получены. Любое понимание? Возможно, вы сможете подробнее рассказать, как к этому подойти, очень признательны

Whiskey T. 28.05.2018 03:30

@ WhiskeyT.Foxtrot ну, я бы сказал, что нет общих правил, но все зависит от того, что вы хотите ... первый совет, который я могу вам дать, - сделать анимацию как можно более простой, а затем, в зависимости от состояний анимации, убедитесь, что вы не используете не имеет перекрытия по основному. В вашей скрипке нет необходимости изменять анимацию, просто сохраните ее как ту, которую я вам показываю, вот обновленное: jsfiddle.net/mw9ze8wq/3

Temani Afif 28.05.2018 14:00

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

Whiskey T. 28.05.2018 17:15

Вы можете добавить паузу в @keyframes: не анимируйте ничего между 30% и 70%

Kokodoko 29.05.2018 09:48

Ваша проблема в основном связана с ключевыми кадрами.

Поскольку у вас трое детей, базовый промежуток времени составляет 1/3 = 33%.

Этот промежуток времени необходимо разделить на 2 этапа, один из которых двигается, а другой - неподвижен. сумма первого и второго должна составлять 33. Я установил 17 для шага перемещения, но это зависит от вас.

Результат:

.slide {
   width: 100%;
   height: 80vh;
   position: relative;
}

#slide-02 .image-rotator {
   position: relative;
   max-width: 300px;
   height: 100%;
   overflow: hidden;
   border: 1px solid lime;
}

#slide-02.animate .image-rotator img {
   position: absolute;
   top: 0;
   left: -450px;
   width: 100%;
   height: 100%;
   overflow: hidden;
   border-radius: 3px;
   animation: imgRotator 9s ease-in-out infinite;
}


#slide-02.animate .image-rotator img:nth-child(2) {
   animation-delay: -3s;
}

#slide-02.animate .image-rotator img:nth-child(3) {
   animation-delay: -6s;
}

@keyframes imgRotator {
   0% {
      opacity: 0;
      left: 450px;
   }
   17%, 33%{
      opacity: 1;
      left: 0;
   }
   50%, 100% {    /* 33 + 17 = 50 */
      opacity: 0;
      left: -450px;
   }
}
<div class = "slide animate" id = "slide-02">
   <div class = "image-rotator">
      <img src = "https://s22.postimg.cc/7hgn7691t/pexels-photo-39803.jpg" alt = "apple" >
      <img src = "https://s22.postimg.cc/d5mxy25oh/bananas-fruit-carbohydrates-sweet-38283.jpg" alt = "bananas" >
      <img src = "https://s22.postimg.cc/hrj26ejht/pexels-photo-109274.jpg" alt = "cherries" >
   </div>
</div>

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