jquery.smoove.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /*! jQuery Smoove v0.2.4 | (c) 2014 Adam Bouqdib | abemedia.co.uk/license */
  2. (function ($, window){
  3. $.fn.smoove = function (options){
  4. $.fn.smoove.init(this, $.extend({}, $.fn.smoove.defaults, options));
  5. };
  6. $.fn.smoove.items = [];
  7. $.fn.smoove.loaded = false;
  8. $.fn.smoove.defaults = {
  9. offset: 150,
  10. opacity: 0,
  11. transition: "all 1s ease, opacity 1.5s ease",
  12. transformStyle: 'preserve-3d',
  13. transformOrigin: false,
  14. perspective: 1000
  15. };
  16. $.fn.smoove.init = function (items, settings){
  17. // naughty way of avoiding vertical scrollbars when items slide in/out from the side
  18. if($('body').width() == $(window).width()) $('body').css('overflow-x','hidden');
  19. items.each(function() {
  20. $item = $(this);
  21. params = $item.params = $.extend({}, settings, $item.data());
  22. // css transition - if using transform add vendor prefixes
  23. params.transition = {
  24. WebkitTransition : params.transition.replace('transform','-webkit-transform'),
  25. MozTransition : params.transition.replace('transform','-moz-transform'),
  26. OTransition : params.transition.replace('transform','-o-transform'),
  27. transition : params.transition
  28. }
  29. $item.css(params.transition);
  30. $item.data('top', $item.offset().top);
  31. $.fn.smoove.items.push($item);
  32. });
  33. // function for adding vendor prefixes
  34. function crossBrowser(property, value) {
  35. function ucase(string) {
  36. return string.charAt(0).toUpperCase() + string.slice(1);
  37. }
  38. properties = {}
  39. properties['Webkit' + ucase(property)] = value,
  40. properties['Moz' + ucase(property)] = value,
  41. properties['Ms' + ucase(property)] = value,
  42. properties['O' + ucase(property)] = value,
  43. properties[property] = value
  44. return properties;
  45. }
  46. // add event handlers
  47. if(!$.fn.smoove.loaded) {
  48. $.fn.smoove.loaded = true;
  49. var didScroll = false,
  50. didResize = false,
  51. oldScroll = 0,
  52. oldHeight = $(window).height(),
  53. oldWidth = $(window).width(),
  54. oldDocHeight = $(document).height(),
  55. direction,
  56. resizing;
  57. $(window).resize(function() {
  58. clearTimeout(resizing);
  59. resizing = setTimeout(function() {
  60. var height = $(window).height(),
  61. width = $(window).width(),
  62. direction = (oldHeight > height) ? direction = 'up' : 'down',
  63. oldHeight = height;
  64. // responsive support - reassign position values on resize
  65. if(oldWidth !== width) {
  66. for(i in $.fn.smoove.items) {
  67. $.fn.smoove.items[i].css(crossBrowser('transform', '')).css(crossBrowser('transition', ''));
  68. }
  69. // wait for responsive magic to finish
  70. var stillResizing = self.setInterval(function() {
  71. var docHeight = $(document).height();
  72. if(docHeight == oldDocHeight) {
  73. window.clearInterval(stillResizing);
  74. for(i in $.fn.smoove.items) {
  75. $item = $.fn.smoove.items[i];
  76. $item.data('top', $item.offset().top);
  77. $item.css($item.params.transition);
  78. }
  79. smooveIt(direction);
  80. }
  81. oldDocHeight = docHeight;
  82. }, 500);
  83. }
  84. else smooveIt(direction);
  85. oldWidth = width;
  86. }, 500);
  87. });
  88. $(window).on('load', function() {
  89. smooveIt();
  90. })
  91. // throttle scroll handler
  92. .scroll(function() {
  93. didScroll = true;
  94. });
  95. setInterval(function() {
  96. if ( didScroll ) {
  97. didScroll = false;
  98. var scrolltop = $(window).scrollTop(),
  99. direction = (scrolltop < oldScroll) ? direction = 'up' : 'down';
  100. oldScroll = scrolltop;
  101. smooveIt(direction);
  102. }
  103. }, 250);
  104. }
  105. function smooveIt(direction) {
  106. for(i in $.fn.smoove.items) {
  107. var $item = $.fn.smoove.items[i],
  108. params = $item.params,
  109. // if direction isn't set, set offset to 0 to avoid hiding objects that are above the fold
  110. offset = (direction) ? params.offset : 0,
  111. itemtop = $(window).scrollTop() + $(window).height() - $item.data('top');
  112. if(itemtop < offset) {
  113. if(params.opacity !== false) $item.css({opacity: params.opacity});
  114. var transforms = [],
  115. properties = ['move','move3D','moveX','moveY','moveZ','rotate','rotate3d','rotateX','rotateY','rotateZ','scale','scale3d','scaleX','scaleY','skew','skewX','skewY'];
  116. for(i in properties) {
  117. if(typeof params[properties[i]] !== "undefined") transforms[properties[i]] = params[properties[i]];
  118. }
  119. transform = '';
  120. for(i in transforms) {
  121. transform += i.replace('move', 'translate') + '(' + transforms[i] + ') ';
  122. }
  123. console.log(crossBrowser('transform', transform));
  124. if(transform) {
  125. $item.css(crossBrowser('transform', transform));
  126. $item.parent().css(crossBrowser('perspective', params.perspective));
  127. //$item.parent().css(crossBrowser('transformStyle', params.transformstyle));
  128. if(params.transformOrigin) {
  129. $item.css(crossBrowser('transformOrigin', params.transformOrigin));
  130. }
  131. }
  132. }
  133. else {
  134. $item.css('opacity', 1).css(crossBrowser('transform', ''));
  135. }
  136. }
  137. }
  138. };
  139. }( jQuery, window ));