This repository has been archived by the owner on Apr 24, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
detecting-css-animation-transition-end-with-javascript.html
79 lines (54 loc) · 4.43 KB
/
detecting-css-animation-transition-end-with-javascript.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<p>Это может быть полезно, если мы хотим выполнить какое-то действие по завершении эффекта. </p>
<p>Вот несколько случаев применения:</p>
<!--more-->
<ol>
<li>Анимация <code>display: none</code>.
<p> </p>
<div class="embeddedContent oembed-provider-vimeo" data-align="center" data-oembed="https://vimeo.com/131424355" data-oembed_provider="vimeo" data-resizetype="noresize" style="text-align:center"><iframe allowfullscreen="" frameborder="0" height="720" mozallowfullscreen="" src="https://player.vimeo.com/video/131424355" title="Switching Readerrr's modal boxes" webkitallowfullscreen="" width="980"></iframe></div>
<p> </p>
<p>Я использовал эту технику на <a href="http://readerrr.com/" target="_blank">Readerrr</a> для содержимого табов и в модальных окнах: новый контент в модальном окне показывается лишь после исчезновения старого.</p>
</li>
<li>Анимация исчезновения элемента
<p> </p>
<div class="embeddedContent oembed-provider-vimeo" data-align="center" data-oembed="https://vimeo.com/131424353" data-oembed_provider="vimeo" data-resizetype="noresize" style="text-align:center"><iframe allowfullscreen="" frameborder="0" height="720" mozallowfullscreen="" src="https://player.vimeo.com/video/131424353" title="Removing items from osvaldas.info shopping cart" webkitallowfullscreen="" width="980"></iframe></div>
<p> </p>
<p>После этого я удаляю элемент из DOM. Это реализовано в корзине <a href="http://osvaldas.info/shop" target="_blank">магазина</a>.</p>
</li>
</ol>
<h2>Проблема</h2>
<p>Возьмем случай с корзиной в качестве примера. Обычно я удаляю товар из корзины следующим образом:</p>
<pre>
<code class="language-javascript language-js">$('.item').addClass('disappear').on('webkitAnimationEnd mozAnimationEnd oAnimationEnd oanimationend animationend', function() {
$(this).remove();
});</code>
</pre>
<p>Проблема этого кода в том, что он некорректно "деградирует": callback не будет вызван в браузерах, которые не поддерживают CSS анимации (IE 9-). Также он не сработает, если по какой-то причине длительность анимации была установлена на 0 секунд.</p>
<p>Подводя итог скажем, что использовать этот код небезопасно.</p>
<h2>Решение</h2>
<p>Во избежании этих недостатков, вы можете использовать эти маленькие функции, которые я написал:</p>
<ul>
<li><code>onCSSAnimationEnd</code> - для анимаций;</li>
<li><code>onTransitionEnd</code> - для переходов;</li>
</ul>
<p>Использовать их просто:</p>
<pre>
<code class="language-javascript language-js">$('.item').addClass('disappear').onCSSAnimationEnd(function() {
$(this).remove();
});
</code>
</pre>
<p>А вот версия на чистом JavaScript:</p>
<pre>
<code class="language-javascript language-js">var item = document.querySelector('.item');
item.classList.add('disappear');
item.onCSSAnimationEnd(function() {
item.parentNode.removeChild(item);
});</code>
</pre>
<h2>Исходники</h2>
<ul>
<li><a href="http://osvaldas.info/examples/detecting-css-animation-transition-end-with-javascript/oncssanimationend.js" target="_blank">oncssanimationend.js</a>; без зависимостей (IE 9+);</li>
<li><a href="http://osvaldas.info/examples/detecting-css-animation-transition-end-with-javascript/jquery.oncssanimationend.js" target="_blank">jquery.oncssanimationend.js</a>; jQuery dependency (работает и с v1 и v2);</li>
</ul>
<h2>Демо</h2>
<p>Посмотреть в действии и пощупать можно на <a href="http://osvaldas.info/examples/detecting-css-animation-transition-end-with-javascript/">демо страничке</a></p>