6

Я пытаюсь добавить некоторую базовую анимацию CSS3. Цель состоит в том, чтобы переключить класс на событие нажатия кнопки и анимировать div на основе добавленного класса. Код отлично работает для первой итерации переключения в Firefox, но для других браузеров, таких как Chrome, и для следующей итерации в Firefox преобразование превращается в мгновение ока. Пожалуйста, помогите мне разобраться, что происходит.Комбинация анимации и перехода не работает должным образом

Отрывок:

$('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://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button type="button">Click Me!</button> 
 
<div></div>

я также подготовил скрипку here.

+0

Я использую Chrome на Ubuntu 15.04 и это, кажется, работает для меня. Если я нажму кнопку один раз, начнется анимация. Если я снова нажму кнопку, div вернется в исходное положение. Затем, если я снова нажму кнопку, анимация начнется снова и так далее и так далее. –

+0

Вам действительно нужна анимация? Движение может быть достигнуто даже без линейного движения. Я видел проблему перехода с 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

+0

@Mushtak: Я использую Windows 8.1, анимация работает только для Firefox, со следующей итерации анимация негладна, как я упоминал, а для Chrome/Opera проблема возникает на первой итерации. – Rivnat

ответ

5

Это своего рода известного поведения с 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>

4

Ожидаемое поведение. Вам нужно использовать две отдельные анимации или придерживаться только перехода.

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

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

Это способ оживить элемент с переходом:

$('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 { 
 
    top: 100px; 
 
    left: 100px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button type="button">Click Me!</button> 
 
<div></div>

+0

Извините, что помощник не заметил вашего ответа, прежде чем добавить свой ответ. +1 к вашему подходу, так как это также правильный способ его достижения. – Harry

+0

@ Харри нет проблем, спасибо за комментарий. – halfzebra

+0

@halfzebra: Спасибо за ваш ответ. Хотел бы я согласиться с ответами! – Rivnat

Смежные вопросы