Задержка анимации CSS в повторении

Недавно я обнаружил, как «правильно» использовать анимации CSS (ранее я отклонил их как неспособные создавать сложные последовательности, как вы могли бы в JavaScript). Итак, теперь я узнаю о них.

Для этого эффекта я стараюсь, чтобы gradleиентная «вспышка» охватывала элемент, похожий на прогресс. Аналогично влиянию на собственные индикаторы выполнения Windows Vista / 7.

@keyframes barshine { from {background-image:linear-gradient(120deg,rgba(255,255,255,0) -10%,rgba(255,255,255,0.25) -5%,rgba(255,255,255,0) 0%);} to {background-image:linear-gradient(120deg,rgba(255,255,255,0) 100%,rgba(255,255,255,0.25) 105%,rgba(255,255,255,0) 110%);} } .progbar { animation: barshine 1s 4s linear infinite; } 

Как вы можете видеть, я пытаюсь получить задержку в 4 секунды, за которой следует блеск, проходящий через 1 секунду, повторяющийся.

Однако кажется, что animation-delay применима только к первой итерации, после чего блеск просто продолжает размахивать.

Я «решил» этот вопрос следующим образом:

 @keyframes expbarshine { from {background-image:linear-gradient(120deg,rgba(255,255,255,0) -10%,rgba(255,255,255,0.25) -5%,rgba(255,255,255,0) 0%);} 80% {background-image:linear-gradient(120deg,rgba(255,255,255,0) -10%,rgba(255,255,255,0.25) -5%,rgba(255,255,255,0) 0%);} to {background-image:linear-gradient(120deg,rgba(255,255,255,0) 100%,rgba(255,255,255,0.25) 105%,rgba(255,255,255,0) 110%);} } .progbar { animation: barshine 5s linear infinite; } 

from и 80% точно такие же, что приводит к «задержке» 80% длины анимации.

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

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

Возможно ли, чтобы animation-delay применялась ко всем итерациям, а не только к первой?

У меня была аналогичная проблема и я использовал

 @-webkit-keyframes pan { 0%, 10% { -webkit-transform: translate3d( 0%, 0px, 0px); } 90%, 100% { -webkit-transform: translate3d(-50%, 0px, 0px); } } 

Бит раздражает, что вы должны подделывать свою продолжительность, чтобы учесть «задержки» с обоих концов.

minitech прав в том, что animation-delay указывает задержку до начала анимации и НЕ задержка между итерациями. Редактор проекта спецификации описывает это хорошо, и здесь обсуждалась эта функция, которую вы описываете здесь, которая предлагает эту функцию задержки итерации.

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

Объявляя положение деления факела position:absolute и overflow: hidden родительского div overflow: hidden , устанавливая 100-процентное состояние ключевого кадра больше, чем ширина индикатора выполнения, и играя с функцией времени кубического безье и значениями смещения слева, вы можете для эмуляции режима легкого ease-in-out или linear времени с «задержкой».

Было бы интересно написать меньше / scss mixin, чтобы точно рассчитать функцию смещения влево и времени, чтобы получить это точно, но сейчас у меня нет времени, чтобы играть с ним. Хотелось бы увидеть что-то подобное!

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

Демо: http://codepen.io/timothyasp/full/HlzGu

  
/* CSS */ @keyframes progress { from { width: 0px; } to { width: 600px; } } @keyframes barshine { 0% { left: -100px; } 100% { left: 1000px; } } .flare { animation-name: barshine; animation-duration: 3s; animation-direction: normal; animation-fill-mode: forwards; animation-timing-function: cubic-bezier(.14, .75, .2, 1.01); animation-iteration-count: infinite; left: 0; top: 0; height: 40px; width: 100px; position: absolute; background: -moz-radial-gradient(center, ellipse cover, rgba(255,255,255,0.69) 0%, rgba(255,255,255,0) 87%); /* FF3.6+ */ background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,rgba(255,255,255,0.69)), color-stop(87%,rgba(255,255,255,0))); /* Chrome,Safari4+ */ background: -webkit-radial-gradient(center, ellipse cover, rgba(255,255,255,0.69) 0%,rgba(255,255,255,0) 87%); /* Chrome10+,Safari5.1+ */ background: -o-radial-gradient(center, ellipse cover, rgba(255,255,255,0.69) 0%,rgba(255,255,255,0) 87%); /* Opera 12+ */ background: -ms-radial-gradient(center, ellipse cover, rgba(255,255,255,0.69) 0%,rgba(255,255,255,0) 87%); /* IE10+ */ background: radial-gradient(ellipse at center, rgba(255,255,255,0.69) 0%,rgba(255,255,255,0) 87%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#b0ffffff', endColorstr='#00ffffff',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ z-index: 10; } .progress { animation-name: progress; animation-duration: 10s; animation-delay: 1s; animation-timing-function: linear; animation-iteration-count: infinite; overflow: hidden; position:relative; z-index: 1; height: 100%; width: 100%; border-right: 1px solid #0f9116; background: #caf7ce; /* Old browsers */ background: -moz-linear-gradient(top, #caf7ce 0%, #caf7ce 18%, #3fe81e 45%, #2ab22a 96%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#caf7ce), color-stop(18%,#caf7ce), color-stop(45%,#3fe81e), color-stop(96%,#2ab22a)); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, #caf7ce 0%,#caf7ce 18%,#3fe81e 45%,#2ab22a 96%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #caf7ce 0%,#caf7ce 18%,#3fe81e 45%,#2ab22a 96%); /* Opera 11.10+ */ background: -ms-linear-gradient(top, #caf7ce 0%,#caf7ce 18%,#3fe81e 45%,#2ab22a 96%); /* IE10+ */ background: linear-gradient(to bottom, #caf7ce 0%,#caf7ce 18%,#3fe81e 45%,#2ab22a 96%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#caf7ce', endColorstr='#2ab22a',GradientType=0 ); /* IE6-9 */ } .progress:after { content: ""; width: 100%; height: 29px; right: 0; bottom: 0; position: absolute; z-index: 3; background: -moz-linear-gradient(left, rgba(202,247,206,0) 0%, rgba(42,178,42,1) 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(202,247,206,0)), color-stop(100%,rgba(42,178,42,1))); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(left, rgba(202,247,206,0) 0%,rgba(42,178,42,1) 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(left, rgba(202,247,206,0) 0%,rgba(42,178,42,1) 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(left, rgba(202,247,206,0) 0%,rgba(42,178,42,1) 100%); /* IE10+ */ background: linear-gradient(to right, rgba(202,247,206,0) 0%,rgba(42,178,42,1) 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00caf7ce', endColorstr='#2ab22a',GradientType=1 ); /* IE6-9 */ } .bar { margin-top: 30px; height: 40px; width: 600px; position: relative; border: 1px solid #777; border-radius: 3px; }

Это то, что вы должны делать. Он должен работать так, что у вас есть анимация за 1 секунду, а затем 4-секундная задержка между итерациями:

 @keyframes barshine { 0% { background-image:linear-gradient(120deg,rgba(255,255,255,0) 0%,rgba(255,255,255,0.25) -5%,rgba(255,255,255,0) 0%); } 20% { background-image:linear-gradient(120deg,rgba(255,255,255,0) 10%,rgba(255,255,255,0.25) 105%,rgba(255,255,255,0) 110%); } } .progbar { animation: barshine 5s 0s linear infinite; } 

Поэтому я много общался с этим, и вы можете сделать это, не будучи очень взломанным. Это самый простой способ установить задержку между итерациями анимации: 1. SUPER EASY и 2. просто требует немного логики. Посмотрите эту танцевальную анимацию, которую я сделал:

 .dance{ animation-name: dance; -webkit-animation-name: dance; animation-iteration-count: infinite; -webkit-animation-iteration-count: infinite; animation-duration: 2.5s; -webkit-animation-duration: 2.5s; -webkit-animation-delay: 2.5s; animation-delay: 2.5s; animation-timing-function: ease-in; -webkit-animation-timing-function: ease-in; } @keyframes dance { 0% { -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } 25% { -webkit-transform: rotate(-120deg); -moz-transform: rotate(-120deg); -o-transform: rotate(-120deg); -ms-transform: rotate(-120deg); transform: rotate(-120deg); } 50% { -webkit-transform: rotate(20deg); -moz-transform: rotate(20deg); -o-transform: rotate(20deg); -ms-transform: rotate(20deg); transform: rotate(20deg); } 100% { -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } } @-webkit-keyframes dance { 0% { -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } 20% { -webkit-transform: rotate(20deg); -moz-transform: rotate(20deg); -o-transform: rotate(20deg); -ms-transform: rotate(20deg); transform: rotate(20deg); } 40% { -webkit-transform: rotate(-120deg); -moz-transform: rotate(-120deg); -o-transform: rotate(-120deg); -ms-transform: rotate(-120deg); transform: rotate(-120deg); } 60% { -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } 80% { -webkit-transform: rotate(-120deg); -moz-transform: rotate(-120deg); -o-transform: rotate(-120deg); -ms-transform: rotate(-120deg); transform: rotate(-120deg); } 95% { -webkit-transform: rotate(20deg); -moz-transform: rotate(20deg); -o-transform: rotate(20deg); -ms-transform: rotate(20deg); transform: rotate(20deg); } } 

Я на самом деле приехал сюда, пытаясь понять, как задержать анимацию, когда я понял, что вы просто 1. продлеваете продолжительность анимации и набираете пропорцию времени для каждой анимации. Beore Я имел их каждый длительностью 0,5 секунды на общую продолжительность 2,5 секунды. Теперь позвольте сказать, что я хотел добавить задержку, равную общей длительности, поэтому задержка 2,5 секунды.

Время анимации составляет 2,5 секунды, а задержка – 2,5, поэтому вы изменяете продолжительность до 5 секунд. Однако, поскольку вы удвоили общую продолжительность, вам нужно уменьшить вдвое долю анимации. Проверьте последнее ниже. Это отлично сработало для меня.

 @-webkit-keyframes dance { 0% { -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } 10% { -webkit-transform: rotate(20deg); -moz-transform: rotate(20deg); -o-transform: rotate(20deg); -ms-transform: rotate(20deg); transform: rotate(20deg); } 20% { -webkit-transform: rotate(-120deg); -moz-transform: rotate(-120deg); -o-transform: rotate(-120deg); -ms-transform: rotate(-120deg); transform: rotate(-120deg); } 30% { -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } 40% { -webkit-transform: rotate(-120deg); -moz-transform: rotate(-120deg); -o-transform: rotate(-120deg); -ms-transform: rotate(-120deg); transform: rotate(-120deg); } 50% { -webkit-transform: rotate(0deg); -moz-transform: rotate(0deg); -o-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } } 

В сумме:

Это ваши расчеты, которые вы, вероятно, используете, чтобы выяснить, как изменить продолжительность анимации и% каждой части.

wish_duration = x

wish_duration = animation_part_duration1 + animation_part_duration2 + … (и так далее)

wish_delay = y

общая продолжительность = x + y

animation_part_duration1_actual = animation_part_duration1 * wish_duration / total_duration

Я бы предпочел написать немного JavaScript, чем сделать CSS менее управляемым.

Во-первых, примените только анимацию CSS при изменении атрибута данных:

 .progbar[data-animation="barshine"] { animation: barshine 1s linear; } 

Затем добавьте javascript для переключения анимации на половину суммы задержки.

 var progbar = document.querySelector('.progbar'); var on = false; setInterval(function () { progbar.setAttribute('data-animation', (on) ? 'barshine' : ''); on = !on; }, 3000); 

Или если вы не хотите, чтобы анимация запускалась при скрытой вкладке:

 var progbar = document.querySelector('.progbar'); var on = false; var update = function () { progbar.setAttribute('data-animation', (on) ? 'barshine' : ''); on = !on; setTimer(); }; var setTimer = function () { setTimeout(function () { requestAnimationFrame(update); }, 3000); }; setTimer(); 

Heres маленький fragment, который показывает то же самое в 75% случаев, затем он скользит. Эта повторяющаяся схема хорошо эмулирует задержку:

 @-webkit-keyframes slide { 0% {background-position: 0 0;} 25% {background-position: 0 0;} 50% {background-position: 0 0;} 75% {background-position: 0 0;} 100% {background-position: 13em 0;} } @-moz-keyframes slide { 0% {background-position: 0 0;} 25% {background-position: 0 0;} 50% {background-position: 0 0;} 75% {background-position: 0 0;} 100% {background-position: 13em 0;} } @keyframes slide { 0% {background-position: 0 0;} 25% {background-position: 0 0;} 50% {background-position: 0 0;} 75% {background-position: 0 0;} 100% {background-position: 13em 0;} } 

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

 @-webkit-keyframes barshine { 10% {background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#1e5799), color-stop(100%,#7db9e8)); } 60% {background: -webkit-linear-gradient(top, #7db9e8 0%,#d32a2d 100%);} } 

он будет оживлять от 10% до 60% и ждать до 40% больше. Так что 40% задерживается.

найти пример скрипки

Я сделал плакат на стене, который перемещается влево и вправо с интервалами. Для меня это работает:

 .div-animation { -webkit-animation: bounce 2000ms ease-out; -moz-animation: bounce 2000ms ease-out; -o-animation: bounce 2000ms ease-out; animation: bounce 2000ms ease-out infinite; -webkit-animation-delay: 2s; /* Chrome, Safari, Opera */ animation-delay: 2s; transform-origin: 55% 10%; } @-webkit-keyframes bounce { 0% { transform: rotate(0deg); } 3% { transform: rotate(1deg); } 6% { transform: rotate(2deg); } 9% { transform: rotate(3deg); } 12% { transform: rotate(2deg); } 15% { transform: rotate(1deg); } 18% { transform: rotate(0deg); } 21% { transform: rotate(-1deg); } 24% { transform: rotate(-2deg); } 27% { transform: rotate(-3deg); } 30% { transform: rotate(-2deg); } 33% { transform: rotate(-1deg); } 36% { transform: rotate(0deg); } 100% { transform: rotate(0deg); } } 
Interesting Posts

std :: thread pass by reference calls copy constructor

Чтение простого текстового файла

Вывод типа отражения на Java 8 Lambdas

onActivityResult С launchMode = “singleTask”?

Неинициализированная локальная переменная – самый быстрый генератор случайных чисел?

Кодировать и декодировать растровый объект в строке base64 в Android

Преобразование даты времени из часового пояса в часовой пояс в sql-сервере

ASP.NET Вызов WebMethod с jQuery AJAX «401 (несанкционированный)»

Как запустить дочерний процесс, который требует повышения и ожидания?

Программное обеспечение для отображения времени автономной работы ноутбука?

pattern.matcher () vs pattern.matches ()

Как создать пакетный файл Windows, который не отображает командную строку при выполнении?

Разрешенные символы в файлах cookie

Поведение на уровне angular.js – отключить глубокую привязку для определенных URL-адресов

Что гарантируется относительно размера указателя функции?

Давайте будем гением компьютера.