Advertisement
Guest User

Untitled

a guest
Jun 30th, 2015
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.01 KB | None | 0 0
  1. /*jslint nomen: true, debug: true, evil: true, vars: true, browser: true,
  2. devel: true */
  3. /*global _, $ */
  4.  
  5.  
  6. var ElementOnView = function(options){
  7.  
  8. this.options = options;
  9. this.items = $(options.item_selector);
  10. this.window = $(window);
  11.  
  12. this.mostly_on_middle = options.mostly_on_middle;
  13. this.mostly_over_middle = options.mostly_over_middle;
  14. this.mostly_down_middle = options.mostly_down_middle;
  15.  
  16. window.addEventListener('scroll', _.bind(this.scrollMoves, this), false);
  17.  
  18. };
  19.  
  20. ElementOnView.prototype = {
  21.  
  22. scrollMoves: function(e){
  23.  
  24. /* filtra todos los items que se encuentran dentro de la vista */
  25. var on_view = _.filter(this.items, _.bind(this.isOnView, this));
  26.  
  27. if (on_view.length == 1) {
  28.  
  29. /* si solo un item se encuentra en la pantalla */
  30. this.mostly_on_middle(on_view[0]);
  31.  
  32. } else if (on_view) {
  33.  
  34. /* si mas de uno se encuentra en la pantalla */
  35. var on_middle = _.min(
  36. on_view,
  37. _.bind(this.on_middle, this)
  38. );
  39. this.mostly_on_middle(on_middle);
  40.  
  41. /* los elementos que se encuentran mas alejado del medio */
  42. off_middle = _.filter(
  43. on_view,
  44. function(elem){ return elem !== on_middle; }
  45. );
  46.  
  47.  
  48. if (this.isOverMiddle(off_middle[0])) {
  49.  
  50. /* si se encuentra lejos del medio y por encima de él */
  51. this.mostly_over_middle(off_middle[0]);
  52.  
  53. } else {
  54.  
  55. /* en caso contrario se encuentra debajo y el scroll esta
  56. * subiendo
  57. */
  58. this.mostly_down_middle(off_middle[0]);
  59. }
  60.  
  61. }
  62.  
  63. },
  64.  
  65. isOnView: function(elem){
  66.  
  67. /* todos los elementos que se encuentran dentro de la vista: lo que se
  68. * ve en la pantalla y lo que ya fue escroleado hacia la parte
  69. * superior
  70. */
  71.  
  72. var elem = $(elem);
  73. /* tope y fondo scrolleado */
  74. var viewTop = this.window.scrollTop();
  75. var viewBottom = viewTop + this.window.height();
  76. /* tope y fondo absoluto */
  77. var elemTop = elem.offset().top;
  78. var elemBottom = elemTop + elem.height();
  79. /* se encuentra o no en el rango visible de la pantalla */
  80. return (elemTop >= viewTop && elemTop <= viewBottom) ||
  81. (elemBottom >= viewTop && elemBottom <= viewBottom) ||
  82. (elemTop <= viewTop && elemBottom >= viewBottom);
  83.  
  84. },
  85.  
  86. isOverMiddle: function(elem){
  87.  
  88. var elem = $(elem);
  89. var middle = this.get_middle_view();
  90.  
  91. return middle > (elem.offset().top + elem.height());
  92.  
  93. },
  94.  
  95. get_middle_view: function(){
  96.  
  97. return this.window.scrollTop() + (this.window.height()/2);
  98. },
  99.  
  100. on_middle: function(elem){
  101.  
  102. var middle = this.get_middle_view();
  103. var elem = $(elem);
  104.  
  105. return _.min([
  106. Math.abs(middle - elem.offset().top),
  107. Math.abs(middle - (elem.offset().top + elem.height()))
  108. ]);
  109.  
  110. }
  111. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement