CSS Animations - изменить свойство без перехода?

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

Вот пример:

@-webkit-keyframes slide-one-pager {
    0% { left: 0; }
    50% { left: 100px; }
    100% { left: 0; }
}

Итак, в этом примере свойство будет постепенно переходить от 0 до 100 и обратно в 0. Однако мне нужно избавиться от этого перехода, поэтому свойство остается равным 0 и достигает 100, как только он достигнет 50%. Это не работает, если я говорю влево: 0; на 49%, потому что все еще есть переход.

Еще один пример, немного отличный от моего первоначального вопроса, но если я найду решение для него, он будет также делать:

@-webkit-keyframes slide-one-pager {
    0% { display: none; }
    50% { display: block; }
        75% { display: block; }
    100% { display: none; }
}

Здесь я хочу показать элемент в течение определенного периода времени. Нет, использование непрозрачности не является опцией, потому что элемент все еще существует и по-прежнему доступен для клика, и мне нужен доступ к элементам ниже. К сожалению, свойство "display" не похоже на оживление. Если кто-нибудь может подумать о решении, как показать и спрятать элемент с анимацией (без перехода!), Я буду чрезвычайно благодарен.

Любые идеи?

Ответы

Ответ 1

Ну, так как никто не упомянул очевидное. Вы можете использовать step-start или step-end (графики) в своей конфигурации анимации, чтобы кривая будет действовать как "шаги" (не изогнутые), поэтому визуальный переход между кадрами не будет, поэтому анимация будет просто "прыгать" между кадрами.

Пример CSS:

animation:1s move infinite step-end;

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

DEMO

Ответ 2

Я искал то же, что и вы. Вы можете установить великолепные параметры в анимации под названием анимация-время-функция, что позволит вам установить совершенно и математически анимацию: с помощью значений кривой Безье или, если, как и я, вы не такой хороший математик, вызов параметра "step()". Например, ни одно сокращенное письмо:

.hiding {
      animation-name:slide-one-pager;
      animation-duration:2s;
      animation-timing-function:steps(1);
}

По умолчанию значение этого параметра равно 0, что означает отсутствие шагов. Вы можете узнать больше об этой интересной функции здесь: https://developer.mozilla.org/en-US/docs/Web/CSS/timing-function

И вот короткая нотация для вашей анимации:

.hiding {
      animation:slide-one-pager 2s steps(1);
}

Для меня он работает нормально, по крайней мере, на firefox 23.0.1.

Даже если я думаю, что вы решили проблему с одного года, возможно, могли бы помочь некоторым людям, как я, здесь:)

Ответ 3

Я сделал это, используя свойство -webkit-animation-fill-mode: forwards;, которое останавливает анимацию на 100%, не возвращая элемент в исходное состояние. Я составил скрипку с рабочим примером, вы можете проверить это здесь.

Хотя в скрипке вы можете найти лучший пример, я в основном сделал это (предполагая абсолютные позиционированные элементы):

.hiding {
    -webkit-animation: slide-one-pager 2s;
    -webkit-animation-fill-mode: forwards;
}

@-webkit-keyframes slide-one-pager {
    0%   { left: 0; }
    49%  { left: 0; }
    50%  { left: -100px; }
    100% { left: -100px; }
}​

Он просто перескакивает от 0 до -100 в середине перехода (49% → 50%, как вы предполагали): P) и остается там на 100%. Как сказано, при -webkit-animation-fill-mode: forwards; элемент останется таким же, как и 100%, не возвращаясь к исходному состоянию.

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

Ответ 4

Вы можете использовать это:

animation: typing 1s cubic-bezier(1,-1, 0, 2) infinite;