index.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.isCssAnimationSupported = exports.default = void 0;
  7. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  8. var _Event = _interopRequireDefault(require("./Event"));
  9. var _componentClasses = _interopRequireDefault(require("../component-classes"));
  10. var _requestAnimationTimeout = require("../requestAnimationTimeout");
  11. var _env = require("../env");
  12. // https://github.com/yiminghe/css-animation 1.5.0
  13. var isCssAnimationSupported = _Event.default.endEvents.length !== 0;
  14. exports.isCssAnimationSupported = isCssAnimationSupported;
  15. var capitalPrefixes = ['Webkit', 'Moz', 'O',
  16. // ms is special .... !
  17. 'ms'];
  18. var prefixes = ['-webkit-', '-moz-', '-o-', 'ms-', ''];
  19. function getStyleProperty(node, name) {
  20. if (_env.inBrowser) return '';
  21. // old ff need null, https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle
  22. var style = window.getComputedStyle(node, null);
  23. var ret = '';
  24. for (var i = 0; i < prefixes.length; i++) {
  25. ret = style.getPropertyValue(prefixes[i] + name);
  26. if (ret) {
  27. break;
  28. }
  29. }
  30. return ret;
  31. }
  32. function fixBrowserByTimeout(node) {
  33. if (isCssAnimationSupported) {
  34. var transitionDelay = parseFloat(getStyleProperty(node, 'transition-delay')) || 0;
  35. var transitionDuration = parseFloat(getStyleProperty(node, 'transition-duration')) || 0;
  36. var animationDelay = parseFloat(getStyleProperty(node, 'animation-delay')) || 0;
  37. var animationDuration = parseFloat(getStyleProperty(node, 'animation-duration')) || 0;
  38. var time = Math.max(transitionDuration + transitionDelay, animationDuration + animationDelay);
  39. // sometimes, browser bug
  40. node.rcEndAnimTimeout = setTimeout(function () {
  41. node.rcEndAnimTimeout = null;
  42. if (node.rcEndListener) {
  43. node.rcEndListener();
  44. }
  45. }, time * 1000 + 200);
  46. }
  47. }
  48. function clearBrowserBugTimeout(node) {
  49. if (node.rcEndAnimTimeout) {
  50. clearTimeout(node.rcEndAnimTimeout);
  51. node.rcEndAnimTimeout = null;
  52. }
  53. }
  54. var cssAnimation = function cssAnimation(node, transitionName, endCallback) {
  55. var nameIsObj = (0, _typeof2.default)(transitionName) === 'object';
  56. var className = nameIsObj ? transitionName.name : transitionName;
  57. var activeClassName = nameIsObj ? transitionName.active : "".concat(transitionName, "-active");
  58. var end = endCallback;
  59. var start;
  60. var active;
  61. var nodeClasses = (0, _componentClasses.default)(node);
  62. if (endCallback && Object.prototype.toString.call(endCallback) === '[object Object]') {
  63. end = endCallback.end;
  64. start = endCallback.start;
  65. active = endCallback.active;
  66. }
  67. if (node.rcEndListener) {
  68. node.rcEndListener();
  69. }
  70. node.rcEndListener = function (e) {
  71. if (e && e.target !== node) {
  72. return;
  73. }
  74. if (node.rcAnimTimeout) {
  75. (0, _requestAnimationTimeout.cancelAnimationTimeout)(node.rcAnimTimeout);
  76. node.rcAnimTimeout = null;
  77. }
  78. clearBrowserBugTimeout(node);
  79. nodeClasses.remove(className);
  80. nodeClasses.remove(activeClassName);
  81. _Event.default.removeEndEventListener(node, node.rcEndListener);
  82. node.rcEndListener = null;
  83. // Usually this optional end is used for informing an owner of
  84. // a leave animation and telling it to remove the child.
  85. if (end) {
  86. end();
  87. }
  88. };
  89. _Event.default.addEndEventListener(node, node.rcEndListener);
  90. if (start) {
  91. start();
  92. }
  93. nodeClasses.add(className);
  94. node.rcAnimTimeout = (0, _requestAnimationTimeout.requestAnimationTimeout)(function () {
  95. node.rcAnimTimeout = null;
  96. nodeClasses.add(className);
  97. nodeClasses.add(activeClassName);
  98. if (active) {
  99. (0, _requestAnimationTimeout.requestAnimationTimeout)(active, 0);
  100. }
  101. fixBrowserByTimeout(node);
  102. // 30ms for firefox
  103. }, 30);
  104. return {
  105. stop: function stop() {
  106. if (node.rcEndListener) {
  107. node.rcEndListener();
  108. }
  109. }
  110. };
  111. };
  112. cssAnimation.style = function (node, style, callback) {
  113. if (node.rcEndListener) {
  114. node.rcEndListener();
  115. }
  116. node.rcEndListener = function (e) {
  117. if (e && e.target !== node) {
  118. return;
  119. }
  120. if (node.rcAnimTimeout) {
  121. (0, _requestAnimationTimeout.cancelAnimationTimeout)(node.rcAnimTimeout);
  122. node.rcAnimTimeout = null;
  123. }
  124. clearBrowserBugTimeout(node);
  125. _Event.default.removeEndEventListener(node, node.rcEndListener);
  126. node.rcEndListener = null;
  127. // Usually this optional callback is used for informing an owner of
  128. // a leave animation and telling it to remove the child.
  129. if (callback) {
  130. callback();
  131. }
  132. };
  133. _Event.default.addEndEventListener(node, node.rcEndListener);
  134. node.rcAnimTimeout = (0, _requestAnimationTimeout.requestAnimationTimeout)(function () {
  135. for (var s in style) {
  136. if (style.hasOwnProperty(s)) {
  137. node.style[s] = style[s];
  138. }
  139. }
  140. node.rcAnimTimeout = null;
  141. fixBrowserByTimeout(node);
  142. }, 0);
  143. };
  144. cssAnimation.setTransition = function (node, p, value) {
  145. var property = p;
  146. var v = value;
  147. if (value === undefined) {
  148. v = property;
  149. property = '';
  150. }
  151. property = property || '';
  152. capitalPrefixes.forEach(function (prefix) {
  153. node.style["".concat(prefix, "Transition").concat(property)] = v;
  154. });
  155. };
  156. cssAnimation.isCssAnimationSupported = isCssAnimationSupported;
  157. var _default = cssAnimation;
  158. exports.default = _default;