Это своего рода известного поведения с Chrome. Кажется, Firefox способен обрабатывать удаление анимации плавно с переходом, но Chrome этого не делает. Я видел это поведение раньше и в this thread.
Почему удаление анимации не работает с переходом в Chrome?
В то время как я не могу обеспечить 100% дурак доказательство объяснение того, почему это происходит, мы можем расшифровать его в какой-то степени на основе this HTML5Rocks article about Accelerated rendering in Chrome и this one about GPU accelerated compositing in Chrome.
Что-то похоже на то, что элемент получает свой собственный слой рендеринга, потому что на нем есть явное свойство позиции, установленное на нем. Когда слой (или его часть) становится недействительным из-за анимации, Chrome только перекраивает этот слой, на который влияет изменение. Когда вы открываете консоль разработчика Chrome, включите опцию «Показывать красящие объекты», вы увидите, что когда анимация происходит, Chrome только рисует фактический элемент, который становится анимированным.
Однако в начале и конце анимации происходит переименование всей страницы, которая немедленно возвращает элемент в исходное положение и тем самым отменяет поведение перехода.
$('button').click(function(){
$('div').toggleClass('clicked');
});
div{
background-color: #ccc;
height: 100px;
width: 100px;
transition-property: top, left;
transition-duration: 1s;
transition-timing-function: linear;
position: relative;
top: 0;
left: 0;
}
.clicked{
animation-name: clicked;
animation-duration: 1s;
animation-timing-function: linear;
animation-fill-mode: forwards;
}
@keyframes clicked{
0% {top: 0; left: 0;}
100% {top: 100px; left: 100px;}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button type="button">Click Me!</button>
<div></div>
Что такое решение?
Поскольку ваше движение на самом деле является линейным движением из одного положения в другое, вы можете достичь его без необходимости в анимации. Все, что нам нужно сделать, это использовать преобразование translate
и сдвинуть элемент на нужный номер. пикселей при включении класса. Поскольку существует переход, назначенный элементу через другой селектор, смещение произойдет линейным образом. Пока класс переключается, элемент возвращается в исходное положение снова линейным способом из-за перехода на элемент.
$('button').click(function() {
$('div').toggleClass('clicked');
});
div {
background-color: #ccc;
height: 100px;
width: 100px;
transition-property: transform;
transition-duration: 1s;
transition-timing-function: linear;
position: relative;
top: 0;
left: 0;
}
.clicked {
transform: translate(100px, 100px);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<button type="button">Click Me!</button>
<div></div>
Я использую Chrome на Ubuntu 15.04 и это, кажется, работает для меня. Если я нажму кнопку один раз, начнется анимация. Если я снова нажму кнопку, div вернется в исходное положение. Затем, если я снова нажму кнопку, анимация начнется снова и так далее и так далее. –
Вам действительно нужна анимация? Движение может быть достигнуто даже без линейного движения. Я видел проблему перехода с Chrome ранее. Вы можете обратиться к этой теме для некоторой связанной информации - http://stackoverflow.com/questions/31806649/how-to-run-the-css3-animation-to-the-end-if-the-selector-is-not -matching-больше/31833533 # 31833533 (Я связываю его только потому, что мы обнаружили, что переход не очень хорошо работает в Chrome при удалении анимации - это также упоминается в вопросе). – Harry
@Mushtak: Я использую Windows 8.1, анимация работает только для Firefox, со следующей итерации анимация негладна, как я упоминал, а для Chrome/Opera проблема возникает на первой итерации. – Rivnat