You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

246 lines
6.8 KiB

  1. /* ******************************
  2. Animation
  3. Author: Jack Lukic
  4. Notes: First Commit May 24, 2012
  5. A collection of FX/Animations
  6. ****************************** */
  7. ;(function ( $, window, document, undefined ) {
  8. // handles simplification of animation settings
  9. $.animationSettings = function(settings, duration, easing, complete) {
  10. // no parameters
  11. if(duration === undefined) {
  12. settings = settings;
  13. }
  14. // duration is actually settings object
  15. else if(typeof duration == 'object') {
  16. settings = $.extend({} , settings, duration);
  17. }
  18. // easing is actually complete callback
  19. else if(typeof easing == 'function') {
  20. settings = $.extend({} , settings, {
  21. duration: duration,
  22. complete: easing
  23. });
  24. }
  25. // easing is actually settings
  26. else if(typeof easing == 'object') {
  27. settings = $.extend(true, {} , settings, {duration: duration}, easing);
  28. }
  29. //
  30. else {
  31. settings = $.extend({} , settings, {
  32. duration : duration,
  33. easing : easing,
  34. complete : complete
  35. });
  36. }
  37. return settings;
  38. };
  39. /* ******************************
  40. Pop In -
  41. Animates one at a time
  42. scaling in
  43. ****************************** */
  44. $.fn.popIn = function(duration, easing, complete) {
  45. var
  46. settings = $.animationSettings($.fn.popIn.settings, duration, easing, complete),
  47. $this = $(this),
  48. totalElements = $this.size(),
  49. currentElement = 0,
  50. callback = function() {
  51. var
  52. elementsDoneAnimating = ($this.filter(':animated').size() == 0)
  53. ;
  54. currentElement++;
  55. $(this)
  56. .css('transform', '')
  57. .removeClass(settings.className.init)
  58. ;
  59. $.proxy(settings.eachComplete, this)();
  60. if(currentElement == totalElements) {
  61. $.proxy(settings.complete, $this)();
  62. }
  63. },
  64. animate = function(index) {
  65. $(this)
  66. .delay(settings.delay * index)
  67. .animate({
  68. opacity : settings.endOpacity,
  69. transform : 'scale('+ settings.endScale +')'
  70. }, settings.duration, settings.easing, callback)
  71. ;
  72. }
  73. ;
  74. if(settings.isLegacyBrowser) {
  75. $this
  76. .show()
  77. ;
  78. }
  79. else {
  80. $this
  81. .addClass(settings.className.init)
  82. .show()
  83. .css({
  84. opacity : settings.startOpacity,
  85. transform : 'scale('+ settings.startScale +')'
  86. })
  87. .each(animate)
  88. ;
  89. }
  90. return $(this);
  91. };
  92. $.fn.popOut = function(duration, easing, complete) {
  93. var
  94. parameters = $.animationSettings($.fn.popIn.settings, duration, easing, complete),
  95. // flip some defaults
  96. defaults = {
  97. complete: function() {
  98. $(this).hide();
  99. $.proxy(parameters.complete, this)();
  100. },
  101. startOpacity : parameters.endOpacity,
  102. endOpacity : 0,
  103. startScale : parameters.endScale,
  104. endScale : parameters.startScale
  105. },
  106. settings = $.extend(true, {}, parameters, defaults)
  107. ;
  108. $(this)
  109. .popIn(settings)
  110. ;
  111. };
  112. $.fn.popIn.settings = {
  113. // legacy browser
  114. isLegacyBrowser: false,
  115. // class given until animation ends
  116. className: {
  117. init : 'init'
  118. },
  119. // duration of each animation
  120. duration : 450,
  121. // easing for animation
  122. easing : 'easeOutExpo',
  123. // delay before each
  124. delay : 100,
  125. startOpacity : 0,
  126. endOpacity : 1,
  127. startScale : 0.7,
  128. endScale : 1,
  129. // called after each element completes
  130. eachComplete : function(){},
  131. // called after entire chain of animation completes
  132. complete : function(){}
  133. };
  134. $.fn.kenBurns = function(duration, easing, complete) {
  135. var
  136. settings = $.animationSettings($.fn.kenBurns.settings, duration, easing, complete),
  137. module = {
  138. randomPosition: function(starting, rangeMin, rangeMax) {
  139. var
  140. rangeMax = (rangeMax !== undefined)
  141. ? rangeMax
  142. : rangeMin,
  143. number = Math.random() * ((starting + rangeMax) - (starting - rangeMin) ) + (starting - rangeMin)
  144. ;
  145. return parseInt(number, 10);
  146. },
  147. animate: function() {
  148. var
  149. startingPosition = {},
  150. endingPosition = {},
  151. startingScale,
  152. endingScale
  153. ;
  154. startingPosition = (settings.useStartPosition)
  155. ? {
  156. x: parseInt( $(this).css('background-position-x'), 10),
  157. y: parseInt( $(this).css('background-position-y'), 10)
  158. }
  159. : {
  160. x: module.randomPosition(50, settings.xRange),
  161. y: module.randomPosition(50, settings.yRange)
  162. }
  163. ;
  164. // determine direction of animation based on origin position
  165. endingPosition.x = (startingPosition.x > 50)
  166. ? module.randomPosition(startingPosition.x, settings.xMaxTravelDistance, -settings.xMinTravelDistance)
  167. : module.randomPosition(startingPosition.x, -settings.xMinTravelDistance, settings.xMaxTravelDistance)
  168. ;
  169. endingPosition.y = (startingPosition.y > 50)
  170. ? module.randomPosition(startingPosition.y, settings.yMaxTravelDistance, -settings.yMinTravelDistance)
  171. : module.randomPosition(startingPosition.y, -settings.yMinTravelDistance, settings.yMaxTravelDistance)
  172. ;
  173. /*console.log(startingPosition.x + '% ' + startingPosition.y + '%');
  174. console.log(endingPosition.x + '% ' + endingPosition.y + '%');*/
  175. $(this)
  176. .css({
  177. backgroundPosition: startingPosition.x + '%',
  178. backgroundPositionY: startingPosition.y + '%'
  179. })
  180. .stop()
  181. .animate({
  182. backgroundPosition: endingPosition.x + '%',
  183. backgroundPositionY: endingPosition.y + '%'
  184. }, settings.duration, settings.easing, settings.complete)
  185. ;
  186. }
  187. }
  188. ;
  189. if(!settings.isLegacyBrowser) {
  190. $(this)
  191. .each(module.animate)
  192. ;
  193. }
  194. return $(this);
  195. };
  196. $.fn.kenBurns.settings = {
  197. // legacy browser
  198. isLegacyBrowser : false,
  199. // duration of animation
  200. duration : 10000,
  201. // easing for animation
  202. easing : 'linear',
  203. useStartPosition : false,
  204. xRange : 40,
  205. yRange : 20,
  206. xMinTravelDistance : 30,
  207. xMaxTravelDistance : 60,
  208. yMinTravelDistance : 20,
  209. yMaxTravelDistance : 40,
  210. // not yet implemented, need css hook for background-size
  211. scale : 0.1,
  212. // called after entire chain of animation completes
  213. complete : function(){}
  214. };
  215. })( jQuery, window , document );