Как я могу приостановить CSS анимацию при наведении только между циклами? - PullRequest
0 голосов
/ 08 апреля 2020

Я создаю только CSS слайдер с текстовым содержимым.

Он основан на https://codepen.io/cassidoo/pen/MyaWzp

html,
body {
  font-family: 'Droid Serif', serif;
}

h1 {
  font-size: 60px;
  text-align: center;
}

.content-slider {
  width: 100%;
  height: 360px;
}

.slider {
  height: 320px;
  width: 680px;
  margin: 40px auto 0;
  overflow: visible;
  position: relative;
}

.mask {
  overflow: hidden;
  height: 320px;
}

.slider ul {
  margin: 0;
  padding: 0;
  position: relative;
}

.slider li {
  width: 680px;
  height: 320px;
  position: absolute;
  top: -325px;
  list-style: none;
}

.slider .quote {
  font-size: 40px;
  font-style: italic;
}

.slider .source {
  font-size: 20px;
  text-align: right;
}

.slider li.anim1 {
  animation: cycle 15s linear infinite;
}

.slider li.anim2 {
  animation: cycle2 15s linear infinite;
}

.slider li.anim3 {
  animation: cycle3 15s linear infinite;
}

.slider li.anim4 {
  animation: cycle4 15s linear infinite;
}

.slider li.anim5 {
  animation: cycle5 15s linear infinite;
}

.slider:hover li {
  animation-play-state: paused;
}

@keyframes cycle {
  0% {
    top: 0px;
  }
  4% {
    top: 0px;
  }
  16% {
    top: 0px;
    opacity: 1;
    z-index: 0;
  }
  20% {
    top: 325px;
    opacity: 0;
    z-index: 0;
  }
  21% {
    top: -325px;
    opacity: 0;
    z-index: -1;
  }
  50% {
    top: -325px;
    opacity: 0;
    z-index: -1;
  }
  92% {
    top: -325px;
    opacity: 0;
    z-index: 0;
  }
  96% {
    top: -325px;
    opacity: 0;
  }
  100% {
    top: 0px;
    opacity: 1;
  }
}

@keyframes cycle2 {
  0% {
    top: -325px;
    opacity: 0;
  }
  16% {
    top: -325px;
    opacity: 0;
  }
  20% {
    top: 0px;
    opacity: 1;
  }
  24% {
    top: 0px;
    opacity: 1;
  }
  36% {
    top: 0px;
    opacity: 1;
    z-index: 0;
  }
  40% {
    top: 325px;
    opacity: 0;
    z-index: 0;
  }
  41% {
    top: -325px;
    opacity: 0;
    z-index: -1;
  }
  100% {
    top: -325px;
    opacity: 0;
    z-index: -1;
  }
}

@keyframes cycle3 {
  0% {
    top: -325px;
    opacity: 0;
  }
  36% {
    top: -325px;
    opacity: 0;
  }
  40% {
    top: 0px;
    opacity: 1;
  }
  44% {
    top: 0px;
    opacity: 1;
  }
  56% {
    top: 0px;
    opacity: 1;
    z-index: 0;
  }
  60% {
    top: 325px;
    opacity: 0;
    z-index: 0;
  }
  61% {
    top: -325px;
    opacity: 0;
    z-index: -1;
  }
  100% {
    top: -325px;
    opacity: 0;
    z-index: -1;
  }
}

@keyframes cycle4 {
  0% {
    top: -325px;
    opacity: 0;
  }
  56% {
    top: -325px;
    opacity: 0;
  }
  60% {
    top: 0px;
    opacity: 1;
  }
  64% {
    top: 0px;
    opacity: 1;
  }
  76% {
    top: 0px;
    opacity: 1;
    z-index: 0;
  }
  80% {
    top: 325px;
    opacity: 0;
    z-index: 0;
  }
  81% {
    top: -325px;
    opacity: 0;
    z-index: -1;
  }
  100% {
    top: -325px;
    opacity: 0;
    z-index: -1;
  }
}

@keyframes cycle5 {
  0% {
    top: -325px;
    opacity: 0;
  }
  76% {
    top: -325px;
    opacity: 0;
  }
  80% {
    top: 0px;
    opacity: 1;
  }
  84% {
    top: 0px;
    opacity: 1;
  }
  96% {
    top: 0px;
    opacity: 1;
    z-index: 0;
  }
  100% {
    top: 325px;
    opacity: 0;
    z-index: 0;
  }
}
<h1>Pure CSS3 Text Carousel</h1>

<div class="content-slider">
  <div class="slider">
    <div class="mask">
      <ul>
        <li class="anim1">
          <div class="quote">Hello, this is a quote from a person.</div>
          <div class="source">- Person</div>
        </li>
        <li class="anim2">
          <div class="quote">Hello, this is a quote from another person.</div>
          <div class="source">- Another person</div>
        </li>
        <li class="anim3">
          <div class="quote">Hello, this is a quote from an animal.</div>
          <div class="source">- Animal</div>
        </li>
        <li class="anim4">
          <div class="quote">Hello, this is a quote from a plant.</div>
          <div class="source">- Plant</div>
        </li>
        <li class="anim5">
          <div class="quote">How do ya like that.</div>
          <div class="source">- Cassidy</div>
        </li>
      </ul>
    </div>
  </div>
</div>

Все работает нормально, но функция паузы при наведении останавливает анимацию в текущей позиции, которая может быть в середине цикла. Это правильное и очевидное поведение, но не идеальное для моего слайдера. На рисунке ниже показан цикл с паузой около 50%:

This image shows a CSS cycle paused at about 50%

Есть ли какой-нибудь способ довести активный цикл до конечного значения sh перед остановкой? Если нет, будет ли какой-то трюк для отключения событий указателя во время циклов?

ОБНОВЛЕНИЕ: У меня это работает сейчас в Chrome и Firefox, но Safari, похоже, не принимать события указателя в ключевых кадрах.

Я добавил фон, чтобы подтвердить синхронизацию для неактивных экземпляров. На самом деле я добавил дополнительный ключевой кадр для этого в div .slider и добавил пошаговый старт, чтобы удалить переход. Конечно, эта анимация также приостанавливается при наведении, иначе анимация будет работать асинхронно после наведения ползунка. https://jsfiddle.net/8f1senmt/

Кто-нибудь знает, почему Safari не играет вместе? Будет ли это просто ограничением или другой параметр все испортит?

1 Ответ

0 голосов
/ 09 апреля 2020

Я немного поиграл с вашим кодом, если вы добавите эти строки, он будет работать. Я добавил pointer-events: none к слайдеру. Только в указанных c кадрах будет установлено значение auto.

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

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

.slider {
  height: 320px;
  width: 680px;
  margin: 40px auto 0;
  overflow: visible;
  position: relative;
  pointer-events: none;
  animation: slidercycle 15s linear infinite;
}
.slider:hover{
  animation-play-state: paused;
}

@keyframes slidercycle {
  0% {
    pointer-events: none;
  }
  19% {
    pointer-events: auto;
    background-color: transparent;
  }
  20% {
    pointer-events: auto;
    background-color: red;
  }
  21% {
    pointer-events: none;
    background-color: transparent;
  }
  39%{
    pointer-events: none;
    background-color: transparent;
  }
  40% {
    pointer-events: auto;
    background-color: blue;
  }
  41% {
    pointer-events: none;
    background-color: transparent;
  }
  59%{
    pointer-events: none;
    background-color: transparent;
  }
  60% {
    pointer-events: auto;
    background-color: green;
  }
  61% {
    pointer-events: none;
    background-color: transparent;
  }
  79%{
    pointer-events: none;
    background-color: transparent;
  }
  80% {
    pointer-events: auto;
    background-color: yellow;
  }
  81% {
    pointer-events: none;
    background-color: transparent;
  }
  100%{
    pointer-events: none;
    background-color: transparent;
  }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...