CSS: Анімація проти переходу


157

Отже, я розумію, як виконувати як переходи CSS3, так і анімації. Що не зрозуміло, і я гуглив, це коли використовувати.

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

Однак бувають випадки, коли зазначений ефект можна досягти будь-яким способом. Простим і поширеним прикладом може бути реалізація розсувного меню висувного ящика у стилі facebook:

Цей ефект може бути досягнутий шляхом таких переходів:

.sf-page {
    -webkit-transition: -webkit-transform .2s ease-out;
}

.sf-page.out {
    -webkit-transform: translateX(240px);
}

http://jsfiddle.net/NwEGz/

Або через такі анімації:

.sf-page {
    -webkit-animation-duration: .4s;
    -webkit-transition-timing-function: ease-out;
}

.sf-page.in {
    -webkit-animation-name: sf-slidein;
    -webkit-transform: translate3d(0, 0, 0);
}

.sf-page.out {
    -webkit-animation-name: sf-slideout;
    -webkit-transform: translateX(240px);
}

@-webkit-keyframes sf-slideout {
    from { -webkit-transform: translate3d(0, 0, 0); }
    to { -webkit-transform: translate3d(240px, 0, 0); }
}

@-webkit-keyframes sf-slidein {
    from { -webkit-transform: translate3d(240px, 0, 0); }
    to { -webkit-transform: translate3d(0, 0, 0); }
}

http://jsfiddle.net/4Z5Mr/

З HTML, який виглядає так:

<div class="sf-container">
    <div class="sf-page in" id="content-container">
        <button type="button">Click Me</button>
    </div>
    <div class="sf-drawer">
    </div>
</div>

І цей супровідний сценарій jQuery:

$("#content-container").click(function(){
    $("#content-container").toggleClass("out");
    // below is only required for css animation route
    $("#content-container").toggleClass("in");
});

Що я хотів би зрозуміти - це плюси і мінуси цих підходів.

  1. Одна очевидна відмінність полягає в тому, що анімація бере набагато більше коду.
  2. Анімація дає кращу гнучкість. У мене може бути різна анімація для висування та виходу
  3. Чи є щось, що можна сказати про продуктивність. Чи використовуєте обидва переваги прискорення в год / з?
  4. Що більш сучасне і шлях, який рухається вперед
  5. Що ще можна додати?

Відповіді:


211

Схоже, у вас є рішення про те, як їх робити, тільки не коли їх робити.

Перехід - це анімація , саме така, яка виконується між двома різними станами - тобто стартовим і кінцевим станом. Як і в меню ящика, стан запуску може бути відкритим, а кінцевий стан може бути закритим, або навпаки.

Якщо ви хочете виконати щось, що конкретно не включає стартовий стан і кінцевий стан, або вам потрібен більш тонкий контроль зерна над ключовими кадрами під час переходу, тоді вам доведеться використовувати анімацію.


7
Ознайомтеся з цією статтею також kirupa.com/html5/css3_animations_vs_transitions.htm , вона правильно вказує, що переходи - це шлях для здійснення взаємодій з javascript.
Скотт Юнгвірт

40

Я дозволю, щоб визначення говорили самі (згідно Меріам-Вебстер):

Перехід : рух, розвиток чи еволюція від однієї форми, стадії чи стилю до іншої

Анімація : Наділена життям або якостями життя; повний руху

Імена належним чином відповідають їх цілям у CSS

Отже, у прикладі, який ви подали, слід використовувати переходи, оскільки це лише зміна одного стану в інший


21

Коротка відповідь, прямо на пункті:

Перехід:

  1. Потрібен запускаючий елемент (: наведення курсора,: фокус тощо)
  2. Лише 2 стани анімації (початок і кінець)
  3. Використовується для більш простої анімації (кнопки, спадні меню тощо)
  4. Простіше створити, але не так багато можливостей для анімації / ефектів

Анімація @keyframes:

  1. Його можна використовувати для нескінченної анімації
  2. Може встановлювати більше 2 станів
  3. Меж немає

Обидва використовують прискорення процесора для набагато плавнішого ефекту.


Коли ви говорите "прискорення процесора", ви, можливо, мали на увазі "прискорення процесора"? Я вважаю, що анімація, що не перетворює макет, як "перекладати", отримує цю користь
jv-dev

12
  1. Анімація займає набагато більше коду, якщо ви не використовуєте один і той же перехід знову і знову, і в цьому випадку анімація буде краще.

  2. Ви можете мати різні ефекти для просування вперед і назад без анімації. Просто маєте різний перехід як на вихідне, так і на змінене правило:

    .two-transitions {
        transition: all 50ms linear;
    }
    
    .two-transitions:hover {
        transition: all 800ms ease-out;
    }
  3. Анімації - це лише абстракції переходів, тому якщо перехід апаратно прискориться, анімація буде. Це не має ніякої різниці.

  4. Обидва дуже сучасні.

  5. Моє правило - якщо я використовую один і той же перехід три рази, це, мабуть, має бути анімацією. Це легше підтримувати та змінювати в майбутньому. Але якщо ви використовуєте його лише один раз, то більше введіть анімацію і, можливо, не варто.


Слід також додати, що в анімації є ключові кадри, що дозволяють робити дуже складні та контрольовані прогресії, що дивно.
Полкпедерсон

3

Анімації саме це - плавне поведінка набору властивостей. Іншими словами, він визначає, що має статися з набором властивостей елемента. Ви визначаєте анімацію та описуєте, як повинен поводитися цей набір властивостей під час анімаційного процесу.

Переходи з іншого боку визначають, як властивість (або властивості) повинні виконувати їх зміни. Кожна зміна. Встановлення нового значення для певного властивості, будь то JavaScript або CSS, завжди є переходом, але за замовчуванням воно не є рівним. Встановивши transitionв стилі css, ви визначаєте різний (плавний) спосіб виконання цих змін.

Можна сказати, що переходи визначають анімацію за замовчуванням, яку слід виконувати щоразу, коли вказане властивість змінюється.


1
Я не згоден з цим визначенням, оскільки обидва вказують, як і що
Зак Сосьє,

3

Чи є щось, що можна сказати про продуктивність. Чи використовуєте обидва переваги прискорення в год / з?

В сучасних браузерах, ч / ш відбувається прискорення для властивостей filter, opacityі transform. Це стосується як CSS Animations, так і CSS-переходів.


1

.yourClass {
    transition: all 0.5s;
color: #00f;
margin: 50px;
font-size: 20px;
cursor: pointer;
}

.yourClass:hover {
    color: #f00;
}
<p class="yourClass"> Hover me </p>


-1

Я вірю, що перехід CSS3 анімація проти CSS3 дасть вам відповідь, яку ви хочете.

В основному нижче наведено кілька заходів:

  1. Якщо продуктивність викликає занепокоєння, виберіть CSS3 перехід.
  2. Якщо стан потрібно підтримувати після кожного переходу, виберіть CSS3 перехід.
  3. Якщо анімацію потрібно повторити, виберіть CSS3 анімацію. Тому що він підтримує анімацію-кількість ітерацій.
  4. Якщо потрібна складна анімація. Тоді перевага віддається анімації CSS3.

3
№2 та №3 не відповідають дійсності
Зах Сосьє,

1
Я не впевнений, наскільки №3 неправдивий? Це здається розумним моментом, і кількість анімації-ітерацій вважається дійсним властивістю: developer.mozilla.org/en-US/docs/Web/CSS/…

1
Дві речі з цього: 1) якщо перехід починається знову пізніше, він все ще є "повтором", навіть якщо це не відразу після першої ітерації. 2) ви можете мати перехід, який підробляє негайні повтори, залежно від анімації. Дивіться мою статтю CSS-трюки для отримання більш детальної інформації про те, що я маю на увазі.
Зах

-1

Не заважай собі, що краще. Моя відмова полягає в тому, що, якщо ви можете вирішити свою проблему лише одним або двома рядками коду, тоді просто зробіть це, а не писати купу кодів, що призведе до подібної поведінки. У будь-якому випадку перехід - це як підмножина анімації. Це просто означає, що перехід може вирішити певні проблеми, тоді як анімація може вирішити всі проблеми. Анімація дозволяє контролювати кожен етап, починаючи від 0% аж до 100%, що щось перехід реально не може зробити. Анімація вимагає, щоб ви написали купу кодів, тоді як при переході використовується один або два рядки коду для виконання того ж результату в залежності від того, над чим ви працюєте. З точки зору JavaScript найкраще використовувати перехід. Все, що передбачає лише дві фази, тобто початок та закінчення використання переходу. Підсумок, якщо це стрес

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.